k8s中的控制器
k8s中的控制器
控制器概念
在 Kubernetes(k8s)中,控制器(Controllers) 是核心组件之一,它们通过监控集群状态并持续调整以达到用户期望的目标状态(Desired State),实现了集群的自动化管理。控制器遵循 “声明式 API” 理念,即用户只需定义目标状态,控制器负责协调实际状态向目标状态靠近。
控制器的核心作用
-
监控:通过 API Server 持续监听资源对象(如 Pod、Deployment 等)的状态变化。
-
对比:将实际状态与用户定义的目标状态(在 YAML/JSON 配置中声明)进行对比。
-
调谐(Reconciliation):当实际状态与目标状态不一致时,执行操作(如创建 / 删除 Pod、扩缩容等),使实际状态趋近于目标状态。
常见的控制器
ReplicaSet 控制器
-
作用:确保集群中始终运行指定数量的 Pod 副本,是 Deployment 的底层依赖。
-
注意:用户通常不直接操作 ReplicaSet,而是通过 Deployment 管理(Deployment 会自动创建和控制 ReplicaSet)。
[root@master ~]# vim replicaset.yml [root@master ~]# kubectl apply -f replicaset.yml replicaset.apps/replicaset created[root@master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSreplicaset-flqz8 1/1 Running 0 14s app=myappreplicaset-jrpgr 1/1 Running 0 14s app=myapp[root@master ~]# kubectl label pod replicaset-flqz8 app=lpy --overwritepod/replicaset-flqz8 labeled[root@master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSreplicaset-cb84t 1/1 Running 0 4s app=myappreplicaset-flqz8 1/1 Running 0 105s app=lpyreplicaset-jrpgr 1/1 Running 0 105s app=myapp[root@master ~]# kubectl label pod replicaset-flqz8 app-pod/replicaset-flqz8 unlabeled[root@master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSreplicaset-cb84t 1/1 Running 0 34s app=myappreplicaset-flqz8 1/1 Running 0 2m15s <none>replicaset-jrpgr 1/1 Running 0 2m15s app=myapp[root@master ~]# kubectl delete pods replicaset-cb84tpod "replicaset-cb84t" deleted#自愈[root@master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSreplicaset-flqz8 1/1 Running 0 3m20s <none>replicaset-jrpgr 1/1 Running 0 3m20s app=myappreplicaset-tp2w9 1/1 Running 0 4s app=myapp
Deployment 控制器
-
作用:管理无状态应用,通过控制 ReplicaSet 实现 Pod 的创建、更新、回滚和扩缩容。
-
核心功能:
-
确保指定数量的 Pod 副本(Replicas)始终运行。
-
支持滚动更新(Rolling Update)和重建更新(Recreate)策略,实现零停机升级。
-
可回滚到历史版本(基于 ReplicaSet 的历史记录)。
-
-
适用场景:Web 服务、API 服务等无状态应用。
[root@master ~]# vim deployment.yml[root@master ~]# kubectl apply -f deployment.ymldeployment.apps/deployment created[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdeployment-5d886954d4-4l2cg 1/1 Running 0 16s 10.244.1.13 node1 <none> <none>deployment-5d886954d4-8m7r9 1/1 Running 0 16s 10.244.2.18 node2 <none> <none>deployment-5d886954d4-czt8r 1/1 Running 0 16s 10.244.2.19 node2 <none> <none>deployment-5d886954d4-ktpd8 1/1 Running 0 16s 10.244.1.12 node1 <none> <none>[root@master ~]# curl 10.244.1.13Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>[root@master ~]# vim deployment.yml[root@master ~]# kubectl apply -f deployment.ymldeployment.apps/deployment configured[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdeployment-5d886954d4-4l2cg 0/1 Terminating 0 5m40s <none> node1 <none> <none>deployment-5d886954d4-8m7r9 1/1 Running 0 5m40s 10.244.2.18 node2 <none> <none>deployment-7f4786db9c-2hw94 0/1 ContainerCreating 0 2s <none> node1 <none> <none>deployment-7f4786db9c-66nvl 1/1 Running 0 9s 10.244.2.20 node2 <none> <none>deployment-7f4786db9c-gc9v5 1/1 Running 0 9s 10.244.1.14 node1 <none> <none>deployment-7f4786db9c-hncht 1/1 Running 0 2s 10.244.2.21 node2 <none> <none>[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdeployment-7f4786db9c-2hw94 1/1 Running 0 26s 10.244.1.15 node1 <none> <none>deployment-7f4786db9c-66nvl 1/1 Running 0 33s 10.244.2.20 node2 <none> <none>deployment-7f4786db9c-gc9v5 1/1 Running 0 33s 10.244.1.14 node1 <none> <none>deployment-7f4786db9c-hncht 1/1 Running 0 26s 10.244.2.21 node2 <none> <none>[root@master ~]# curl 10.244.1.15Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
DaemonSet 控制器
-
作用:确保集群中的所有节点(或指定节点) 都运行一个相同的 Pod 副本。
-
核心功能:
-
新节点加入集群时,自动在该节点上创建 Pod;节点移除时,自动删除 Pod。
-
可通过节点选择器(NodeSelector)指定仅在特定节点运行。
-
-
适用场景:日志收集(如 Fluentd、Logstash)、监控代理(如 Prometheus Node Exporter)、网络插件(如 Calico)等。
[root@master~]# cat daemonset-example.ymlapiVersion: apps/v1kind: DaemonSetmetadata:name: daemonset-examplespec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:tolerations: #对于污点节点的容忍- effect: NoScheduleoperator: Existscontainers:- name: nginximage: nginx[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdaemonset-87h6s 1/1 Running 0 47s 10.244.0.8 k8s-master <none> <none>daemonset-n4vs4 1/1 Running 0 47s 10.244.2.38 k8s-node2 <none> <none>daemonset-vhxmq 1/1 Running 0 47s 10.244.1.40 k8s-node1 <none> <none>
Job 控制器
-
作用:管理一次性任务(任务完成后自动终止),确保任务成功执行完成。
-
核心功能:
-
任务完成(Pod 成功终止)后,Job 停止工作,保留 Pod 日志供查看。
-
支持并行执行(通过
parallelism
配置并行 Pod 数量)。
-
-
适用场景:数据备份、批处理计算、一次性脚本执行等。
CronJob 控制器
-
作用:管理定时任务(基于时间调度的 Job),类似 Linux 的
crontab
。 -
核心功能:
-
按 cron 表达式(如
0 */3 * * *
表示每 3 小时执行一次)触发 Job。 -
支持配置任务执行历史保留策略。
-
-
适用场景:定时备份、定时数据清理、周期性报表生成等。
控制器的工作原理
所有控制器都遵循 “调谐循环(Reconciliation Loop)” 逻辑:
-
观察(Observe):通过 API Server 获取资源的实际状态(如当前运行的 Pod 数量)。
-
分析(Analyze):对比实际状态与目标状态(如用户定义的
replicas: 3
),判断是否存在差异。 -
行动(Act):若存在差异,执行操作(如创建新 Pod、删除多余 Pod)以消除差异。
这个过程会持续运行,确保集群状态始终与用户定义的目标一致。
自定义控制器
除了内置控制器,用户还可以通过 Kubernetes API 扩展机制(如 Operator SDK、Kubebuilder)开发自定义控制器,以管理特定业务场景的资源(如数据库集群、AI 模型训练任务等)。自定义控制器通常与自定义资源(CRD,CustomResourceDefinition) 结合使用,实现业务逻辑的自动化。
总结来说,控制器是 Kubernetes 实现自动化和自愈能力的核心,通过内置或自定义控制器,用户可以简化集群管理,确保应用始终按预期运行。