pod的控制器

pod控制器

总结:

1.replicaset用来控制pod数量

2.Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod,Deployment管理ReplicaSet,ReplicaSet管理Pod,还可以用来控制replicaset的更新和回滚

3.daemonset用来控制每台主机需要运行的指定的pod

4.job执行一次pod当中的任务,执行完成之后结束pod

5.cronjob用来调度job周期性的执行pod的任务

1.Replicaset控制器

  1. ReplicaSet控制pod的数量

1.建立控制器

bash 复制代码
[root@master controler]# kubectl create deployment webcluster --image myapp:v1  --dry-run=client -o yaml  > repset.yml

[root@master controler]# vim repset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:										#元数据
  labels:										#控制器的标签
    app: webcluster
  name: webcluster								#控制器的名字
spec:											#控制器的期望状态
  replicas: 2									#pod数量
  selector:										#选择器,与模板标签一致
    matchLabels:								#匹配标签
      app: webcluster
#  strategy: {}									#资源限制
  template:										#模板
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@master controler]# kubectl apply -f repset.yml

#打开一个新的shell
[root@master ~]# watch -n 1 kubectl get pods   --show-labels
Every 1.0s: kubectl get pods --show-labels                                        master: Sat Apr 11 10:08:32 2026

NAME               READY   STATUS    RESTARTS   AGE     LABELS
webcluster-tbxq4   1/1     Running   0          6m49s   app=webcluster
webcluster-jna23   1/1     Running   0          6m49s   app=webcluster

2.测试功能

bash 复制代码
[root@master controler]# vim repset.yml
。。。。
spec:
  replicas: 4
。。。。

[root@master controler]# kubectl apply -f repset.yml

[root@master ~]# watch -n 1 kubectl get pods   --show-labels
Every 1.0s: kubectl get pods --show-labels                                        master: Sat Apr 11 10:11:06 2026

NAME               READY   STATUS    RESTARTS   AGE     LABELS
webcluster-4sxz4   1/1     Running   0          13s     app=webcluster
webcluster-lvtsn   1/1     Running   0          13s     app=webcluster
webcluster-tbxq4   1/1     Running   0          9m23s   app=webcluster
webcluster-tr5qk   1/1     Running   0          13s     app=webcluster

2.deployment

  1. Deployment运作在replicaset之上,可以控制pod更新,回滚

1.监控

bash 复制代码
[root@master ~]# watch -n 1 " kubectl get pods   --show-labels;echo ====;kubectl get replicasets.apps"

2.建立deployment控制器

bash 复制代码
[root@master controler]# kubectl create deployment webcluster --image myapp:v1  --dry-run=client -o yaml  > dep.yml
[root@master controler]# vim dep.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  minReadySeconds: 5
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
#  strategy: {}
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp
#        resources: {}

[root@master controler]# kubectl apply -f dep.yml

#监控部分显示效果
Every 1.0s:  kubectl get pods   --show-labels;echo ====;kubectl get replicase...  master: Sat Apr 11 10:43:24 2026

NAME                          READY   STATUS    RESTARTS   AGE   LABELS
webcluster-77c87d9946-49kh5   1/1     Running   0          45s   app=webcluster,pod-template-hash=77c87d9946
webcluster-77c87d9946-m2x2d   1/1     Running   0          45s   app=webcluster,pod-template-hash=77c87d9946
====
NAME                    DESIRED   CURRENT   READY   AGE
webcluster-77c87d9946   2         2         2       45s


#发布服务
[root@master controler]# kubectl expose deployment webcluster --port 80 --target-port 80
[root@master controler]# kubectl describe  services webcluster
Name:                     webcluster
Namespace:                default
Labels:                   app=webcluster
Annotations:              <none>
Selector:                 app=webcluster
Type:                     ClusterIP
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.107.142.60
IPs:                      10.107.142.60
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
Endpoints:                10.244.2.6:80,10.244.1.9:80
Session Affinity:         None
Internal Traffic Policy:  Cluster
Events:                   <none>

#访问:
[root@master controler]# curl  10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

3.升级和回滚

bash 复制代码
#升级
[root@master controler]# vim dep.yml
。。。。
spec:
  minReadySeconds: 5
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
#  strategy: {}
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v2			#升级为版本2
        name: myapp
。。。。
[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@master controler]# curl  10.107.142.60
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

#回滚
[root@master controler]# vim dep.yml
。。。。
spec:
  minReadySeconds: 5
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
#  strategy: {}
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1			#回滚为版本1
        name: myapp
。。。。
[root@master controler]# kubectl apply -f dep.yml
[root@master controler]# curl  10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

三.版本更新管理及优化

bash 复制代码
[root@master controler]# vim dep.yml
spec:
  minReadySeconds: 5
  replicas: 6				#把pod数量设定为6方便观察
  selector:

[root@master controler]# kubectl apply -f dep.yml
deployment.apps/webcluster configured

1.查看更新策略信息

b 复制代码
[root@master controler]# kubectl describe deployments.apps webcluster
RollingUpdateStrategy:  25% max unavailable, 25% max surge

2.设定更新策略

bash 复制代码
[root@master controler]# vim dep.yml
,,,,,,,
spec:
  minReadySeconds: 5
  replicas: 6
  selector:
    matchLabels:
      app: webcluster
  strategy:
    rollingUpdate:
      maxSurge: 1					#更新时pod数量最多比期望值多一个
      maxUnavailable: 0				#不能使用pod数量比期望值数量多0
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp


