下面是对 《K8s 的 Controller 管理(第 4 部分)》PDF 内容系统化、简洁但不失细节的总结。我已将概念讲清楚、流程理顺,并且对涉及代码与命令的地方给出多个示例,整体采用 Markdown 结构,方便你在 Typora / Obsidian / GitHub 中直接使用。


Kubernetes Controller 管理

Controller 是 Kubernetes 的核心控制机制,负责让集群“始终朝着期望状态运行”。


一、Controller 的作用与分类

1️⃣ Controller 的核心作用

Controller 的本质是一个 控制循环(Control Loop)

不断比较:实际状态 vs 期望状态 → 不一致就自动修复

主要控制对象是 Pod

📌 例如:

  • 你说要 3 个 Pod
  • 实际只剩 2 个
  • Controller 自动补 1 个

2️⃣ Controller 类型总览

Controller 作用
Deployment 无状态应用部署、滚动升级、回滚
ReplicaSet 保证 Pod 副本数量
ReplicationController ReplicaSet 旧版本(已淘汰)
StatefulSet 有状态应用(如 MySQL)
DaemonSet 每个节点运行 1 个 Pod
Job 一次性任务
CronJob 定时任务

二、Deployment(最常用)

1️⃣ Deployment 的定位

  • 用于部署无状态应用
  • 内部 自动管理 ReplicaSet
  • 支持:
    • 滚动升级
    • 回滚
    • 扩 / 缩容
    • 自动重建 Pod

📌 生产环境首选


2️⃣ 无状态应用特征

  • 所有 Pod 完全等价
  • 使用同一个镜像
  • 无启动顺序要求
  • Pod 数量可随意增减
  • Pod IP 不固定

典型代表:nginx / web / api


3️⃣ 创建 Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.26-alpine
        ports:
        - containerPort: 80
kubectl apply -f deployment-nginx.yml

在这里插入图片描述

4️⃣ Deployment → ReplicaSet → Pod 关系

Deployment
  └── ReplicaSet
        └── Pod
kubectl get deployment
kubectl get rs
kubectl get pods

在这里插入图片描述

5️⃣ Pod 删除后的行为(重点)

kubectl delete pod <pod-name> --force --grace-period=0

在这里插入图片描述

✅ 现象:

  • Pod 被删除
  • ReplicaSet 立刻重建新 Pod
  • IP、Node 可能变化

📌 结论:

Pod IP 不可靠 → 需要 Service 提供稳定访问入口


三、Deployment 版本管理(核心能力)


1️⃣ 查看当前镜像版本

kubectl exec <pod> -- nginx -v

在这里插入图片描述

2️⃣ 滚动升级(推荐方式)

kubectl set image deployment deploy-nginx nginx=nginx:1.29-alpine

在这里插入图片描述

升级过程:

  • 创建新 ReplicaSet
  • 逐步替换旧 Pod
  • 不中断服务

3️⃣ 查看升级状态

kubectl rollout status deployment deploy-nginx

在这里插入图片描述

4️⃣ 查看历史版本

kubectl rollout history deployment deploy-nginx
kubectl rollout history deployment deploy-nginx --revision=1

在这里插入图片描述

5️⃣ 回滚到指定版本

kubectl rollout undo deployment deploy-nginx --to-revision=1

📌 Deployment 才支持回滚,ReplicaSet 不支持


在这里插入图片描述

四、Deployment 扩容与缩容

1️⃣ 扩容

kubectl scale deployment deploy-nginx --replicas=4
  • Pod 数量 可以大于 Node 数
  • Scheduler 自动调度

在这里插入图片描述

2️⃣ 缩容(甚至为 0)

kubectl scale deployment deploy-nginx --replicas=0

📌 常用于:

  • 临时下线服务
  • 节省资源

在这里插入图片描述

3️⃣ 扩容失败案例(Calico 网络)

现象

STATUS: ContainerCreating
kubectl describe pod <pod-name>

原因

  • CNI 插件 Calico 异常

解决

kubectl rollout restart daemonset calico-node -n kube-system

五、ReplicaSet

1️⃣ ReplicaSet 的特点

  • 只负责 副本数量
  • 不支持滚动升级
  • 不支持回滚

📌 不建议直接使用


2️⃣ ReplicaSet 示例

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.26-alpine

扩容:

kubectl scale rs rs-nginx --replicas=4

在这里插入图片描述

版本更新

[root@k8s-master YAML]# kubectl describe pods rs-nginx-28dng | grep Image;
 Image:          nginx:1.26-alpine
    Image ID:       docker.io/library/nginx@sha256:1eadbb07820339e8bbfed18c771691970baee292ec4ab2558f1453d26153e22d

[root@k8s-master YAML]# kubectl set image replicaset rs-nginx nginx=nginx:latest --record
Flag --record has been deprecated, --record will be removed in the future
replicaset.apps/rs-nginx image updated

检查,版本并没发生变化,replicaset无法实现版本更新

[root@k8s-master YAML]# kubectl describe pods rs-nginx-28dng | grep Image;
    Image:          nginx:1.26-alpine
    Image ID:       docker.io/library/nginx@sha256:1eadbb07820339e8bbfed18c771691970baee292ec4ab2558f1453d26153e22d

在这里插入图片描述

❌ 镜像不会自动更新


六、DaemonSet(每节点一个 Pod)

