k8s中的控制器

k8s中的控制器

控制器概念

在 Kubernetes(k8s)中,控制器(Controllers) 是核心组件之一,它们通过监控集群状态并持续调整以达到用户期望的目标状态(Desired State),实现了集群的自动化管理。控制器遵循 "声明式 API" 理念,即用户只需定义目标状态,控制器负责协调实际状态向目标状态靠近。

控制器的核心作用

  • 监控:通过 API Server 持续监听资源对象(如 Pod、Deployment 等)的状态变化。

  • 对比:将实际状态与用户定义的目标状态(在 YAML/JSON 配置中声明)进行对比。

  • 调谐(Reconciliation):当实际状态与目标状态不一致时,执行操作(如创建 / 删除 Pod、扩缩容等),使实际状态趋近于目标状态。

常见的控制器

ReplicaSet 控制器

  • 作用:确保集群中始终运行指定数量的 Pod 副本,是 Deployment 的底层依赖。

  • 注意:用户通常不直接操作 ReplicaSet,而是通过 Deployment 管理(Deployment 会自动创建和控制 ReplicaSet)。

    bash 复制代码
    [root@master ~]# vim replicaset.yml 
     [root@master ~]# kubectl apply -f replicaset.yml 
     replicaset.apps/replicaset created
     [root@master ~]# kubectl get pods  --show-labels
     NAME               READY   STATUS    RESTARTS   AGE   LABELS
     replicaset-flqz8   1/1     Running   0          14s   app=myapp
     replicaset-jrpgr   1/1     Running   0          14s   app=myapp
     [root@master ~]# kubectl label pod replicaset-flqz8 app=lpy --overwrite
     pod/replicaset-flqz8 labeled
     [root@master ~]# kubectl get pods  --show-labels
     NAME               READY   STATUS    RESTARTS   AGE    LABELS
     replicaset-cb84t   1/1     Running   0          4s     app=myapp
     replicaset-flqz8   1/1     Running   0          105s   app=lpy
     replicaset-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-labels
     NAME               READY   STATUS    RESTARTS   AGE     LABELS
     replicaset-cb84t   1/1     Running   0          34s     app=myapp
     replicaset-flqz8   1/1     Running   0          2m15s   <none>
     replicaset-jrpgr   1/1     Running   0          2m15s   app=myapp
     [root@master ~]# kubectl delete pods replicaset-cb84t
     pod "replicaset-cb84t" deleted
     #自愈
     [root@master ~]# kubectl get pods  --show-labels
     NAME               READY   STATUS    RESTARTS   AGE     LABELS
     replicaset-flqz8   1/1     Running   0          3m20s   <none>
     replicaset-jrpgr   1/1     Running   0          3m20s   app=myapp
     replicaset-tp2w9   1/1     Running   0          4s      app=myapp

Deployment 控制器

  • 作用:管理无状态应用,通过控制 ReplicaSet 实现 Pod 的创建、更新、回滚和扩缩容。

  • 核心功能:

    • 确保指定数量的 Pod 副本(Replicas)始终运行。

    • 支持滚动更新(Rolling Update)和重建更新(Recreate)策略,实现零停机升级。

    • 可回滚到历史版本(基于 ReplicaSet 的历史记录)。

  • 适用场景:Web 服务、API 服务等无状态应用。

bash 复制代码
[root@master ~]# vim deployment.yml
 [root@master ~]# kubectl apply -f deployment.yml
 deployment.apps/deployment created
 [root@master ~]# kubectl get pods -o wide
 NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
 deployment-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.13
 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
 [root@master ~]# vim deployment.yml
 [root@master ~]# kubectl apply -f deployment.yml
 deployment.apps/deployment configured
 [root@master ~]# kubectl get pods -o wide
 NAME                          READY   STATUS              RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
 deployment-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 wide
 NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
 deployment-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.15
 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

DaemonSet 控制器

  • 作用 :确保集群中的所有节点(或指定节点) 都运行一个相同的 Pod 副本。

  • 核心功能:

    • 新节点加入集群时,自动在该节点上创建 Pod;节点移除时,自动删除 Pod。

    • 可通过节点选择器(NodeSelector)指定仅在特定节点运行。

  • 适用场景:日志收集(如 Fluentd、Logstash)、监控代理(如 Prometheus Node Exporter)、网络插件(如 Calico)等。

bash 复制代码
[root@master~]# cat daemonset-example.yml
 apiVersion: apps/v1
 kind: DaemonSet
 metadata:
   name: daemonset-example
 spec:
   selector:
     matchLabels:
       app: nginx
   template:
     metadata:
       labels:
         app: nginx
     spec:
       tolerations:      #对于污点节点的容忍
       - effect: NoSchedule
         operator: Exists
       containers:
       - name: nginx
         image: nginx
 ​
 [root@master ~]# kubectl get pods  -o wide
 NAME              READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
 daemonset-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)" 逻辑:

  1. 观察(Observe):通过 API Server 获取资源的实际状态(如当前运行的 Pod 数量)。

  2. 分析(Analyze) :对比实际状态与目标状态(如用户定义的 replicas: 3),判断是否存在差异。

  3. 行动(Act):若存在差异,执行操作(如创建新 Pod、删除多余 Pod)以消除差异。

这个过程会持续运行,确保集群状态始终与用户定义的目标一致。

自定义控制器

除了内置控制器,用户还可以通过 Kubernetes API 扩展机制(如 Operator SDK、Kubebuilder)开发自定义控制器 ,以管理特定业务场景的资源(如数据库集群、AI 模型训练任务等)。自定义控制器通常与自定义资源(CRD,CustomResourceDefinition) 结合使用,实现业务逻辑的自动化。

总结来说,控制器是 Kubernetes 实现自动化和自愈能力的核心,通过内置或自定义控制器,用户可以简化集群管理,确保应用始终按预期运行。

相关推荐
A小辣椒4 小时前
TShark:基础知识
linux
AlfredZhao6 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao20 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix