kubernetes-常见的控制器有哪些?

作者:雪庆华
原创作品,严禁转载!

目录

  1. 什么是控制器?
  2. 控制器之replicationcontrollers
  3. 控制器之ReplicaSet
  4. 控制器之Deployment
  5. 控制器之DaemonSet
  6. 控制器之jobs
  7. 控制器之CronJob

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]# 
posted @   悍匪屋  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示