k8s的控制器

控制器类型

控制器名称 用途 核心要点
Replication Controller(RC) 比较原始的 pod 控制器,已经被废弃,由 ReplicaSet 替代 旧版本控制器,现在不推荐使用,ReplicaSet 是它的替代品
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行 只负责维持 Pod 副本数;不支持滚动更新,Deployment 底层依靠它
Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力 最常用无状态应用控制器,支持滚动更新、回滚、扩缩容;管理 ReplicaSet
DaemonSet 确保全部指定节点上运行一个 Pod 的副本 每个符合条件的节点运行且只运行 1 个 Pod;适合日志采集、监控 agent
StatefulSet 管理有状态应用的工作负载 API 对象 用于有状态服务:数据库、分布式存储;稳定网络标识、稳定存储,有序部署 / 扩容 / 删除
Job 执行批处理任务,仅执行一次任务,保证任务的一个或多个 Pod 成功结束 一次性任务;Pod 运行成功完成就退出,不会无限重启
CronJob 创建基于时间调度的 Jobs 定时任务,类似 Linux crontab,按时间规则生成 Job
HPA(Horizontal Pod Autoscaler) 根据资源利用率自动调整 Pod 数量,实现 Pod 水平自动缩放 水平自动扩缩容,根据 CPU / 内存等指标自动增减副本数

一.Replicaset控制器

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
  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

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

二.deployment

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>

三.版本更新管理及优化

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.查看更新策略信息

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

2.设定更新策略

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

四.DaemonSet

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的状态

五.Job控制器

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
  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控制器

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
相关推荐
大大大大晴天2 小时前
大数据K8S基础:从 Pod 到 Service,看懂数据负载如何在云原生上运行
大数据·kubernetes
FoldWinCard3 小时前
K8s -- 控制器管理
云原生·容器·kubernetes
王琦03184 小时前
haproxy
运维·云原生
容器魔方4 小时前
云容器引擎 CCE 2026-Q2 优化升级:AI 推理负载、备份中心、Gateway API能力全新上线!
人工智能·云原生·容器·开源
无望__wsk4 小时前
k8s的pod管理
云原生·容器·kubernetes
悠然南风4 小时前
【云原生学习】Prometheus监控、GitLab与Jenkins部署实战
kubernetes·gitlab
菜鸟界的菜鸟4 小时前
k8s-Service详解(七)
云原生·容器·kubernetes
wazmlp0018873694 小时前
k8s pod 管理
docker·容器·kubernetes
Dear~yxy4 小时前
k8s的pod
云原生·容器·kubernetes