本文系统介绍 Kubernetes 中六类常用控制器:ReplicaSet 用于保证指定数量的 Pod 副本始终运行并支持弹性伸缩;Deployment 负责应用的部署、升级与回滚,并自动管理底层 ReplicaSet;版本更新管理部分讲解更新策略的查看、设定以及更新的暂停与恢复;DaemonSet 会在集群每个节点上自动运行一个 Pod;Job 用于执行一次性任务,支持设置完成次数与并行度;CronJob 则按 Cron 表达式周期性地调度任务。全文通过 kubectl 命令与 YAML 配置示例,演示各控制器的创建、应用与验证过程。
一、ReplicaSet 控制器
1. 建立控制器
通过 kubectl 创建 ReplicaSet 控制器,实现 Pod 副本数量的管理。
bash# 生成控制器 YAML 模板 [root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > repset.yml 编辑 YAML 文件 [root@master controler]# vim repset.yml apiVersion: apps/v1 kind: ReplicaSet metadata: labels: app: webcluster name: webcluster spec: replicas: 2 selector: matchLabels: app: webcluster template: metadata: labels: app: webcluster spec: containers: - image: myapp:v1 name: myapp 应用配置 [root@master controler]# kubectl apply -f repset.yml 监控 Pod 状态(新开一个 shell) [root@master ~]# watch -n 1 kubectl get pods --show-labels
创建完成后,集群中会运行 2 个带有 app=webcluster 标签的 Pod。
2. 测试功能
ReplicaSet 的核心功能是保证指定数量的 Pod 副本始终运行,可通过修改 replicas 数量进行弹性伸缩。
bash
# 拉伸副本数量
kubectl scale replicaset webcluster --replicas 4
kubectl scale replicaset webcluster --replicas 2
kubectl scale replicaset webcluster --replicas 0
修改 YAML 中 replicas 为 4 后重新应用
[root@master controler]# vim repset.yml
spec:
replicas: 4
[root@master controler]# kubectl apply -f repset.yml
修改 YAML 并重新 apply 后,控制器会自动调整 Pod 数量至期望值。
总结: ReplicaSet 控制器通过声明式配置保证指定数量的 Pod 副本始终运行,支持通过 kubectl scale 或修改 YAML 中的 replicas 字段实现弹性伸缩,是 Kubernetes 中实现 Pod 副本管理的基础控制器。
二、Deployment 控制器
1. 监控
bash
[root@master ~]# watch -n 1 "kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps"
2. 建立 Deployment 控制器
bash
# 生成 Deployment YAML 模板
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > dep.yml
编辑 YAML 文件
[root@master controler]# vim dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
应用配置
[root@master controler]# kubectl apply -f dep.yml
发布服务
[root@master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
查看服务详情
[root@master controler]# kubectl describe services webcluster
访问服务
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
Deployment 会自动创建对应的 ReplicaSet,Pod 名称中会带有 pod-template-hash 标签。
3. 升级和回滚
bash
# 升级:将镜像版本改为 v2
[root@master controler]# vim dep.yml
spec:
containers:
- image: myapp:v2
name: myapp
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
验证升级结果
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
回滚:将镜像版本改回 v1
[root@master controler]# vim dep.yml
spec:
containers:
- image: myapp:v1
name: myapp
[root@master controler]# kubectl apply -f dep.yml
验证回滚结果
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
**总结:**Deployment 控制器在 ReplicaSet 之上提供了声明式的应用部署、升级与回滚能力,自动管理底层 ReplicaSet,并通过滚动更新策略实现应用的平滑发布,是生产环境中部署无状态应用的首选控制器。
三、版本更新管理及优化
1. 查看更新策略信息
bash
# 将副本数调整为 6 方便观察
[root@master controler]# vim dep.yml
spec:
replicas: 6
[root@master controler]# kubectl apply -f dep.yml
查看更新策略
[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 25% max unavailable, 25% max surge
2. 设定更新策略
bash
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 6
selector:
matchLabels:
app: webcluster
strategy:
rollingUpdate:
maxSurge: 1 # 更新时 Pod 数量最多比期望值多一个
maxUnavailable: 0 # 不可用 Pod 数量比期望值多 0
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@master controler]# kubectl apply -f dep.yml
3. 更新暂停和恢复
bash
# 查看更新历史
[root@master controler]# kubectl rollout history deployment webcluster
暂停更新
[root@master controler]# kubectl rollout pause deployment webcluster
deployment.apps/webcluster paused
修改镜像版本为 v2 并应用(此时不会触发更新)
[root@master controler]# vim dep.yml
spec:
containers:
- image: myapp:v2
name: myapp
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
恢复更新
[root@master controler]# kubectl rollout resume deployment webcluster
deployment.apps/webcluster resumed
再次查看更新历史,确认新版本已生效
[root@master controler]# kubectl rollout history deployment webcluster
**总结:**版本更新管理通过查看更新策略、设定滚动更新参数(如 maxSurge、maxUnavailable、minReadySeconds)以及暂停与恢复更新,实现对 Deployment 发布过程的精细化控制,确保应用更新安全可控。
四、DaemonSet 控制器
bash
# 生成 DaemonSet YAML 模板
[root@master controler]# kubectl create deployment daemonset --image myapp:v1 --dry-run=client -o yaml > daemonset.yml
编辑 YAML 文件
[root@master controler]# vim daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: daemonset
name: daemonset
spec:
selector:
matchLabels:
app: daemonset
template:
metadata:
labels:
app: daemonset
spec:
containers:
- image: myapp:v1
name: myapp
应用配置
[root@master controler]# kubectl apply -f daemonset.yml
DaemonSet 会在集群中每个节点上运行一个 Pod。当新节点加入集群时,会自动在该节点上创建对应的 Pod。
bash
# 在 master 中重新生成集群主机注册时需要的 token
[root@master controler]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927
在 node3 上执行加入集群命令
[root@node3 ~]# kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 --cri-socket unix:///var/run/cri-dockerd.sock
当 node3 加入集群后,DaemonSet 会自动在其上创建指定的 Pod。
**总结:**DaemonSet 控制器确保集群中每个节点上都运行一个指定的 Pod,当新节点加入集群时自动创建对应 Pod,适用于日志收集、监控代理等需要在所有节点上部署守护进程的场景。
五、Job 控制器
bash
# 准备镜像并推送到私有仓库
[root@master ~]# docker load -i perl-5.34.tar.gz
[root@master ~]# docker tag perl:5.34.0 reg.timinglee.org/library/perl:5.34.0
[root@master ~]# docker login reg.timinglee.org -u admin
[root@master ~]# docker push reg.timinglee.org/library/perl:5.34.0
生成 Job YAML 模板
[root@master controler]# kubectl create job job --image perl:5.34.0 --dry-run=client -o yaml > job.yml
编辑 YAML 文件
[root@master controler]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: testjob
spec:
completions: 6
parallelism: 2
backoffLimit: 4
template:
spec:
containers:
- image: busybox
name: testjob
command: ["/bin/sh", "-c"]
args:
- |
echo this is testjob message
sleep 10
restartPolicy: Never
应用配置
[root@master controler]# kubectl apply -f job.yml
job.batch/job created
查看 Job 日志
[root@k8s-master controller]# kubectl logs pods/testjob-4cdlr
this is testjob message
Job 控制器用于执行一次性任务,支持设置完成次数(completions)和并行度(parallelism)。
**总结:**Job 控制器用于执行一次性任务,通过 completions 设置任务完成次数、parallelism 控制并行度,任务执行完成后 Pod 自动退出,适用于批处理、数据迁移等一次性计算场景。
六、CronJob 控制器
bash
# 生成 CronJob YAML 模板
[root@master controler]# kubectl create cronjob cronjob --image busybox --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
编辑 YAML 文件
[root@master controler]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob
spec:
jobTemplate:
metadata:
name: cronjob
spec:
template:
spec:
containers:
- image: busybox
name: cronjob
command:
- /bin/sh
- -c
- echo "hello timinglee"
restartPolicy: OnFailure
schedule: '* * * * *'
应用配置(整分运行)
[root@master controler]# kubectl apply -f cronjob.yml
查看 CronJob 状态
[root@master controler]# kubectl get cronjobs.batch
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob * * * * * <none> False 0 17s 70s
查看任务日志
[root@master controler]# kubectl logs cronjob-29598241-pxggh
hello timinglee
CronJob 控制器用于按计划时间周期性地执行任务,支持标准的 Cron 表达式。