kubernetes-常见的控制器有哪些?
作者:雪庆华
原创作品,严禁转载!
目录
1. 什么是控制器?
(Control Loop)来确保集群的实际状态与用户期望的状态保持一致。控制器是 Kubernetes 中实现自动化管理和编排的关键机制。
Kubernetes 中的控制器通过控制循环不断检查集群的实际状态,并将其与用户期望的状态进行比较。如果发现不一致,控制器会采取行动来调整集群状态,从而实现自动化的资源管理和编排。常见的控制器如 ReplicaSet、Deployment、StatefulSet 和 DaemonSet 等,分别适用于不同的应用场景,帮助用户高效地管理容器化应用。
2.控制器之replicationcontrollers
rc控制器的使用场景:用于控制指定Pod副本数量始终存活。
rc的简称称为"rc",表示为副本控制器。
案例展示:
1 编写资源清单
[root@master231 replicationcontrollers]# cat 01-rc-xiuxian.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: huazai-rc
labels:
school: huazai
spec:
# 创建Pod的副本数量
replicas: 3
# selector选择器,当前控制器关联的Pod标签,如果不写,则默认为template字段中的pod标签。
selector:
apps: xiuxian
address: shahe
# 定义Pod的模板
template:
metadata:
labels:
apps: xiuxian
address: shahe
class: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1
[root@master231 replicationcontrollers]#
2 创建资源
[root@master231 replicationcontrollers]# kubectl apply -f 01-rc-xiuxian.yaml
replicationcontroller/huazai-rc created
[root@master231 replicationcontrollers]#
[root@master231 replicationcontrollers]# kubectl get rc,pods -o wide --show-labels
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS
replicationcontroller/huazai-rc 3 3 3 10s c1 registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1 address=shahe,apps=xiuxian school=huazai
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/huazai-rc-bmkgb 1/1 Running 0 10s 10.100.1.18 worker232 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/huazai-rc-n9hp5 1/1 Running 0 10s 10.100.2.57 worker233 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/huazai-rc-rw4xd 1/1 Running 0 10s 10.100.2.56 worker233 <none> <none> address=shahe,apps=xiuxian,class=v1
[root@master231 replicationcontrollers]#
3 删除Pod观察是否有指定Pod副本数量被拉起
[root@master231 replicationcontrollers]# kubectl delete pods --all
pod "huazai-rc-bmkgb" deleted
pod "huazai-rc-n9hp5" deleted
pod "huazai-rc-rw4xd" deleted
[root@master231 replicationcontrollers]#
[root@master231 replicationcontrollers]#
[root@master231 replicationcontrollers]# kubectl get rc,pods -o wide --show-labels
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS
replicationcontroller/huazai-rc 3 3 3 18s c1 registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1 address=shahe,apps=xiuxian school=huazai
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/huazai-rc-6txm4 1/1 Running 0 4s 10.100.2.59 worker233 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/huazai-rc-njlgd 1/1 Running 0 4s 10.100.2.58 worker233 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/huazai-rc-qgldt 1/1 Running 0 4s 10.100.1.19 worker232 <none> <none> address=shahe,apps=xiuxian,class=v1
[root@master231 replicationcontrollers]#
[root@master231 replicationcontrollers]#
4 删除rc资源会级联删除其创建的Pod
[root@master231 replicationcontrollers]# kubectl delete rc --all
replicationcontroller "huazai-rc" deleted
[root@master231 replicationcontrollers]#
[root@master231 replicationcontrollers]# kubectl get rc,pods -o wide --show-labels
No resources found in default namespace.
3.控制器之ReplicaSet
和rc功能类似,也是保证pod副本数量始终存活,相比于rc更加轻量级,功能更加完善。
常用功能labels:KEY可以匹配多个velue
可以匹配到所有KEY,不会浪费资源
案例展示:
2.实战案例
1 rs替代rc功能
[root@master231 replicasets]# cat 01-rs-matchLabels-xiuxian.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-xiuxian
labels:
school: huazai
spec:
replicas: 5
selector:
# 基于标签匹配Pod
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
address: shahe
class: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1
[root@master231 replicasets]#
2 rs可以实现rc实现不了的功能
2.1 测试环境准备
[root@master231 replicasets]# kubectl run test01 --image=registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1 -l apps=v1
pod/test01 created
[root@master231 replicasets]#
[root@master231 replicasets]# kubectl run test02 --image=registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v2 -l apps=v2
pod/test02 created
[root@master231 replicasets]#
[root@master231 replicasets]# kubectl get pods -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
test01 1/1 Running 0 13s 10.100.2.71 worker233 <none> <none> apps=v1
test02 1/1 Running 0 7s 10.100.2.72 worker233 <none> <none> apps=v2
[root@master231 replicasets]#
2.2 编写资源清单
[root@master231 replicasets]# cat 02-rs-matchExpressions-xiuxian.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-xiuxian
labels:
school: huazai
spec:
replicas: 5
selector:
# 基于标签表达式匹配Pod标签
matchExpressions:
# 声明标签的key
- key: apps
# 声明标签的value,可以有多个值
values:
- xiuxian
- v1
- v2
# 表示key和value之间的映射关系,有效值为: In, NotIn, Exists and DoesNotExist
operator: In
template:
metadata:
labels:
apps: xiuxian
address: shahehe
class: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1
[root@master231 replicasets]#
2.3 创建测试
[root@master231 replicasets]# kubectl apply -f 02-rs-matchExpressions-xiuxian.yaml
replicaset.apps/rs-xiuxian created
[root@master231 replicasets]#
[root@master231 replicasets]# kubectl get rs,po -o wide --show-labels
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS
replicaset.apps/rs-xiuxian 5 5 5 24s c1 registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1 apps in (v1,v2,xiuxian) school=huazai
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/rs-xiuxian-88sxz 1/1 Running 0 24s 10.100.1.27 worker232 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/rs-xiuxian-qtzrb 1/1 Running 0 24s 10.100.1.28 worker232 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/rs-xiuxian-z9d8b 1/1 Running 0 24s 10.100.2.73 worker233 <none> <none> address=shahe,apps=xiuxian,class=v1
pod/test01 1/1 Running 0 5m47s 10.100.2.71 worker233 <none> <none> apps=v1
pod/test02 1/1 Running 0 5m41s 10.100.2.72 worker233 <none> <none> apps=v2
[root@master231 replicasets]#
4.控制器之Deployment
deploy底层基于rs实现Pod副本数量的控制,deploy支持"声明式"更新。
案例展示:
1.编写资源清单
[root@master231 deployments]# cat 02-deploy-matchExpressions-xiuxian.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rs-xiuxian
labels:
school: huazai007
spec:
replicas: 5
selector:
matchExpressions:
- key: apps
values:
- xiuxian
- v1
- v2
operator: In
template:
metadata:
labels:
apps: xiuxian
address: shahe
class: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai007-k8s/apps:v1
[root@master231 deployments]#
2.验证
[root@master231 deployments]# kubectl apply -f 02-deploy-matchExpressions-xiuxian.yaml
deployment.apps/rs-xiuxian created
[root@master231 deployments]#
[root@master231 deployments]# kubectl get deploy,rs,pods --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/rs-xiuxian 5/5 5 5 15s school=huazai007
NAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/rs-xiuxian-7f85995bf4 5 5 5 15s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
NAME READY STATUS RESTARTS AGE LABELS
pod/rs-xiuxian-7f85995bf4-2c6zh 1/1 Running 0 15s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-8mrkf 1/1 Running 0 15s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-mqfrx 1/1 Running 0 15s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-r8qt8 1/1 Running 0 15s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-whcj5 1/1 Running 0 15s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
[root@master231 deployments]#
[root@master231 deployments]# kubectl delete pods --all
pod "rs-xiuxian-7f85995bf4-2c6zh" deleted
pod "rs-xiuxian-7f85995bf4-8mrkf" deleted
pod "rs-xiuxian-7f85995bf4-mqfrx" deleted
pod "rs-xiuxian-7f85995bf4-r8qt8" deleted
pod "rs-xiuxian-7f85995bf4-whcj5" deleted
[root@master231 deployments]#
[root@master231 deployments]#
3.删除后发现还在,并且生成rs,rs管理pod
[root@master231 deployments]# kubectl get deploy,rs,pods --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/rs-xiuxian 5/5 5 5 27s school=huazai007
NAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/rs-xiuxian-7f85995bf4 5 5 5 27s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
NAME READY STATUS RESTARTS AGE LABELS
pod/rs-xiuxian-7f85995bf4-52sc8 1/1 Running 0 5s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-87jqr 1/1 Running 0 5s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-fshlt 1/1 Running 0 5s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-prcx7 1/1 Running 0 5s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
pod/rs-xiuxian-7f85995bf4-smmvq 1/1 Running 0 5s address=shahe,apps=xiuxian,class=v1,pod-template-hash=7f85995bf4
[root@master231 deployments]#
[root@master231 deployments]# kubectl delete -f 02-deploy-matchExpressions-xiuxian.yaml
deployment.apps "rs-xiuxian" deleted
[root@master231 deployments]#
[root@master231 deployments]# kubectl get deploy,rs,pods --show-labels
No resources found in default namespace.
[root@master231 deployments]#
**对比rc,rs,deploy的关系:**
相同点:
都能控制Pod副本数量始终存活。
不同点:
rc标签选择器比较单一,key和value只能成对出现。
rs相比rc而言,功能更加强大,key的values可以对应多个值,即一对多。
deploy底层基于rs实现pod副本控制,且相比于rc,rs而言,deploy还支持声明式更新。
5.控制器之DaemonSet
daemonsets:可以让每个worker节点有且仅有一个Pod运行。和deploy控制器一样,都支持声明式更新。
案例展示:
1.编写资源清单
[root@master231 daemonsets]# cat 01-ds-xiuxian.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-xiuxain
labels:
school: huazai007
spec:
selector:
matchLabels:
apps: xiuxian
template:
metadata:
labels:
apps: xiuxian
address: shahe
class: v1
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1
[root@master231 daemonsets]#
2.生成资源,查看
[root@master231 daemonsets]# kubectl apply -f 01-ds-xiuxian.yaml
daemonset.apps/ds-xiuxain created
[root@master231 daemonsets]#
[root@master231 daemonsets]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-xiuxain-nk5mt 1/1 Running 0 3s 10.100.1.49 worker232 <none> <none>
ds-xiuxain-xvkck 1/1 Running 0 3s 10.100.2.105 worker233 <none> <none>
**DaemonSet的使用场景**
1. 日志收集:在每个节点上运行日志收集代理,例如Fluentd或Logstash,将节点上的日志发送到集中的存储或分析系统。
2. 监控服务:在每个节点上运行监控代理,例如Prometheus Node Exporter或Zabbix Agent,用于收集节点和容器的度量指标。
3. 存储服务:在每个节点上运行存储服务,例如Gluster或Ceph,用于提供分布式存储。
4. 网络代理:在每个节点上运行网络代理,实现网络隔离、负载均衡等功能。
6. 控制器之jobs
jobs用于实现一次性任务。
对于jobs控制器要声明重启策略,且不支持ALways
案例展示:
[root@master231 jobs]# cat 01-jobs-xiuxian.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: jobs-xiuxian
labels:
school: huazai007
spec:
template:
metadata:
labels:
apps: xiuxian
address: shahe
class: v1
spec:
restartPolicy: OnFailure
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1
command:
- sleep
- "5"
[root@master231 jobs]#
[root@master231 jobs]# kubectl apply -f 01-jobs-xiuxian.yaml
job.batch/jobs-xiuxian created
[root@master231 jobs]#
[root@master231 jobs]# kubectl get jobs,pods -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job.batch/jobs-xiuxian 1/1 8s 9s c1 registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1 controller-uid=fb050d86-7c36-46fc-ae23-b76b17ad9dab
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/jobs-xiuxian-2zlrn 0/1 Completed 0 9s 10.100.2.110 worker233 <none> <none>
[root@master231 jobs]#
**使用场景:**
1. 批处理任务:Job控制器非常适合执行一次性批处理任务,例如数据导入、导出、定时统计等。
示例:每天定时拉取外部数据并导入到数据库中。
2. 数据迁移:用于执行数据迁移任务,这些任务通常是一次性的。
示例:将数据从一个存储系统迁移到另一个存储系统。
3. 初始化任务:在应用启动之前执行一些初始化操作,例如数据库迁移、缓存预热等。
示例:在新的应用部署之前执行数据库模式更新。
4. 并行计算任务:Job控制器支持并行执行多个任务实例,适用于大规模数据计算或科学计算任务。
示例:进行大数据分析或机器学习模型训练。
5. 清理任务:定期或一次性地清理不需要的数据或缓存。
示例:删除过期的日志文件或缓存。
7.控制器之CronJob
CronJob:cj底层基于jobs控制实现pod创建,用于定义周期性任务。
案例展示:
1. 书写资源清单
[root@master231 cronjobs]# cat 01-cj-xiuxian.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cj-xiuxian
labels:
school: huazai007
spec:
# 周期性调度Jobs控制器,参考: https://en.wikipedia.org/wiki/Cron
schedule: "* * * * *"
# 定义Job模板,而非Pod模板
jobTemplate:
spec:
# 定义Pod模板
template:
metadata:
labels:
apps: xiuxian
spec:
restartPolicy: Never
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1
command:
- /bin/sh
- -c
- date -R; echo "你爱我,我爱你,啦啦啦啦甜蜜蜜~"
[root@master231 cronjobs]#
[root@master231 cronjobs]# kubectl apply -f 01-cj-xiuxian.yaml
cronjob.batch/cj-xiuxian created
[root@master231 cronjobs]#
[root@master231 cronjobs]# kubectl get cj,jobs,pods -o wide
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR
cronjob.batch/cj-xiuxian * * * * * False 0 21s 66s c1 registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1 <none>
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job.batch/cj-xiuxian-28988901 1/1 3s 21s c1 registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1 controller-uid=af0d20c9-f179-4296-b246-07e447313572
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/cj-xiuxian-28988901-82wkt 0/1 Completed 0 21s 10.100.2.112 worker233 <none> <none>
[root@master231 cronjobs]#
[root@master231 cronjobs]#
[root@master231 cronjobs]# kubectl logs cj-xiuxian-28988901-82wkt
Wed, 12 Feb 2025 04:21:00 +0000
你爱我,我爱你,啦啦啦啦甜蜜蜜~
[root@master231 cronjobs]#
[root@master231 cronjobs]#
2.从下面的时间可以看出,每分钟执行了一次
[root@master231 cronjobs]# kubectl get cj,jobs,pods -o wide
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR
cronjob.batch/cj-xiuxian * * * * * False 0 17s 2m2s c1 registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1 <none>
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job.batch/cj-xiuxian-28988901 1/1 3s 77s c1 registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1 controller-uid=af0d20c9-f179-4296-b246-07e447313572
job.batch/cj-xiuxian-28988902 1/1 3s 17s c1 registry.cn-hangzhou.aliyuncs.com/huazai-k8s/apps:v1 controller-uid=acb89a9a-746c-4786-95d3-5b1dd07b1cbe
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/cj-xiuxian-28988901-82wkt 0/1 Completed 0 77s 10.100.2.112 worker233 <none> <none>
pod/cj-xiuxian-28988902-g8p6n 0/1 Completed 0 17s 10.100.2.113 worker233 <none> <none>
[root@master231 cronjobs]#
[root@master231 cronjobs]# kubectl logs cj-xiuxian-28988902-g8p6n
Wed, 12 Feb 2025 04:22:00 +0000
你爱我,我爱你,啦啦啦啦甜蜜蜜~
[root@master231 cronjobs]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)