k8s中的控制器管理

介绍

控制器用于管理 Pod,实现副本维持、自愈、扩缩容、更新,不直接操作 Pod

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的 Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资 源在运行中出现故障,它会基于指定策略重新编排Pod 。

常用类型

replicaset控制器

3.1功能

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

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

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

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

演示

复制代码
[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
  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
 
#拉伸
kubectl  scale replicaset webcluster --replicas 4
kubectl  scale replicaset webcluster --replicas 2
kubectl  scale replicaset webcluster --replicas 0

测试功能
复制代码
[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

deployment 控制器

功能

为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。

Deployment控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod

Deployment管理ReplicaSet,ReplicaSet管理

Pod Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法

在Deployment中ReplicaSet相当于一个版本

演示

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

建立deployment控制器

复制代码
[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>

升级和回滚

复制代码
#升级
[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>
复制代码
[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

.查看更新策略信息

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

设定更新策略

复制代码
[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

更新暂停和恢复

复制代码
[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>

daemonset控制器

功能

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时,也会为他们新增一个Pod,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有Pod。

演示

复制代码
[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的状态

job 控制器

功能

Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务

Job特点如下:

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

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

演示

复制代码
[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
  parallelism: 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

cronjob 控制器

功能

CronJob创建基于时间调度的 Jobs。

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

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

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

复制代码
[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
相关推荐
养海绵宝宝的小蜗1 小时前
【Kubernetes系列】控制器(Controller)全解:ReplicaSet、Deployment、DaemonSet、Job 与 CronJob
云原生·容器·kubernetes
nxb5561 小时前
云原生:控制器
java·开发语言·云原生
UseLessQQ1 小时前
云原生 kubenetes 控制器管理
云原生·kubernetes
是枚小菜鸡儿吖4 小时前
把视频教程变成可复习的笔记:Docker 部署 BiliNote,自动转写与总结
笔记·docker·容器
浪兎兎11 小时前
【Kubernetes 实战】(二)部署 Ruoyi-Cloud —— 部署服务
云原生·容器·kubernetes
淼澄研学12 小时前
Proliferate开源框架技术解析与Docker部署实操
docker·容器·开源
浪兎兎13 小时前
Docker 容器技术笔记
笔记·docker·容器
Zhu75814 小时前
在Docker环境离线部署最新版Harbor
运维·docker·容器
大大大大晴天14 小时前
K8S 在大数据里的真正价值:适用场景、收益边界与不适合的地方
大数据·云原生