[root@master controler]# kubectl apply -f dep.yml

3.更新暂停和恢复

bash 复制代码
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
7         <none>
8         <none>

[root@master controler]# kubectl rollout pause deployment webcluster  #暂停更新
deployment.apps/webcluster paused
[root@master controler]# vim dep.yml
。。。
      containers:
      - image: myapp:v2
        name: myapp
。。。

[root@master controler]# kubectl apply -f dep.yml		#执行成功。但更新过程在监控中没出现
deployment.apps/webcluster configured


[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
7         <none>
8         <none>

[root@master controler]# kubectl rollout resume deployment webcluster			#开启更新
deployment.apps/webcluster resumed

[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
8         <none>
9         <none>

3.DaemonSet

  1. DaemonSet(守护进程集)确保每个节点都运行的pod
bash 复制代码
[root@master controler]# kubectl create deployment daemonset --image myapp:v1 --dry-run=client -o yaml  > daemonset.yml
[root@master controler]# vim daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: daemonset
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:
      containers:
      - image: myapp:v1
        name: myapp



#另外开启一个主机node3,并设定在初始化集群时的所有设定确保所有服务的开启
#在master中重新生成集群主机注册时需要的token
[root@master controler]# kubeadm token create  --print-join-command
kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927


[root@node3 ~]#  kubeadm join 172.25.254.100:6443 --token lqcz14.6f4krq91w75h58bt --discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927 --cri-socket  unix:///var/run/cri-dockerd.sock

#当node3加入集群后会在node3中立即群星指定的pod,其原因是因为运行了daemonset
#可以在master中观察pod的状态

4.Job控制器

  1. Job(一次性任务)处理pod里短暂的一次性任务,处理完成就停止pod
bash 复制代码
[root@master ~]# docker load -i perl-5.34.tar.gz
[root@master ~]# docker tag perl:5.34.0 reg.timinglee.org/library/perl:5.34.0
[root@master ~]# docker login  reg.timinglee.org -u admin
Password:
Login Succeeded
[root@master ~]# docker push reg.timinglee.org/library/perl:5.34.0

[root@master controler]# kubectl create job job --image perl:5.34.0 --dry-run=client -o yaml > job.yml
[root@master controler]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: testjob
spec:
  completions: 6								#一共完成任务数为6
  parallelism: 2								#每次并行完成2个
  backoffLimit: 4
  template:
    spec:
      containers:
      - image: busybox
        name: testjob
        command: ["/bin/sh", "-c"]
        args:
        - |
          echo this is testjob message
          sleep 10
      restartPolicy: Never						#关闭后不自动重启


[root@master controler]# kubectl apply -f job.yml
job.batch/job created

[root@k8s-master controller]# kubectl logs pods/testjob-4cdlr
this is testjob message

关于重启策略设置的说明:

如果指定为OnFailure,则job会在pod出现故障时重启容器

而不是创建pod,failed次数不变

如果指定为Never,则job会在pod出现故障时创建新的pod

并且故障pod不会消失,也不会重启,failed次数加1

如果指定为Always的话,就意味着一直重启2

5.Cronjob控制器

  1. CronJob(定时任务)运行在job的上层,周期性的执行pod的任务
bash 复制代码
[root@master controler]# kubectl create cronjob cronjob --image busybox  --schedule "* * * * *" --dry-run=client -o yaml > cronjob.yml
[root@master controler]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  jobTemplate:
    metadata:
      name: cronjob
    spec:
      template:
        spec:
          containers:
          - image: busybox
            name: cronjob
            command:
              - /bin/sh
              - -c
              - echo "hello timinglee"
          restartPolicy: OnFailure
  schedule: '* * * * *'

[root@master controler]# kubectl apply -f cronjob.yml		#整分运行

[root@master controler]# kubectl get cronjobs.batch
NAME      SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob   * * * * *   <none>     False     0        17s             70s

[root@master controler]# kubectl logs cronjob-29598241-pxggh
hello timinglee
相关推荐
DevOps老兵1 小时前
Kubernetes生产运维02:只会get pods还不够,kubectl排障工具箱怎么组合使用
运维·容器·kubernetes·kubectl·devops·故障排查·sre
陈聪.1 小时前
Kubernetes 中 Pod 的全面知识
云原生·容器·kubernetes
SakitamaX2 小时前
k8s中的控制器的使用
云原生·容器·kubernetes
IT 小阿姨(数据库)2 小时前
K8s v1.24.17 完整搭建文档(CentOS7 + containerd1.6.33 + Calico)
java·容器·kubernetes
蒲锘4 小时前
DevOps 实验项目笔记三 —— Kubernetes 集群部署阶段
笔记·kubernetes·devops·rbac
楠楠子呀5 小时前
从零构建高性能 WhatsApp 链接生成器与重定向服务:架构与路由解析
redis·python·容器·架构·flink·散列表·flume
qq_349447955 小时前
K8S中的Calico如何获取对应版本
云原生·容器·kubernetes
qq_11360149356 小时前
CopyEscape Docker容器逃逸(CVE-2026-17106)
运维·docker·容器
修先生6 小时前
WisQuery 一套开箱即用、可 Docker 一键部署的 智能问数 + 知识库 + 智能问答 一体化平台
运维·docker·容器