K8S中控制器的使用
在Kubernetes集群架构中,Pod是承载业务容器的最小单元,但裸Pod不具备自愈、扩容、迭代能力,无法适配生产环境的稳定运行需求。真正支撑集群自动化运维、保障业务高可用的核心,是各类控制器组件。控制器作为K8s工作负载的核心管理层,通过持续调谐集群状态,实现Pod全生命周期的自动化管理,是落地容器编排、弹性伸缩、灰度发布等核心能力的基石。
一、K8s控制器核心运行原理
控制器的核心工作逻辑可以概括为状态闭环调谐机制,整个流程无需人工干预,依托K8s原生机制自动循环执行,这也是K8s声明式API的核心体现。区别于命令式操作的主动执行,声明式运维只需定义最终期望状态,控制器会自动完成状态对齐。
整个调谐流程分为三个核心环节,永久循环监控集群状态:
首先是状态观测,控制器通过APIServer持续监听集群资源,实时获取当前所有Pod的运行数量、健康状态、标签属性等实际运行数据,精准捕捉集群实时状态。
其次是状态对比,控制器从etcd中读取用户预设的期望状态,将其与集群实际状态进行比对,精准识别两者之间的差异。例如用户定义3个Pod副本,而集群当前仅运行2个,系统会精准标记状态偏差。
最后是闭环修复,针对检测到的状态差异,控制器自动触发对应操作完成修复。副本不足则新建Pod,副本冗余则销毁多余Pod,Pod异常退出则自动重建,最终让集群实际状态完全匹配用户期望状态。
基于这套机制,控制器管理的Pod与自主式Pod形成本质区别。自主式Pod意外退出后不会自动恢复,而控制器托管的Pod会在其生命周期内持续维持预设副本数量,实现故障自愈、状态恒定。
二、主流控制器分类与场景适配
K8s针对不同业务场景,设计了多款专用控制器,覆盖常驻业务、迭代更新、节点独占、定时任务等场景。各类控制器定位清晰、分工明确,熟练区分其适用场景是生产运维的核心基础。
|
控制器名称 |
核心定位 |
适用业务场景 |
|---|---|---|
|
Replication Controller |
初代Pod副本控制器,已废弃 |
旧版本集群兼容,新项目不再使用 |
|
ReplicaSet |
精准维持固定数量Pod副本,支持标签选择器 |
基础副本保活,多被Deployment间接调用 |
|
Deployment |
基于ReplicaSet实现声明式更新,支持版本迭代、滚动更新 |
无状态常驻业务(Web服务、接口服务),生产最常用 |
|
DaemonSet |
集群节点级Pod部署,每节点运行一个副本 |
节点监控、日志收集、集群组件(Prometheus、Fluentd) |
|
StatefulSet |
管理有状态应用,保障Pod唯一性、有序性 |
数据库、缓存、消息队列等有状态业务 |
|
Job |
一次性批处理任务,任务完成即结束 |
数据计算、文件处理、单次脚本执行 |
|
CronJob |
基于Linux cron规则的定时任务调度 |
定时备份、定时统计、周期性巡检任务 |
|
HPA |
基于资源利用率自动伸缩Pod数量 |
流量波动大的业务,实现弹性扩容缩容 |
三、核心控制器实战落地
理论机制最终需要服务于生产落地,下面针对ReplicaSet、Deployment、DaemonSet、Job、CronJob五大高频控制器,提供完整可直接复用的实操案例,包含配置文件编写、命令执行、效果验证及核心特性测试。
3.1 ReplicaSet控制器:基础副本自愈实战
ReplicaSet是RC的升级版,核心优化是支持基于集合的标签选择器,精准匹配Pod标签,是K8s维持Pod副本数量的基础组件。日常一般不单独直接创建,而是作为Deployment的底层支撑组件。
首先生成并编辑配置文件,定义2副本的Pod托管规则:
# 快速生成yaml模板
kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml
# 编辑完善配置文件
vim replicaset.yml
完整配置文件内容如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
执行部署命令并验证Pod运行状态:
kubectl apply -f replicaset.yml kubectl get pods --show-labels
此时集群会稳定运行2个携带app=myapp标签的Pod。为验证自愈特性,修改其中一个Pod的标签,打破标签匹配关系:
kubectl label pod replicaset-l4xnr app=timinglee --overwrite
操作后可以发现,集群会立即新建一个符合标签规则的Pod,始终维持2个目标副本,充分验证ReplicaSet的状态调谐能力。手动删除Pod同样会触发自动重建,实现故障自愈。
3.2 Deployment控制器:无状态业务迭代核心实战
Deployment是生产环境的首选控制器,它不直接管理Pod,而是通过管控ReplicaSet实现版本迭代、滚动更新、版本回滚、暂停发布等高级能力,完美适配无状态业务的持续迭代需求。
3.2.1 基础部署
创建4副本的myapp服务部署配置:
kubectl create deployment deployment --image myapp:v1 --dry-run=client -o yaml > deployment.yml vim deployment.yml
核心配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 4
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
部署后验证,集群会稳定运行4个正常Pod。
3.2.2 版本滚动更新
滚动更新是Deployment的核心能力,默认采用25%最大不可用、25%最大峰值的更新策略,实现业务零停机迭代。修改配置将镜像版本升级为v2,并配置最小就绪时间:
spec:
minReadySeconds: 5
containers:
- name: myapp
image: myapp:v2
重新生效配置并观察更新过程:
kubectl apply -f deployment.yml
watch -n1 kubectl get pods -o wide
更新过程中,系统会新建新版本ReplicaSet,逐步创建新Pod、销毁旧版本Pod,全程业务不中断,更新完成后所有Pod均运行v2版本镜像。
3.2.3 版本回滚与发布暂停
若新版本存在bug,可直接修改配置将镜像回滚至v1版本,重新生效即可快速恢复业务。针对多配置批量修改场景,支持发布暂停功能,避免单次修改触发多次无效更新:
# 暂停发布
kubectl rollout pause deployment deployment-example
# 批量修改配置后统一生效
kubectl rollout resume deployment deployment-example
3.3 DaemonSet控制器:节点级服务部署实战
DaemonSet的核心特性是集群每个节点仅运行一个Pod副本,新增节点自动部署、下线节点自动回收,极其适合节点级监控、日志采集组件。同时支持污点容忍,可适配集群所有节点。
创建nginx节点守护服务配置:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
tolerations:
- effect: NoSchedule
operator: Exists
containers:
- name: nginx
image: nginx
部署后验证,集群所有master、node节点都会运行一个nginx Pod,完美实现节点全覆盖部署。
3.4 Job&CronJob控制器:任务调度实战
针对一次性任务和周期性任务,K8s提供专用任务控制器,避免常驻资源浪费,精准适配批处理场景。
3.4.1 Job一次性任务
配置任务总计完成6次执行、每次并行2个任务,失败重试4次:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
completions: 6
parallelism: 2
backoffLimit: 4
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
任务执行完成后,Pod自动终止,Job状态标记为完成,不会持续占用集群资源。
3.4.2 CronJob定时任务
基于cron表达式实现每分钟执行一次定时任务,适配周期性运维操作:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
template:
spec:
containers:
- name: hello
image: busybox
command: ["/bin/sh","-c","date; echo Hello from the Kubernetes cluster"]
imagePullPolicy: IfNotPresent
restartPolicy: OnFailure
四、总结
1. 普通无状态Web业务,优先使用Deployment,享受零停机更新、版本回滚、弹性伸缩全套能力,是生产标配;
2. 节点级监控、日志组件,固定使用DaemonSet,保障全节点覆盖部署;
3. 数据库、缓存等有状态业务,选用StatefulSet,保障Pod有序性和数据一致性;
4. 单次批处理任务用Job,周期性运维任务用CronJob,按需释放资源;
5. 杜绝直接使用废弃的RC组件,ReplicaSet仅作为底层依赖,不单独手动维护。
更多推荐


所有评论(0)