1️⃣ DaemonSet 的作用

  • 每个 Node 运行一个 Pod
  • Node 增加 → 自动部署
  • Node 删除 → 自动清理

📌 常见场景:

  • 日志收集(filebeat)
  • 监控(node-exporter)
  • 网络插件

2️⃣ DaemonSet 示例(含 Master 节点)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx
spec:
  selector:
    matchLabels:
      name: nginx-ds
  template:
    metadata:
      labels:
        name: nginx-ds
    spec:
      tolerations:  # 代表容忍,保证在所有节点运行
      - key: node-role.kubernetes.io/master  # 能容忍的污点key
        effect: NoSchedule  # 能容忍的污点effect
      containers:
      - name: nginx
        image: nginx:1.26-alpine
        imagePullPolicy: IfNotPresent
        resources:  # 资源限制是为了防止节点资源被占太多(根据实际情况配置)
          limits:
            memory: 100Mi
          requests:
            memory: 100Mi

验证

[root@k8s-master YAML]# kubectl apply -f deamonset1.yml
daemonset.apps/daemonset-nginx created
[root@k8s-master YAML]# kubectl get daemonset
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset-nginx   2         2         2       2            2           <none>          15s
[root@k8s-master YAML]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
daemonset-nginx-47j8x   1/1     Running   0          24s   10.244.36.89     k8s-node1   <none>           <none>
daemonset-nginx-px8ct   1/1     Running   0          24s   10.244.169.153   k8s-node2   <none>           <none>
rs-nginx-28dng          1/1     Running   0          10m   10.244.36.88     k8s-node1   <none>           <none>
rs-nginx-glgpg          1/1     Running   0          10m   10.244.169.152   k8s-node2   <none>           <none>
rs-nginx-pq4bv          1/1     Running   0          10m   10.244.36.87     k8s-node1   <none>           <none>
rs-nginx-vl5fn          1/1     Running   0          10m   10.244.169.151   k8s-node2   <none>           <none>

📌 DaemonSet:

  • ❌ 不支持 scale
  • ✅ 支持镜像升级

在这里插入图片描述


七、Job(一次性任务)

1️⃣ Job 的适用场景

  • 批处理
  • 计算任务
  • 备份
  • 数据迁移

任务 完成即结束


2️⃣ 示例:计算 π 值

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pod-pi
    spec:
      nodeName: k8s-node2 #注意不要写错节点名字了,要不然状态会变成pending
      containers:
      - name: c-pi
        image: perl
        imagePullPolicy: IfNotPresent
        command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
      restartPolicy: Never

在这里插入图片描述

3️⃣ 固定执行次数 Job

spec:
  completions: 10
  parallelism: 1

八、CronJob(定时任务)

1️⃣ CronJob 说明

  • 类似 Linux crontab
  • 定期创建 Job

2️⃣ CronJob 示例

apiVersion: batch/v1
kind: CronJob
metadata:
 name: cronjob1
spec:
  schedule: "* * * * *"      #分时日月周
  jobTemplate:
    spec:
      template:
        spec:
          containers:
           - name: hello
             image: busybox
             args:
             - /bin/sh
             - -c
             - date; echo hello kubernetes
             imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure

3️⃣ 定时备份 MySQL(实战)

  • StatefulSet 运行 MySQL
  • CronJob 定期 mysqldump
  • 备份文件落盘到 Node

九、StatefulSet(有状态应用)

1️⃣ 有状态 vs 无状态

对比 无状态 有状态
Pod 身份 固定
存储 不需要 必须
替换 任意 不可
示例 Nginx MySQL

2️⃣ StatefulSet 核心特性

  • 固定 Pod 名称(db-0 / db-1)
  • 固定网络身份
  • 持久化存储
  • 有序创建 / 删除 / 升级

3️⃣ StatefulSet 三大组成

  1. Headless Service
  2. StatefulSet
  3. VolumeClaimTemplate

十、存储:NFS / PV / PVC

1️⃣ 为什么需要 PV / PVC

解耦:存储实现 vs 应用使用

  • PV:存储资源(生产者)
  • PVC:存储申请(消费者)

2️⃣ NFS 挂载示例

volumes:
- name: documentroot
  nfs:
    server: 192.168.100.138
    path: /data/nfs

多个 Pod 共享同一存储


十一、核心总结

一句话版本

  • Deployment = 无状态应用标配
  • Service = 稳定访问入口
  • ReplicaSet = 不要单独用
  • DaemonSet = 每节点一个
  • Job = 一次性任务
  • CronJob = 定时任务
  • StatefulSet = 有状态应用
  • PV / PVC = 存储解耦
  1. VolumeClaimTemplate

十、存储:NFS / PV / PVC

1️⃣ 为什么需要 PV / PVC

解耦:存储实现 vs 应用使用

  • PV:存储资源(生产者)
  • PVC:存储申请(消费者)

2️⃣ NFS 挂载示例

volumes:
- name: documentroot
  nfs:
    server: 192.168.100.138
    path: /data/nfs

多个 Pod 共享同一存储


十一、核心总结

一句话版本

  • Deployment = 无状态应用标配
  • Service = 稳定访问入口
  • ReplicaSet = 不要单独用
  • DaemonSet = 每节点一个
  • Job = 一次性任务
  • CronJob = 定时任务
  • StatefulSet = 有状态应用
  • PV / PVC = 存储解耦

更多推荐