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 实现自动化和自愈能力的核心,通过内置或自定义控制器,用户可以简化集群管理,确保应用始终按预期运行。

相关推荐
tan180°3 小时前
Linux网络HTTP(中)(8)
linux·网络·http
半梦半醒*3 小时前
搭建Jenkins
linux·运维·centos·tomcat·jenkins·运维开发
OneSea4 小时前
Debian编译Qt5
linux·qt
Wang's Blog4 小时前
Linux小课堂: 系统监控与进程管理之深入解析 w、ps 与 top 命令
linux·运维·服务器
曾凡宇先生5 小时前
openEuler安装jdk,nginx,redis
linux·开发语言·数据库·openeuler
_OP_CHEN5 小时前
Linux系统编程:(三)基础指令详解(2)
linux·man·more·cat·linux指令·cp·whereis
安卓开发者5 小时前
Docker常用镜像使用指南:从入门到实战
运维·docker·容器
Lenyiin5 小时前
《 Linux 点滴漫谈: 三 》掌控终端:让 Shell 成为你的系统魔杖
linux·运维·服务器·lenyiin
霖.245 小时前
Docker常见问题
服务器·docker·云原生·容器