云原生——k8s的控制器
1 什么是控制器
Kubernetes控制器是集群的“自动运维大脑”,它通过一个永不停止的监控与调整循环,确保你期望的应用状态始终得到维持。它的核心逻辑可以概括为:监控实际状态 → 对比期望状态 → 执行调整操作,让现实向理想靠拢。
例如:你可以把它想象成一个智能恒温器:你设定好期望温度(期望状态),恒温器(控制器)持续测量室温(当前状态),如果太冷或太热,就会自动启动加热或制冷(执行操作),直到温度达标。
2 控制器常用的类型

3 Replicaset控制器

ReplicaSet 的职责非常纯粹和单一:确保集群中始终有指定数量的、完全相同的 Pod 副本在运行。它的工作逻辑就是一个简单的“多退少补”.,工作原理:通过“标签选择器”来管理
- 多了:如果 Pod 数量超过了期望值(例如你期望3个,但实际有4个),它会随机终止多余的 Pod。
- 少了:如果 Pod 数量少于期望值(例如期望3个,但实际只有2个),它会立即创建新的 Pod 来补充。
重要提示:标签选择器的设计是不可变更的。一旦 ReplicaSet 创建,你就无法修改它的 selector,如果尝试修改,Kubernetes API 会直接拒绝
3.1 replicaset参数说明
3.2 建立控制器
[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 #定义控制的种类为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
#打开一个新的会话
[root@k8s-master ~]# watch -n 1 kubectl get pods --show-labels
Every 1.0s: kubectl get pods --show-labels k8s-master: Wed Aug 26 19:37:27 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-9zrln 1/1 Running 0 103s app=webcluster
webcluster-d4xfj 1/1 Running 0 85s app=webcluster
#拉伸————改变期望数字,ReplicaSet会根据数字来减少或增加pod数量
[root@k8s-master controler]# kubectl scale replicaset webcluster --replicas 4
Every 1.0s: kubectl get pods --show-labels k8s-master: Wed Aug 26 19:38:11 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-9zrln 1/1 Running 0 2m27s app=webcluster
webcluster-d4xfj 1/1 Running 0 2m9s app=webcluster
webcluster-gp28q 1/1 Running 0 2m27s app=webcluster
webcluster-zhkpx 1/1 Running 0 2m9s app=webcluster
[root@k8s-master controler]#kubectl scale replicaset webcluster --replicas 2
[root@k8s-master controler]#kubectl scale replicaset webcluster --replicas 0
[root@master controler]# vim repset.yml
。。。。
spec:
replicas: 4
。。。。
[root@master controler]# kubectl apply -f repset.yml
[root@master ~]# watch -n 1 kubectl get pods --show-labels
webcluster-gp28q 1/1 Running 0 7m49s app=webcluster
webcluster-kxqsr 1/1 Running 0 108s app=webcluster
webcluster-nqhrs 1/1 Running 0 108s app=webcluster
webcluster-qlzv7 1/1 Running 0 73s app=webcluster
#当我将一个pod的标签删掉,Replicaset会新添加一个pod进来
[root@k8s-master controler]# kubectl label pods webcluster-gp28q app-

4 deployment 控制器

- 保证副本数量:像 ReplicaSet 一样,确保指定数量的 Pod 始终在运行。
- 支持声明式更新:你只需要在 YAML 文件中修改期望的状态(例如,更改镜像版本),Deployment 就会自动将集群的当前状态平滑地调整为你指定的新状态。
- 实现滚动更新:在更新过程中,它会逐步用新版本的 Pod 替换旧版本的 Pod,确保服务在更新期间不会中断。
- 支持版本回滚:每次更新都会被记录为一个“版本”,如果新版本有问题,你可以一键回滚到之前的任意版本。
- 提供暂停与恢复:你可以在执行复杂的更新操作(比如同时修改多个配置)前暂停更新,等所有修改完成后再恢复,避免触发多次不必要的更新。
工作原理:通过“版本化 ReplicaSet”实现平滑更新,当deployment更新时,会新建一个replicaset控制器,根据策略,新replicaset每起一个pod,旧的replicaset就会关闭一个pod,更新结束后旧的控制器不删除
4.1 建立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@k8s-master deployment]# kubectl expose deployment webcluster --port 80 --target-port 80
service/webcluster exposed
#监控部分显示效果
[root@k8s-master ~]# watch -n 1 " kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps"
Every 1.0s: kubectl get pods --show-labels;echo ====;kubectl get replicasets.apps k8s-master: Wed Aug 26 19:53:05 2026
NAME READY STATUS RESTARTS AGE LABELS
webcluster-77c87d9946-g6z6g 1/1 Running 0 2m45s app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-kz5bw 1/1 Running 0 2m45s app=webcluster,pod-template-hash=77c87d9946
====
NAME DESIRED CURRENT READY AGE
webcluster-77c87d9946 2 2 2 2m45s
#发布服务
[root@k8s-master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
service/webcluster exposed
[root@k8s-master controler]# kubectl describe services webcluster
Name: webcluster
Namespace: default
Labels: app=webcluster
Annotations: <none>
Selector: app=webcluster
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.107.99.174
IPs: 10.107.99.174
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32320/TCP
Endpoints: 10.244.2.19:80,10.244.2.20:80
Session Affinity: None
External Traffic Policy: Cluster
Internal Traffic Policy: Cluster
Events: <none>
[root@k8s-master controler]# curl 10.107.99.174
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
4.2 升级和回滚
升级
#升级
[root@k8s-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:v2 #将版本升级为2
name: myapp
# resources: {}
[root@k8s-master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@k8s-master controler]# curl 10.107.99.174
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@k8s-master controler]#

回滚
[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
deployment.apps/webcluster configured
[root@k8s-master controler]# curl 10.107.99.174
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4.3 版本更新管理及优化
[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
查看更新策略信息
[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 25% max unavailable, 25% max surge

设定更新策略
[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
[root@k8s-master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy: 0 max unavailable, 1 max surge

更新暂停和恢复
暂停
[root@k8s-master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
3 <none>
4 <none>
[root@master controler]# kubectl rollout pause deployment webcluster #暂停更新
deployment.apps/webcluster paused
[root@master controler]# vim dep.yml
。。。
containers:
- image: myapp:v2
name: myapp
。。。
[root@master controler]# kubectl apply -f dep.yml #执行成功。但更新过程在监控中没出现
deployment.apps/webcluster configured
#但是版本没有发生变化
[root@k8s-master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION CHANGE-CAUSE
3 <none>
4 <none>
[root@k8s-master controler]# curl 10.107.99.174
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
恢复
[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
4 <none>
5 <none>

5 DaemonSet控制器

5.1 建立DaemonSet控制器
[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
[root@k8s-master controler]# kubectl apply -f daemonset.yml
daemonset.apps/daemonset created

#另外开启一个主机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
#可以在master中观察pod的状态
[root@k8s-master deployment]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ceph Ready <none> 5s v1.35.8
k8s-master Ready control-plane 5d8h v1.35.8
k8s-node1 Ready <none> 5d8h v1.35.8
k8s-node2 Ready <none> 5d8h v1.35.8
[root@k8s-master deployment]# kubectl get pods
NAME READY STATUS RESTARTS AGE
daemonset-62t2b 1/1 Running 0 20s
daemonset-g67jl 1/1 Running 0 20m
daemonset-r665j 1/1 Running 0 4m30s
6 Job控制器

Job 控制器 是 Kubernetes 中的一个核心控制器,专门用于处理一次性任务(Batch Jobs)或定时任务(配合 CronJob),它确保 Pod 能够成功完成指定数量的任务后退出(Pod 状态变为 Completed),而不是像 Deployment 那样保持 Pod 长期运行。
[root@k8s-master controler]# kubectl create job job --image busybox --dry-run=client -o yaml > job.yml
[root@k8s-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
[root@k8s-master controler]# kubectl logs pods/testjob-ks8n8
this is testjob message

7 Cronjob控制器

CronJob 控制器是用来管理定时任务的核心组件。它的主要作用是在指定的时间点或周期性地创建并执行 Job(任务),确保任务按计划运行,CronJob 本身并不直接运行 Pod,它的工作流程是一个“双层接力”
[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: '* * * * *'
[root@k8s-master controler]# kubectl apply -f cronjob.yml
cronjob.batch/cronjob created
[root@k8s-master controler]# kubectl get cronjobs.batch
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob * * * * * <none> False 0 13s 87s
[root@master controler]# kubectl logs cronjob-29795803-ks9pk
hello timinglee

更多推荐
所有评论(0)