From 74896e5dddecccff9c7114d8b619327834d0952a Mon Sep 17 00:00:00 2001 From: dxin <1554389441@qq.com> Date: Thu, 9 Oct 2025 23:37:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../一、k8s 资源清单/1、什么是资源.conf | 13 ++ .../一、k8s 资源清单/2、资源清单的五大字段.conf | 160 ++++++++++++++++++ .../一、k8s 资源清单/3、pod的生命周期.conf | 6 + .../二、k8s pod 控制器/1、RC控制器.conf | 46 +++++ .../二、k8s pod 控制器/2、RS控制器.conf | 60 +++++++ .../二、k8s pod 控制器/3、deployment控制器.conf | 77 +++++++++ k8s知识笔记/常用命令.sh | 31 ++++ 虚拟机安装/一、机器准备.conf | 64 +++++++ .../三、安装Kubeadm, Kubelet, Kubectl.conf | 115 +++++++++++++ 虚拟机安装/二、安装容器运行时.conf | 81 +++++++++ 10 files changed, 653 insertions(+) create mode 100644 k8s知识笔记/一、k8s 资源清单/1、什么是资源.conf create mode 100644 k8s知识笔记/一、k8s 资源清单/2、资源清单的五大字段.conf create mode 100644 k8s知识笔记/一、k8s 资源清单/3、pod的生命周期.conf create mode 100644 k8s知识笔记/二、k8s pod 控制器/1、RC控制器.conf create mode 100644 k8s知识笔记/二、k8s pod 控制器/2、RS控制器.conf create mode 100644 k8s知识笔记/二、k8s pod 控制器/3、deployment控制器.conf create mode 100644 k8s知识笔记/常用命令.sh create mode 100644 虚拟机安装/一、机器准备.conf create mode 100644 虚拟机安装/三、安装Kubeadm, Kubelet, Kubectl.conf create mode 100644 虚拟机安装/二、安装容器运行时.conf diff --git a/k8s知识笔记/一、k8s 资源清单/1、什么是资源.conf b/k8s知识笔记/一、k8s 资源清单/1、什么是资源.conf new file mode 100644 index 0000000..343ae66 --- /dev/null +++ b/k8s知识笔记/一、k8s 资源清单/1、什么是资源.conf @@ -0,0 +1,13 @@ +一、常见的资源类型分类 + +1.1 名称空间级别 + * 工作负载型资源: Pod、Deployment、ReplicaSet、DaemonSet、Job、CronJob + * 服务发现及负载均衡型资源: Service、Ingress + * 配置及存储型资源: Volume、CSI + * 特殊类型的存储卷: ConfigMap、Secret、PersistentVolumeClaim + +1.2 集群级资源 + Namespace、Node、PersistentVolume、ClusterRole、ClusterRoleBinding、CustomResourceDefinition + +1.3 元数据型资源 + HPA、PodTemplate、LimitRange \ No newline at end of file diff --git a/k8s知识笔记/一、k8s 资源清单/2、资源清单的五大字段.conf b/k8s知识笔记/一、k8s 资源清单/2、资源清单的五大字段.conf new file mode 100644 index 0000000..29a8070 --- /dev/null +++ b/k8s知识笔记/一、k8s 资源清单/2、资源清单的五大字段.conf @@ -0,0 +1,160 @@ +一、资源清单-结构 + + 五大对象字段: + 1. apiVersion [接口组/版本] + 2. kind [资源类型] + 3. metadata [元数据] + 4. spec [规格/期望] + 5. status [状态] + +1.1 [接口组/版本] group/apiVersion + * 例子: apiVersion: v1 # pod + apiVersion: apps/v1 # deployment + apiVersion: batch/v1 # job + apiVersion: networking.k8s.io/v1 # ingress + apiVersion: rbac.authorization.k8s.io/v1 # rbac + + 常见命令: + 1、查看集群api版本命令: kubectl api-versions + + root@k8s-master:~# kubectl api-versions + admissionregistration.k8s.io/v1 + apiextensions.k8s.io/v1 + apiregistration.k8s.io/v1 + apps/v1 + authentication.k8s.io/v1 + authorization.k8s.io/v1 + autoscaling/v1 + autoscaling/v2 + batch/v1 + certificates.k8s.io/v1 + coordination.k8s.io/v1 + crd.projectcalico.org/v1 + discovery.k8s.io/v1 + events.k8s.io/v1 + flowcontrol.apiserver.k8s.io/v1 + networking.k8s.io/v1 + node.k8s.io/v1 + policy/v1 + rbac.authorization.k8s.io/v1 + resource.k8s.io/v1 + scheduling.k8s.io/v1 + storage.k8s.io/v1 + v1 + + [注意事项]: + 1. group为空时, 直接使用v1表示 + 2. group和version之间用/分隔 + 3. v1表示默认的版本, 即 core/v1 + + 2、查看某个资源的api解释命令: kubectl explain <资源类型> [Deployment、ReplicaSet、DaemonSet、Job、CronJob] + 例子: kubectl explain Pod + +1.2 [资源类型] kind: List + * 例子: kind: Pod + kind: Deployment + kind: Service + kind: Ingress + kind: ConfigMap + kind: Secret + kind: PersistentVolumeClaim + kind: Namespace + kind: Node + kind: PersistentVolume + kind: ClusterRole + kind: ClusterRoleBinding + kind: CustomResourceDefinition + kind: HPA + kind: PodTemplate + kind: LimitRange + +1.3 [元数据] metadata: + * 例子: metadata: + name: my-pod + namespace: default + labels: + app: my-app + annotations: + description: "This is my pod" + +1.4 [规格/期望] spec: + * 例子: + spec: + containers: + - name: my-container + image: nginx:latest + ports: + - containerPort: 80 + replicas: 3 + selector: + matchLabels: + app: my-app + volumeMounts: + - name: my-volume + mountPath: /data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: my-pvc + +1.5 [状态] status: # 初次自定义时, 一般不写该字段, 由系统自动生成和维护 + * 例子: + status: + coordinations: + leaseDurationSeconds: 15 + renewTime: "2023-10-01T12:00:00Z" + + + +# ======================================================================= + + + +二、pod 资源清单示例: +# 1. 创建一个名为 my-pod 的 Pod,包含两个容器 第一个容器使用 nginx 镜像,监听 80 端口, 第二个容器使用 busybox 镜像, 执行一个简单的命令 Pod 运行在 default 命名空间: + vim my-pod.yaml + + apiVersion: v1 + kind: Pod + metadata: + name: my-pod + namespace: default + labels: + app: my-app + annotations: + description: "This is my pod" + spec: + containers: + - name: my-container + image: nginx:latest + ports: + - containerPort: 80 + - name: sidecar-container + image: busybox + command: + - "bash/sh" + - "-c" + - "sleep 3600" + replicas: 3 + selector: + matchLabels: + app: my-app + volumeMounts: + - name: my-volume + mountPath: /data + volumes: + - name: my-volume + persistentVolumeClaim: + claimName: my-pvc + +2、pod 资源清单应用命令: (实例化资源对象) + kubectl apply -f my-pod.yaml + +3、查看 pod 资源命令: + kubectl get pods -A # 查看所有命名空间的 pod + kubectl get pods -n default # 查看 default 命名空间的 pod + kubectl get pods -n kube-system # 查看 kube-system 命名空间的 pod + kubectl get pod my-pod -o yaml # 查看指定 pod 的详细信息 + kubectl get pod my-pod -o wide # 查看指定 pod 的宽表信息(IP、节点等) + + diff --git a/k8s知识笔记/一、k8s 资源清单/3、pod的生命周期.conf b/k8s知识笔记/一、k8s 资源清单/3、pod的生命周期.conf new file mode 100644 index 0000000..21c0a13 --- /dev/null +++ b/k8s知识笔记/一、k8s 资源清单/3、pod的生命周期.conf @@ -0,0 +1,6 @@ +一、几个常用的探测和钩子 + 启动探测: + 就绪探测: + 存货探测: + 启动后钩子: + 关闭前钩子: diff --git a/k8s知识笔记/二、k8s pod 控制器/1、RC控制器.conf b/k8s知识笔记/二、k8s pod 控制器/1、RC控制器.conf new file mode 100644 index 0000000..0121a6d --- /dev/null +++ b/k8s知识笔记/二、k8s pod 控制器/1、RC控制器.conf @@ -0,0 +1,46 @@ +一、RC 控制器简介 +ReplicationController(RC)是Kubernetes中的一种控制器, 用于确保指定数量的Pod副本在集群中运行。 + RC控制器通过监视Pod的状态, 并根据需要创建或删除Pod来维持所需的副本数。 + RC控制器的主要功能包括: + 1. 确保指定数量的Pod副本在运行 + 2. 监控Pod的状态 + 3. 根据需要创建或删除Pod + +二、RC 控制器资源清单 + +# 资源清单例子 + +apiVersion: v1 # 接口组/版本 +kind: ReplicationController # 资源类型:RC 控制器 +metadata: # RC 控制器元数据 + name: nginx-rc # RC 控制器名称 +spec: # RC 控制器规格 · + replicas: 2 # 期望的pod副本数 + selector: # 标签选择器 + app: nginx # 选择标签为app=nginx的pod + template: # pod模板 + metadata: # pod元数据 + labels: # pod标签,必须与selector匹配(是其子集) + app: nginx # 标签key为app,value为nginx + spec: # pod规格 + containers: # 容器组列表 + - name: nginx # 容器名称 + image: nginx:1.7.9 + env: # 环境变量 + - name: ENV # 环境变量名称 + value: test # 环境变量值 + - name: ENV2 # 环境变量名称 + value: test2 # 环境变量值 + ports: + - containerPort: 80 # 容器端口 + +# 创建RC控制器 +kubectl create -f 1.rc.yaml + +# 查看RC控制器 +kubectl get rc + +# 查看RC控制器详情 +kubectl describe rc nginx-rc + + \ No newline at end of file diff --git a/k8s知识笔记/二、k8s pod 控制器/2、RS控制器.conf b/k8s知识笔记/二、k8s pod 控制器/2、RS控制器.conf new file mode 100644 index 0000000..ea2cf3b --- /dev/null +++ b/k8s知识笔记/二、k8s pod 控制器/2、RS控制器.conf @@ -0,0 +1,60 @@ +一、RS 控制器简介 +ReplicationSet(RS)是Kubernetes中的一种控制器, 用于确保指定数量的Pod副本在集群中运行。 + RS控制器通过监视Pod的状态, 并根据需要创建或删除Pod来维持所需的副本数。 + RS控制器相较RC控制器在标签选择器方面更为灵活, 支持更多的匹配方式。 + RS控制器的主要功能包括: + 1. 确保指定数量的Pod副本在运行 + 2. 监控Pod的状态 + 3. 根据需要创建或删除Pod + +RS 在标签选择器上, 除了可以定义键值对的 matchLabels 选择形式, 还支持 matchExpressions 字段,可以提供多种选择。目前支持的操作包括: + 1. In: # label的值在某个列表中 + 2. NotIn: # label的值不在某个列表中 + 3. Exists: # 某个label 存在 + 4. DoesNotExist: # 某个label不存在 + + # 例子: matchExpressions 选择形式 + spec: + selector: + matchExpressions: + - key: app + operator: Exists + + # 例子: matchExpressions 选择形式 + spec: + selector: + matchExpressions: + - key: app + operator: In + values: + - spring-k8s + - hahahah + + +二、RS 控制器资源清单 + +# 资源清单例子 +apiVersion: apps/v1 # 接口组/版本 +kind: ReplicaSet # 资源类型:RS 控制器 +metadata: # RS 控制器元数据 + name: nginx-rs # RS 控制器名称 +spec: # RS 控制器规格 · + replicas: 2 # 期望的pod副本数 + selector: # 标签选择器 + matchLabels: # 匹配标签模式 + app: nginx # 选择标签为app=nginx的pod + template: # pod模板 + metadata: # pod元数据 + labels: # pod标签,必须与selector匹配(是其子集) + app: nginx # 标签key为app,value为nginx + spec: # pod规格 + containers: # 容器组列表 + - name: nginx # 容器名称 + image: nginx:1.7.9 + env: # 环境变量 + - name: ENV # 环境变量名称 + value: test # 环境变量值 + - name: ENV2 # 环境变量名称 + value: test2 # 环境变量值 + ports: + - containerPort: 80 # 容器端口 diff --git a/k8s知识笔记/二、k8s pod 控制器/3、deployment控制器.conf b/k8s知识笔记/二、k8s pod 控制器/3、deployment控制器.conf new file mode 100644 index 0000000..b74835d --- /dev/null +++ b/k8s知识笔记/二、k8s pod 控制器/3、deployment控制器.conf @@ -0,0 +1,77 @@ +一、Deployment 控制器基本概念 + +Deployment 控制器是 Kubernetes 中用于管理应用程序部署和更新的高级控制器。 +它提供了一种声明式的方法来定义和管理应用程序的生命周期, 包括创建、更新和回滚等操作。 +Deployment 控制器(通过管理 ReplicaSet 来确保应用程序的期望状态与实际状态保持一致),从而实现高可用性和弹性伸缩。 + + + +二、声明式与命令式 + +# kubectl replace -f deployment.yaml +命令式创建deployment控制器, + 不支持部分更新,会覆盖之前的配置 + +# kubectl apply -f deployment.yaml +声明式创建deployment控制器, + 支持部分更新,会合并之前的配置, 只更新与新配置中不同的部分 + apply 可以结合 -f or -k 参数从文件或者目录中读多个配置文件,并根据当前集群资源状态进行更新 + +# kubectl diff -f deployment.yaml +比较当前集群实际运行的资源清单对象与当前资源清单文件对象的差异 + + +三、Deployment 控制器资源清单 + +# 资源清单例子 + +apiVersion: apps/v1 # 接口组/版本 +kind: Deployment # 资源类型:Deployment 控制器 +metadata: + labels: + app: myapp-deployment + name: myapp-deployment +spec: + selector: + metadata: + app: myapp-deployment + template: + metadata: + labels: + app: myapp-deployment + spec: + containers: + - name: myapp-container + image: nginx:1.7.9 + ports: + - containerPort: 80 + +# 上边的Deployment控制器清单没在spec中设置replicas,默认为 1 + + +三、Deployment常用命令 + +# kubectl create -f deployment.yaml +创建Deployment控制器 + +# kubectl create -f deployment.yaml --record +创建Deployment控制器, 并记录变更历史 + +# kubectl apply -f deployment.yaml +创建或更新Deployment控制器 + +# kubectl scale deployment myapp-deployment --replicas=3 +扩缩容Deployment控制器 + +# kubectl autoscale deployment myapp-deployment --min=10 --max=15 --cpu-percent=80 +基于CPU使用率自动扩缩容Deployment控制器 + +# kubectl rollout status deployment myapp-deployment +查看Deployment控制器的滚动更新状态 + +# kubectl rollout undo deployment myapp-deployment +回滚Deployment控制器到上一个版本 + +# kubectl set image deployment/myapp-deployment myapp-container=nginx/nginx:1.9.1 +更新Deployment控制器的镜像 + diff --git a/k8s知识笔记/常用命令.sh b/k8s知识笔记/常用命令.sh new file mode 100644 index 0000000..d29a539 --- /dev/null +++ b/k8s知识笔记/常用命令.sh @@ -0,0 +1,31 @@ +# 获取当前的资源, pod +kubectl get pods <选项> <命令> + -A, --all-namespaces 获取所有命名空间的资源 + -o, --output='': 输出格式, json, yaml, wide(显示更多信息) + -n, --namespace='': 指定命名空间 + -l, --selector='': 基于标签的过滤器 + --show-labels=false: 显示标签 + +# 进入 Pod 内部容器执行命令 +kubectl exec -it <选项> <命令> + -c, --container='': 指定容器名称, pod 内有多个容器时使用 + -it: 交互式终端,默认可省略 + -- /bin/bash 或 -- /bin/sh: 进入容器后使用的 shell 类型, 取决于容器内是否有 bash + +# 查看 Pod 日志 +kubectl logs <选项> <命令> + -f, --follow=false: 持续输出日志 + -c, --container='': 指定容器名称, pod 内有多个容器时使用 + --tail=-1: 输出日志的最后几行, -1表示全部 + --since=0s: 只输出最近多少时间的日志, 10s, 5m, 1h + --timestamps=false: 显示日志时间戳 + --previous=false: 查看上一个容器实例的日志, 容器重启后使用 + +# 查看资源的详细信息 +kubectl describe <资源类型> <资源名称> <选项> + -n, --namespace='': 指定命名空间, 不指定则为 default + -A, --all-namespaces: 查看所有命名空间的资源 + --show-events=false: 是否显示事件信息, 默认显示 + --field-selector='': 基于字段的过滤器, 例如 status.phase=Running + -l, --selector='': 基于标签的过滤器 + --sort-by='': 根据指定字段排序, 例如 metadata.name \ No newline at end of file diff --git a/虚拟机安装/一、机器准备.conf b/虚拟机安装/一、机器准备.conf new file mode 100644 index 0000000..56ad3b7 --- /dev/null +++ b/虚拟机安装/一、机器准备.conf @@ -0,0 +1,64 @@ +# 配置各节点的IP地址和主机名映射 +k8s-master: 192.168.31.11/24 +k8s-node-01: 192.168.31.12/24 +k8s-node-02: 192.168.31.13/24 +# 设置主机名为 k8s-master +hostnamectl set-hostname k8s-master +hostnamectl set-hostname k8s-node-01 +hostnamectl set-hostname k8s-node-02 + +# 修改host文件 +echo "192.168.31.11 k8s-master km" >> /etc/hosts +echo "192.168.31.12 k8s-node-01 kn1" >> /etc/hosts +echo "192.168.31.13 k8s-node-02 kn2" >> /etc/hosts + +# 关闭防火墙 +systemctl disable firewalld --now + +# 关闭SELinux +setenforce 0 +sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config + +# 关闭交换分区 +swapoff -a +sed -i '/swap/d' /etc/fstab # 永久关闭交换分区 + +## 配置内核参数,开启 IP 转发和网桥过滤 +# 创建配置文件 +sudo tee /etc/modules-load.d/k8s.conf < kubectl -> [网络] -> API Server (Master Node) -> kubelet (on each Node) -> Container Runtime (Containerd) -> Containers + - 你使用 kubectl 命令 (例如 kubectl run my-app ) + - kubectl 将这个命令转换成 API 请求, 发送给 Master 节点上的 API Server + - API Server 接收到请求后, 与其他控制平面组件 (如 Controller Manager 和 Scheduler) 协作, 决定应该在哪个 Worker Node 上运行这个新的 Pod + - API Server 将这个决定 (即 Pod 的配置信息) 存储在 etcd 中 + - 目标 Worker Node 上的 kubelet 进程会定期向 API Server 查询是否有新的任务分配给自己 + - 当 kubelet 发现有一个新的 Pod 需要在它的节点上运行时, 它会调用容器运行时 (Containerd) + - Containerd 最终负责从镜像仓库拉取镜像并创建和运行容器 + +总结: kubeadm 是部署工具, kubelet 是节点代理, kubectl 是管理客户端 kubeadm 帮助你快速搭建好一个包含多个 kubelet 的集群, 而你则通过 kubectl 来管理这个由 kubelet 维持运行的集群 + +# 默认安装位置和自定义安装位置 +# 使用 dnf 或 yum 在 Rocky Linux/CentOS 上安装这三个组件时, 它们会被安装到标准的 Linux 文件系统路径中 +-组件- -主要文件/目录- -说明- +kubeadm /usr/bin/kubeadm 主程序二进制文件 +kubectl /usr/bin/kubectl 主程序二进制文件 +kubelet /usr/bin/kubelet 主程序二进制文件 +kubelet /etc/systemd/system/kubeletserviced/10-kubeadmconf Systemd 服务配置文件, 由 kubeadm 生成 +kubelet /var/lib/kubelet/ 重要: kubelet 的工作目录, 存放 Pod 的数据卷 (Volumes) 、插件目录等 在上一步已经通过符号链接将其指向了 /data/kubelet +kubectl ~/kube/config 重要: kubectl 的配置文件, 包含了连接集群所需的认证信息 kubeadm init 成功后会自动生成 + + +## 整体步骤 +# 添加 Kubernetes 阿里 YUM 仓库 +cat </volumes/ 存放 Kubernetes 持久化卷数据 +containerd 日志文件 /var/log/containerd 日志文件位置(如果配置了日志) +containerd 插件目录 /usr/local/lib/containerd 存放 containerd 插件 +containerd.sock Unix 套接字文件 /run/containerd/containerd.sock 用于与 containerd 通信的套接字文件 +containerd-shim 服务文件 /etc/systemd/system/containerd-shim@.service 用于管理容器生命周期的服务单元文件 +containerd-shim 日志文件 /var/log/containerd-shim shim 的日志文件位置(如果配置了日志) +containerd-shim 数据目录 /var/lib/containerd-shim shim 存储数据的位置 +containerd-shim 插件目录 /usr/local/lib/containerd-shim 存放 containerd-shim 插件 +containerd-shim Unix 套接字文件 /run/containerd-shim/.sock 用于与特定容器通信的套接字文件 + + + + + +# 方案规划: +Containerd 数据目录:从 /var/lib/containerd 迁移到 /data/containerd/lib。 +Kubelet 卷目录:从 /var/lib/kubelet 迁移到 /data/kubelet。我们将通过创建一个符号链接 (Symbolic Link) 来实现,这是最简单、最可靠的方法。 + + + + + +## 步骤: +# 安装 Containerd +# 1. 安装所需的依赖包 +dnf install -y yum-utils device-mapper-persistent-data lvm2 +# 2. 添加 Docker 官方的 yum 仓库 +yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo +# 3. 安装 Containerd 软件包 (我们不需要完整的 Docker 引擎) +dnf install -y containerd.io + +# 建自定义数据目录 +mkdir -p /data/containerd/lib +mkdir -p /data/kubelet + +# 生成默认配置文件 +containerd config default | tee /etc/containerd/config.toml +## 修改配置文件 +# 编辑 /etc/containerd/config.toml 文件,进行以下修改: +# 1. 数据目录:将 root 和 state 指向我们的自定义路径 +sed -i 's|root = "/var/lib/containerd"|root = "/data/containerd/lib"|g' /etc/containerd/config.toml +sed -i 's|state = "/run/containerd"|state = "/data/containerd/state"|g' /etc/containerd/config.toml +# 2. SystemdCgroup:将其设置为 true,这是 Kubernetes 推荐的配置,可以更好地与系统的 cgroup 管理器集成。 +sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml +# 3. 换阿里云的镜像源 +sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"#g' /etc/containerd/config.toml +# 保存并关闭文件 + +# 为 Kubelet 卷目录创建符号链接 +# 1. 如果 /var/lib/kubelet 目录已存在,先删除它 +rm -rf /var/lib/kubelet +# 2. 创建一个从默认路径到我们自定义路径的符号链接 +ln -s /data/kubelet /var/lib/kubelet + +## 启动并设置 Containerd 开机自启 +# 重新加载 systemd 配置 +systemctl daemon-reload +# 启动 containerd 服务 +systemctl start containerd +# 设置 containerd 开机自启 +systemctl enable containerd +# 重启 containerd 服务 +systemctl restart containerd +# 查看 containerd 服务状态,确保其为 active (running) +systemctl status containerd + + + + +