一.Replicaset 控制器

ReplicaSet:保证集群中持续运行指定数量的 Pod,通过标签 selector 匹配管理 Pod;不直接生产使用,由 Deployment 内部调用

# --dry-run=client 只模拟创建不实际生成资源,-o yaml输出yaml,重定向保存到repset.yml
[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   #资源类型ReplicaSet
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2                 #期望副本数2个pod
  selector:
    matchLabels:
      app: webcluster         #选择器,匹配标签app=webcluster的pod进行管理
#  strategy: {}
  template:                   #pod模板,控制器以此模板创建pod
    metadata:
      labels:
        app: webcluster       #pod标签,必须和selector匹配
    spec:
      containers:
      - image: myapp:v1
        name: myapp

#应用yaml,创建ReplicaSet资源
[root@master controler]# kubectl apply -f repset.yml

#新开shell,每1秒刷新查看pod以及pod标签
[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   #扩容到4副本
kubectl  scale replicaset webcluster --replicas 2   #缩容到2副本
kubectl  scale replicaset webcluster --replicas 0   #副本数0,销毁所有pod

2. 测试功能(修改 yaml 文件声明式扩容)

[root@master controler]# vim repset.yml

spec:
  replicas: 4       #修改期望副本为4

#重新应用配置,完成扩容
[root@master controler]# kubectl apply -f repset.yml

#监控pod变化
[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

Deployment:无状态应用控制器,底层调用 ReplicaSet;支持滚动升级、回滚,生产最常用

#同时监控pod列表和底层ReplicaSet资源
[root@master ~]# watch -n 1 " kubectl get pods   --show-labels;echo ====;kubectl get replicasets.apps"

#模拟创建deployment,导出yaml保存到dep.yml
[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          #pod就绪后等待5s才算可用
  replicas: 2                 #期望副本数
  selector:
    matchLabels:
      app: webcluster         #匹配pod标签
#  strategy: {}
  template:                   #pod模板
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp
#        resources: {}

#创建Deployment
[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

#创建service暴露Deployment服务,--port service端口,--target-port容器端口
[root@master controler]# kubectl expose deployment webcluster --port 80 --target-port 80

#查看service详细信息,查看ClusterIP、后端Endpoints
[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>

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

#升级:修改镜像版本为myapp:v2
[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

#访问测试,返回v2代表升级成功
[root@master controler]# curl  10.107.142.60
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

#回滚,镜像改回v1
[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
#访问验证,返回v1,完成回滚
[root@master controler]# curl  10.107.142.60
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>




三、版本更新管理及优化

#修改副本数为6便于观察滚动更新过程
[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

#describe查看deployment详细,默认滚动更新参数
[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个(不销毁旧pod,先起新pod)
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp
[root@master controler]# kubectl apply -f dep.yml

#查看deployment更新历史记录
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
7         <none>
8         <none>

#暂停deployment更新,修改配置不会触发实际滚动
[root@master controler]# kubectl rollout pause deployment webcluster
deployment.apps/webcluster paused

[root@master controler]# vim dep.yml
      containers:
      - image: myapp:v2
        name: myapp

#apply执行成功,但因为pause暂停,不会执行pod更新
[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

#恢复之后出现新版本revision
[root@master controler]# kubectl rollout history deployment webcluster
deployment.apps/webcluster
REVISION  CHANGE-CAUSE
8         <none>
9         <none>




四.DaemonSet

DaemonSet:集群每一个节点运行一个 Pod;适合日志收集、监控代理组件;新增节点会自动部署 Pod

#模拟创建,导出DaemonSet yaml
[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    #控制器类型DaemonSet
metadata:
  labels:
    app: daemonset
  name: daemonset
spec:
  selector:
    matchLabels:
      app: daemonset
  template:
    metadata:
      labels:
        app: daemonset
    spec:
      containers:
      - image: myapp:v1
        name: myapp

#生成节点加入集群的join命令
[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

#node3节点执行加入集群,指定cri‑dockerd的socket
[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加入集群,DaemonSet自动在node3启动pod

五、job控制器

Job:一次性任务控制器;执行一次性批处理任务,保证任务成功结束;restartPolicy 只能 Never/OnFailure

#导入镜像,打标签、推送私有仓库
[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

#模拟生成job的yaml
[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: job
spec:
  completions: 6        #总共需要成功完成6次任务
  parallelism: 2        #最大并行同时运行2个pod
  template:
    spec:
      containers:
      - image: perl:5.34.0
        name: job
        #执行perl脚本计算圆周率
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never  #任务失败不重启pod
  backoffLimit: 4     #失败重试最大次数

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

#查看任务pod输出日志
[root@master controler]# kubectl logs job-4b45g

六.Cronjob 控制器

CronJob:定时任务控制器,基于 linux cron 表达式定时生成 Job,执行定时批处理

#模拟创建cronjob,导出yaml;schedule为cron定时表达式,* * * * *代表每分钟执行
[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:        #CronJob通过模板生成Job资源
    metadata:
      name: cronjob
    spec:
      template:
        spec:
          containers:
          - image: busybox
            name: cronjob
            command:
              - /bin/sh
              - -c
              - echo "hello timinglee"    #定时执行输出
          restartPolicy: OnFailure    #任务失败才重启pod
  schedule: '* * * * *'   #cron定时表达式:分 时 日 月 周

#创建定时任务
[root@master controler]# kubectl apply -f cronjob.yml
#查看cronjob状态
[root@master controler]# kubectl get cronjobs.batch
NAME      SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob   * * * * *   <none>     False     0        17s             70s

#查看定时任务pod输出日志
[root@master controler]# kubectl logs cronjob-29598241-pxggh
hello timinglee

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