一.Replicaset控制器

1.建立控制器

[root@master ~]#  kubectl create deployment webcluster --image myapp:v1  --dry-run=client -o yaml  > repset.yml
[root@master ~]# 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 ~]# kubectl apply -f repset.yml
replicaset.apps/webcluster created

#打开一个新的shell
[root@master ~]# watch -n 1 kubectl get pods   --show-labels



[root@master ~]# kubectl  scale replicaset webcluster --replicas 4
replicaset.apps/webcluster scaled
[root@master ~]# kubectl  scale replicaset webcluster --replicas 2
replicaset.apps/webcluster scaled
[root@master ~]# kubectl  scale replicaset webcluster --replicas 0
replicaset.apps/webcluster scaled
[root@master ~]# 

2.测试功能

[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: Tue Aug 25 22:01:08 2026

NAME               READY   STATUS    RESTARTS   AGE     LABELS
webcluster-6m6mg   1/1     Running   0          2m21s   app=webcluster
webcluster-dvk76   1/1     Running   0          107s    app=webcluster
webcluster-srchq   1/1     Running   0          2m21s   app=webcluster
webcluster-x4x6l   1/1     Running   0          107s    app=webcluster

二.deployment

1.监控

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


Every 1.0s:  kubectl get pods   --show-labels;echo ====;kubectl get replicasets.apps                                                    master: Tue Aug 25 22:02:18 2026

NAME               READY   STATUS    RESTARTS   AGE     LABELS
webcluster-6m6mg   1/1     Running   0          3m31s   app=webcluster
webcluster-dvk76   1/1     Running   0          2m57s   app=webcluster
webcluster-srchq   1/1     Running   0          3m31s   app=webcluster
webcluster-x4x6l   1/1     Running   0          2m57s   app=webcluster
====
NAME         DESIRED   CURRENT   READY   AGE
webcluster   4         4         4       3m31s

2.建立deployment控制器

[root@master ~]#  kubectl create deployment webcluster --image myapp:v1  --dry-run=client -o yaml  > dep.yml
[root@master ~]# 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 ~]# kubectl apply -f dep.yml
deployment.apps/webcluster created


#监控部分显示效果
Every 1.0s:  kubectl get pods   --show-labels;echo ====;kubectl get replicasets.apps                                                   master: Tue Aug 25 22:04:46 2026

NAME               READY   STATUS    RESTARTS   AGE     LABELS
webcluster-6m6mg   1/1     Running   0          5m59s   app=webcluster
webcluster-srchq   1/1     Running   0          5m59s   app=webcluster
====
NAME         DESIRED   CURRENT   READY   AGE
webcluster   2         2         2       5m59s



[root@master ~]#  kubectl expose deployment webcluster --port 80 --target-port 80
Error from server (AlreadyExists): services "webcluster" already exists
[root@master ~]#  kubectl describe  services webcluster
Name:                     webcluster
Namespace:                default
Labels:                   app=webcluster
Annotations:              <none>
Selector:                 app=webcluster
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.105.1.164
IPs:                      10.105.1.164
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32416/TCP
Endpoints:                10.244.1.20:80,10.244.2.18:80
Session Affinity:         None
External Traffic Policy:  Cluster
Internal Traffic Policy:  Cluster
Events:                   <none>
[root@master ~]# curl 10.105.1.164
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

3.升级和回滚

[root@master ~]# 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 ~]# kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@master ~]# curl 10.105.1.164
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@master ~]# 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 ~]#  kubectl apply -f dep.yml
deployment.apps/webcluster configured
[root@master ~]# curl 10.105.1.164
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@master ~]# curl 10.105.1.164
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

三.版本更新管理及优化

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

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

1.查看更新策略信息

[root@master ~]# kubectl describe deployments.apps webcluster
Name:                   webcluster
Namespace:              default
CreationTimestamp:      Tue, 25 Aug 2026 22:03:30 +0800
Labels:                 app=webcluster
Annotations:            deployment.kubernetes.io/revision: 3
Selector:               app=webcluster
Replicas:               6 desired | 6 updated | 6 total | 6 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        5
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=webcluster
  Containers:
   myapp:
    Image:         myapp:v1
    Port:          <none>
    Host Port:     <none>
    Environment:   <none>
    Mounts:        <none>
  Volumes:         <none>
  Node-Selectors:  <none>
  Tolerations:     <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  webcluster-6c8b4bb9d7 (0/0 replicas created)
