一.控制器常用类型

控制器名称                                      控制器用途
ReplicaSet ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行
Deployment 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力
DaemonSet DaemonSet 确保全指定节点上运行一个 Pod 的副本
Job 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束
CronJob Cron Job 创建基于时间调度的 Jobs。

二.replicaset控制器

1.replicaset功能

ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet

ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求

ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行

虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

  • 无滚动更新、无版本回滚、无发布历史

2.示例

#生成yml文件
[root@k8s-master ~]# kubectl create deployment replicaset --image myapp:v1 --dry-run=client -o yaml > replicaset.yml

[root@k8s-master ~]# vim replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset      #指定pod名称,一定小写,如果出现大写报错spec:
  replicas: 2           #指定维护pod数量为2
  selector:             #指定检测匹配方式
    matchLabels:        #指定匹配方式为匹配标签
      app: myapp        #指定匹配的标签为app=myapp
  template:             #模板,当副本数量不足时,会根据下面的模板创建pod副本    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master ~]# kubectl apply -f replicaset.yml replicaset.apps/replicaset created
[root@k8s-master ~]# kubectl get pods  --show-labels
NAME               READY   STATUS    RESTARTS   AGE   LABELS
replicaset-l4xnr   1/1     Running   0          96s   app=myapp replicaset-t2s5p   1/1     Running   0          96s   app=myapp

#恢复标签后
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app- 
[root@k8s2 pod]# kubectl get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-q2sq9   1/1     Running   0          3m14s   app=nginx replicaset-example-th24v   1/1     Running   0          3m14s   app=nginx replicaset-example-w7zpw   1/1     Running   0          3m14s   app=nginx

#replicaset自动控制副本数量,pod可以自愈
[root@k8s-master ~]# kubectl delete pods replicaset-t2s5p pod "replicaset-t2s5p" deleted
[root@k8s-master ~]# kubectl get pods --show-labels
NAME               READY   STATUS    RESTARTS   AGE     LABELS
replicaset-l4xnr   1/1     Running   0          5m43s   app=myapp replicaset-nxmr9   1/1     Running   0          15s     app=myapp

#回收资源
[root@k8s2 pod]# kubectl delete -f rs-example.yml

二.deployment 控制器

典型的应用场景:

来创建Pod和ReplicaSet滚动更新和回滚

扩容和缩容

暂停与恢复

1.建立控制器

[root@k8s-master ~]# kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webcluster.yml

root@k8s-master ~]# vim webcluster.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master ~]# kubectl apply -f webcluster.yml
deployment.apps/webcluster created
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-77c87d9946-2xl44   1/1     Running   0          3s
webcluster-77c87d9946-cd9zv   1/1     Running   0          3s
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
1         <none>


[root@k8s-master ~]# kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        24h
webcluster   NodePort    10.99.3.32   <none>        80:30713/TCP   2m54s


[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713/hostname.html
webcluster-77c87d9946-2xl44

2.更新业务版本

[root@k8s-master ~]# kubectl set image deployments webcluster myapp=myapp:v2
deployment.apps/webcluster image updated
[root@k8s-master ~]# kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite			#为此次更新设定标签

[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
webcluster-6c8b4bb9d7-hpxf7   1/1     Running   0          7s
webcluster-6c8b4bb9d7-kz46j   1/1     Running   0          8s
[root@k8s-master ~]# kubectl rollout history
daemonset    deployment   statefulset
[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

[2026-08-21 11:30.21]  ~
[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

3.版本回退

[root@k8s-master ~]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

[root@k8s-master ~]# kubectl rollout undo deployment webcluster --to-revision 3
deployment.apps/webcluster rolled back

[Administrator.DESKTOP-VJ307M3] ➤ curl http://172.25.254.100:30713
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

三.daemonset控制器

1.功能

DaemonSet 的典型用法:

在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。

在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。

在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等

一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用

2.daemonset 示例

[root@k8s2 pod]# 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@k8s-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>

#回收
[root@k8s2 pod]# kubectl delete -f daemonset-example.yml

四.job 控制器

1.功能

Job特点如下:

当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量

当成功结束的pod达到指定的数量时,Job将完成执行

2.job 控制器示例:

[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 6        #一共完成任务数为6      
  parallelism: 2        #每次并行完成2个
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]   计算Π的后2000位
      restartPolicy: Never                      #关闭后不自动重启
  backoffLimit: 4                               #运行失败后尝试4重新运行

[root@k8s2 pod]# kubectl apply -f job.yml

五.cronjob 控制器

1.功能

Cron Job 创建基于时间调度的 Jobs。

CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象

CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。

CronJob可以在特定的时间点(反复的)去运行job任务。

2.cronjob 控制器 示例

[root@k8s2 pod]# vim cronjob.yml apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
    template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster          restartPolicy: OnFailure
[root@k8s2 pod]# kubectl apply -f cronjob.yml

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