一.Replicaset控制器
ReplicaSet 核心作用: 保证指定数量的 Pod 副本始终运行。
- 只要
selector标签匹配的 Pod 数量,和replicas期望值不一致,ReplicaSet 就会自动创建 / 删除 Pod. - 控制器持续循环调谐,维持副本数量。
1.建立控制器
bash
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > repset.yml
[root@master controler]# vim repset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@master controler]# kubectl apply -f repset.yml
#打开一个新的shell
[root@master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:08:32 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-tbxq4 1/1 Running 0 6m49s app=webcluster
webcluster-jna23 1/1 Running 0 6m49s app=webcluster
#拉伸
# 扩容到4个副本
kubectl scale replicaset webcluster --replicas 4
# 缩容回2个副本
kubectl scale replicaset webcluster --replicas 2
# 缩容到0,删除所有Pod
kubectl scale replicaset webcluster --replicas 0

2.测试功能
bash
# 对标签进行测试
[root@master controler]# kubectl apply -f repset.yml
[root@master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels master: Sat Apr 11 10:11:06 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-4sxz4 1/1 Running 0 13s app=webcluster
webcluster-lvtsn 1/1 Running 0 13s app=webcluster
webcluster-tbxq4 1/1 Running 0 9m23s app=webcluster
webcluster-tr5qk 1/1 Running 0 13s app=webcluster

二.deployment
Deployment 不直接管理 Pod,底层管理 ReplicaSet 副本集。
- 每修改一次 Deployment 模板(镜像、环境变量等),就会生成一个全新的 ReplicaSet
- 旧 ReplicaSet 保留,用于后续回滚;Pod 名字会带上
pod‑template‑hash,用来区分不同版本的副本集。
1.建立deployment控制器
bash
# 创建 Deployment
[root@master controler]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml > dep.yml
[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
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
# resources: {}
[root@master controler]# kubectl apply -f dep.yml
#监控部分显示效果
Every 1.0s: kubectl get pods --show-labels;echo ====;kubectl get replicase... master: Sat Apr 11 10:43:24 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-49kh5 1/1 Running 0 45s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-m2x2d 1/1 Running 0 45s app=webcluster,pod-template-hash=77c87d9946
====
NAME DESIRED CURRENT READY AGE
webcluster-77c87d9946 2 2 2 45s
#发布服务,暴露 Service
[root@master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
[root@master controler]# kubectl describe services webcluster
Name: webcluster
Namespace: default
Labels: app=webcluster
Annotations: <none>
Selector: app=webcluster
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.107.142.60
IPs: 10.107.142.60
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.6:80,10.244.1.9:80
Session Affinity: None
Internal Traffic Policy: Cluster
Events: <none>
#访问:
[root@master controler]# curl 10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

2.升级和回滚
bash
#升级
[root@master controler]# vim dep.yml
...
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v2 #升级为版本2
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>
#回滚
[root@master controler]# vim dep.yml
。。。。
spec:
minReadySeconds: 5
replicas: 2
selector:
matchLabels:
app: webcluster
# strategy: {}
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1 #回滚为版本1
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>



三.版本更新管理及优化
bash
[root@master controler]# vim dep.yml
spec:
minReadySeconds: 5
replicas: 6 #把pod数量设定为6方便观察
selector:
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured

1.查看更新策略信息
bash
[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 25% max unavailable, 25% max surge
# maxSurge:更新过程中,允许超出期望副本数的 Pod 最大数量。
# maxUnavailable:升级期间,允许不可用 Pod 最大数量。
# maxSurge、maxUnavailable可以写百分比,也可以写整数。
升级逻辑:
- 先创建新 Pod,等待就绪 +
minReadySeconds - 新 Pod 就绪之后,才删除旧 Pod
- 全程保证可用 Pod 数量不低于期望副本数,业务零中断。

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
# 查看Deployment版本历史
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
#暂停更新
[root@master controler]# kubectl rollout pause deployment webcluster
deployment.apps/webcluster paused
[root@master controler]# vim dep.yml
...
containers:
- image: myapp:v2
name: myapp
...
#执行kubectl apply -f dep.yml修改镜像为 v2,配置可以保存,但不会执行滚动升级,控制器不会创建新 ReplicaSet。历史版本列表不会新增 revision。
[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
deployment.apps/webcluster
REVISION CHANGE-CAUSE
8 <none>
9 <none>


四.DaemonSet
- 作用:每个节点运行一个 Pod,用于日志采集、监控代理、网络插件。
- 不写
replicas,Pod 数量 = 集群节点数。 - 更新策略:
RollingUpdate,maxUnavailable控制同时更新多少节点。 - 可以配合
nodeSelector,只在部分节点运行。
bash
[root@master controler]# kubectl create deployment daemonset --image myapp:v1 --dry-run=client -o yaml > daemonset.yml
[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
#另外开启一个主机node3,并设定在初始化集群时的所有设定确保所有服务的开启
#在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
[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加入集群后会在node3中立即运行指定的pod,其原因是因为运行了daemonset
五.Job控制器
Job 用来执行一次性任务,任务执行完成就结束,不会无限运行。
bash
[root@master controler]# kubectl create job job --image perl:5.34.0 --dry-run=client -o yaml > job.yml
[root@master controler]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
name: testjob
spec:
completions: 6 # 需要完成的任务总次数
parallelism: 2 # 同时并发运行的Pod数量
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
# 并发 2 个 Pod 运行,完成后继续启动新 Pod,直到完成 6 次成功任务。
# 任务全部完成后,Job 状态变为Completed,Pod 保留(不会自动删除)。
[root@k8s-master controller]# kubectl logs pods/testjob-4cdlr
this is testjob message

六.Cronjob控制器
CronJob 基于 Linux crontab 语法,定时创建 Job,周期性执行任务。
bash
[root@master controler]# kubectl create cronjob cronjob --image busybox --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
[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: '* * * * *' # cron表达式:每分钟执行一次
[root@master controler]# kubectl apply -f cronjob.yml #整分运行
[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

七.控制器总览汇总:
|------------|-------------------|-------------------------|
| 控制器 | 用途 | restartPolicy(Pod 重启策略) |
| Deployment | 长期业务应用,多副本,滚动升级回滚 | Always |
| ReplicaSet | 维持 Pod 副本数量,无版本管理 | Always |
| DaemonSet | 每个节点运行一个 Pod,守护进程 | Always |
| Job | 一次性任务,执行完成结束 | Never / OnFailure |
| CronJob | 定时周期性任务,定时创建 Job | OnFailure / Never |
- Deployment、DaemonSet 是长期运行 的,
restartPolicy一般用Always(无论容器退出码是什么,总是重启容器) - Job/CronJob 是任务型 ,一般用
Never(无论什么情况,永远不重启容器)或OnFailure(只有容器异常失败退出,退出码≠0才重启;正常退出不重启),任务完成就结束