NewReplicaSet:   webcluster (6/6 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  8m5s   deployment-controller  Scaled down replica set webcluster from 4 to 2
  Normal  ScalingReplicaSet  4m1s   deployment-controller  Scaled up replica set webcluster-6c8b4bb9d7 from 0 to 1
  Normal  ScalingReplicaSet  3m56s  deployment-controller  Scaled down replica set webcluster from 2 to 1
  Normal  ScalingReplicaSet  3m56s  deployment-controller  Scaled up replica set webcluster-6c8b4bb9d7 from 1 to 2
  Normal  ScalingReplicaSet  3m50s  deployment-controller  Scaled down replica set webcluster from 1 to 0
  Normal  ScalingReplicaSet  3m27s  deployment-controller  Scaled up replica set webcluster from 0 to 1
  Normal  ScalingReplicaSet  3m21s  deployment-controller  Scaled down replica set webcluster-6c8b4bb9d7 from 2 to 1
  Normal  ScalingReplicaSet  3m21s  deployment-controller  Scaled up replica set webcluster from 1 to 2
  Normal  ScalingReplicaSet  3m15s  deployment-controller  Scaled down replica set webcluster-6c8b4bb9d7 from 1 to 0
  Normal  ScalingReplicaSet  64s    deployment-controller  (combined from similar events): Scaled up replica set webcluster from 2 to 6

2.设定更新策略

[root@master ~]# 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 ~]#  kubectl apply -f dep.yml
deployment.apps/webcluster configured

3.更新暂停和恢复

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

[root@master ~]# kubectl rollout pause deployment webcluster 
deployment.apps/webcluster paused
[root@master ~]# vim dep.yml
。。。
      containers:
      - image: myapp:v2
        name: myapp
。。。
[root@master ~]# kubectl apply -f dep.yml       
deployment.apps/webcluster configured
[root@master ~]#  kubectl rollout history deployment webcluster
deployment.apps/webcluster 
REVISION  CHANGE-CAUSE
3         <none>
4         <none>

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

四.DaemonSet

[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 ~]# kubeadm token create  --print-join-command
kubeadm join 192.168.106.181:6443 --token ozlv7n.5bm7z0b1msapxc3t --discovery-token-ca-cert-hash sha256:9cb037f40d64a5c3c7f6f6019f4a56cf8096f9e28a19fb9d08990d7d11ff9008 
[root@master ~]# 

[root@node3 ~]# kubeadm join 192.168.106.181:6443 --token ozlv7n.5bm7z0b1msapxc3t --discovery-token-ca-cert-hash sha256:9cb037f40d64a5c3c7f6f6019f4a56cf8096f9e28a19fb9d08990d7d11ff9008 --cri-socket  unix:///var/run/cri-dockerd.sock

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

五.Job控制器

[root@master ~]# kubectl create job testjob --image busybox 
job.batch/testjob created
[root@master ~]# kubectl create job testjob --image busybox --dry-run=client -o yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: testjob
spec:
  template:
    metadata: {}
    spec:
      containers:
      - image: busybox
        name: testjob
        resources: {}
      restartPolicy: Never
status: {}
[root@master ~]# kubectl create job testjob --image busybox --dry-run=client -o yaml > testjob.yaml
[root@master ~]# vim testjob.yaml 
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 ~]# kubectl apply -f testjob.yaml 
job.batch/testjob created
[root@master ~]# kubectl logs testjob-v5j94
this is testjob message

六.Cronjob控制器

[root@master ~]# kubectl delete -f testjob.yaml 
job.batch "testjob" deleted from default namespace
[root@master ~]# cp testjob.yaml crontabjob.yml
[root@master ~]# vim crontabjob.yml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: '* * * * *'
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never  # 注意 P 是大写
          containers:
          - image: busybox
            name: cronjob
            command: ["/bin/sh", "-c"]
            args:
            - |
              echo this is testjob message
              sleep 10

[root@master ~]# kubectl apply -f crontabjob.yml 
cronjob.batch/cronjob created

更多推荐