目录
[1、Pod 控制器概述](#1、Pod 控制器概述)
[2、Pod 控制器的类型](#2、Pod 控制器的类型)
[3、Deployment 控制器](#3、Deployment 控制器)
[3.1 特点](#3.1 特点)
[3.2 案列](#3.2 案列)
[3.3 查看控制器配置](#3.3 查看控制器配置)
[4、StatefulSet 控制器(有状态)](#4、StatefulSet 控制器(有状态))
[4.1 特点](#4.1 特点)
[4.2 三个核心组件](#4.2 三个核心组件)
[4.3 StatefulSet + NFS 持久卷(案列)](#4.3 StatefulSet + NFS 持久卷(案列))
[4.3.1 定义 Headless Service](#4.3.1 定义 Headless Service)
[4.3.2 定义 StatefulSet 动态](#4.3.2 定义 StatefulSet 动态)
[4.3.3 创建与验证](#4.3.3 创建与验证)
[4.3.4 滚动更新](#4.3.4 滚动更新)
[4.3.5 总结](#4.3.5 总结)
[5、DaemonSet 控制器](#5、DaemonSet 控制器)
[5.1 功能](#5.1 功能)
[5.2 案列](#5.2 案列)
[6、Job 控制器](#6、Job 控制器)
[6.1 功能](#6.1 功能)
[7、CronJob 控制器](#7、CronJob 控制器)
[7.1 功能](#7.1 功能)
[8、无状态 vs 有状态 应用对比](#8、无状态 vs 有状态 应用对比)
[9、常规 Service 与 Headless Service 对比](#9、常规 Service 与 Headless Service 对比)
一、Pod控制器
1、Pod 控制器概述
Pod 控制器(Controller) 又称为 工作负载(Workload),是 Kubernetes 中用于 管理 Pod 的中间层。
它的职责是确保集群中的 Pod 资源始终符合用户定义的"期望状态"。
功能
- 保证 Pod 副本数量与期望一致
- Pod 异常退出时,自动根据重启策略重建
- 支持伸缩(扩容/缩容)、滚动更新、回滚
2、Pod 控制器的类型
|-------------|---------------------------------------------------|----------------|
| 控制器 | 功能 | 应用场景 |
| ReplicaSet | 保证指定数量的 Pod 副本存在,支持滚动扩缩容。通常不直接使用,由 Deployment 管理。 | 无状态应用 |
| Deployment | 管理 ReplicaSet,实现声明式部署、滚动升级、回滚等。 | Web 服务 |
| StatefulSet | 管理有状态应用,提供稳定的网络标识与存储。 | 数据库、 Zookeeper |
| DaemonSet | 每个 Node 上运行一个 Pod。 | 日志、监 控、Agent |
| Job | 执行一次性任务。 | 定期备份、 通知 |
| CronJob | 周期性任务(类似 Crontab)。 | 定期备份、通知 |
3、Deployment 控制器
3.1 特点
- 管理无状态应用
- 支持滚动更新与回滚
- 声明式配置更新
- 与 ReplicaSet 协作使用
3.2 案列
bash
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
kubectl create -f nginx-deployment.yaml
kubectl get pods,deploy,rs
3.3 查看控制器配置
bash
kubectl edit deployment/nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2021-04-19T08:13:50Z"
generation: 1
labels:
app: nginx #Deployment资源的标签
name: nginx-deployment
namespace: default
resourceVersion: "167208"
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-
deployment
uid: d9d3fef9-20d2-4196-95fb-0e21e65af24a
spec:
progressDeadlineSeconds: 600
replicas: 3 #期望的pod数量,默认是1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25% #升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
maxUnavailable: 25% #升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
type: RollingUpdate #滚动升级
template:
metadata:
creationTimestamp: null
labels:
app: nginx #Pod副本关联的标签
spec:
containers:
- image: nginx:1.15.4 #镜像名称
imagePullPolicy: IfNotPresent #镜像拉取策略
name: nginx
ports:
- containerPort: 80 #容器暴露的监听端口
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always #容器重启策略
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
......
##查看历史版本
[root@master01 ~]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
4、StatefulSet 控制器(有状态)
4.1 特点
-
稳定存储:基于 PVC 实现,每个 Pod 独立存储
-
稳定网络标识:Pod 名称和 DNS 名称固定
-
有序部署/删除:从 0 → N-1 创建,从 N-1 → 0 删除
-
依赖 Headless Service
4.2 三个核心组件
-
Headless Service(无头服务):用于为Pod资源标识符生成可解析的DNS记录。
-
volumeClaimTemplates(存储卷申请模板):基于静态或动态PV供给方式为Pod资源提供专有的固定存储。
-
StatefulSet:用于管控Pod资源。

4.3 StatefulSet + NFS 持久卷(案列)
4.3.1 定义 Headless Service
bash
vim stateful-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: myapp-pod
kubectl apply -f stateful-headless.yaml
4.3.2 定义 StatefulSet 动态
bash
vim stateful-demo.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas: 3
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myappdata
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myappdata
annotations: #动态PV创建时,使用annotations在PVC里声明一个StorageClass对象的标识进行关联
volume.beta.kubernetes.io/storage-class: nfs-client-storageclass
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 2Gi
解析上例:由于 StatefulSet 资源依赖于一个实现存在的 Headless 类型的 Service 资源,所以需要先定义一个名为 myapp-svc 的 Headless Service 资源,用于为关联到每个 Pod 资源创建 DNS 资源记录。接着定义了一个名为 myapp 的 StatefulSet 资源,它通过 Pod 模板创建了 3 个 Pod 资源副本,并基于 volumeClaimTemplates 向前面创建的PV进行了请求大小为 2Gi 的专用存储卷。
4.3.3 创建与验证
kubectl apply -f stateful-demo.yaml
kubectl get sts,pvc,pv,pods
4.3.4 滚动更新
#StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。如下操作的滚动更新是按照2-0的顺序更新。
修改镜像版本
kubectl edit sts myapp
kubectl get pods -w # 观察按序更新 2→1→0
4.3.5 总结
无状态:
1)deployment 认为所有的pod都是一样的
2)不用考虑顺序的要求
3)不用考虑在哪个node节点上运行
4)可以随意扩容和缩容
有状态:
1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应用。
常规service和无头服务区别:
service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service:无头服务,不需要cluster-IP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
5、DaemonSet 控制器
5.1 功能
确保每个 Node 上都运行一个 Pod 副本。
常用于运行系统级后台任务(守护进程)。
典型场景:
- Fluentd / Logstash 日志收集
- Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond 监控代理
- 存储服务如 Ceph、GlusterFS
5.2 案列
bash
vim ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonSet
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
DaemonSet会在每个node节点都创建一个Pod
kubectl get pods
nginx-deployment-4kr6h 1/1 Running 0 35s
nginx-deployment-8jrg5 1/1 Running 0 35s
6、Job 控制器
6.1 功能
用于执行一次性任务,任务完成后即退出。
应用场景:
- 数据迁移
- 批处理
- 安全扫描
- 离线数据处理
7、CronJob 控制器
7.1 功能
周期性任务(类似 Linux Crontab)。
应用场景:
- 定期备份
- 定时通知
- 日志清理
8、无状态 vs 有状态 应用对比
|---------|---------------------|----------------------|
| 对比项 | 无状态(Deployment) | 有状态(StatefulSet) |
| Pod 名称 | 随机生成 | 固定、有序(0→N-1) |
| 存储 | 共享存储或无持久卷 | 每个 Pod 独立 PVC |
| 网络标识 | 不固定 | 稳定 DNS 名称 |
| 扩缩容顺序 | 无序 | 有序(依次创建/删除) |
| 应用示例 | Web、API | MySQL、ZooKeeper |
9、常规 Service 与 Headless Service 对比
|------------------|------------------|--------------|----------------------|
| 类型 | 是否有ClusterIP | 访问方式 | 作用 |
| Service | 有 | 负载均衡 + 服务发现 | 集群统一访问入口 |
| Headless Service | 无 | 直接解析到 Pod IP | StatefulSet 中 DNS 定位 |
10、总结
