kubernetes: pod升级与回滚扩容与缩容暂停恢复

运行一个容器:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1              # 副本数
  revisionHistoryLimit: 10 # 历史记录保留的个数
  selector:	
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.4
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
# 保存为deployment.yaml 并创建nginx pod:
[root@k8s-master01 yaml]# kubectl create -f  deployment-nginx.yaml
deployment.apps/nginx created


#检查:
[root@k8s-master01 yaml]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6cdd5dd489-d7kll   1/1     Running   0          17s
nginx-6cdd5dd489-dblw2   1/1     Running   0          17s
nginx-6cdd5dd489-zc8fl   1/1     Running   0          17s


#检查nginx版本:
[root@k8s-master01 yaml]# kubectl exec -it nginx-6cdd5dd489-d7kll -- sh
# nginx -v
nginx version: nginx/1.15.4



#删除pod
kubectl delete -n default deployment nginx

#检查
[root@k8s-master01 pod]# kubectl get pod
No resources found in default namespace.

镜像升级与回滚

#升级:
root@k8s-master01[11:10:24]:~/yaml$ kubectl set image deploy nginx nginx=nginx:1.15.5 --record=true
deployment.apps/nginx image updated

#检查升级过程:
kubectl describe  pod nginx-7c4b6d99fd-csh5s

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  76s   default-scheduler  Successfully assigned default/nginx-df9789dc8-6h7p7 to k8s-node02
  Normal  Pulling    76s   kubelet            Pulling image "nginx:1.15.5"
  Normal  Pulled     51s   kubelet            Successfully pulled image "nginx:1.15.5" in 24.828362289s
  Normal  Created    51s   kubelet            Created container nginx
  Normal  Started    51s   kubelet            Started container nginx



#检查现在的版本:
[root@k8s-master01 yaml]# kubectl exec -it nginx-df9789dc8-trtwq -- sh 


# nginx -v
nginx version: nginx/1.15.5


#检查更新过程
kubectl rollout status deploy nginx

[root@k8s-master01 yaml]# kubectl rollout status deploy nginx
Waiting for deployment "nginx" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx" rollout to finish: 1 old replicas are pending termination...
deployment "nginx" successfully rolled out

[root@k8s-master01 yaml]# kubectl exec -it nginx-6cdd5dd489-bsb7f -- sh
# nginx -v
nginx version: nginx/1.15.5

#为了实验效果 在升级一次
[root@k8s-master01 yaml]# kubectl set image deploy nginx nginx=nginx:1.15.6 --record=true

[root@k8s-master01 yaml]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5455fbc855-64brv   1/1     Running   0          2m48s
nginx-5455fbc855-nblks   1/1     Running   0          3m16s
nginx-5455fbc855-ns4kz   1/1     Running   0          2m47s
[root@k8s-master01 yaml]# kubectl exec -it nginx-5455fbc855-64brv -- sh
# nginx -v
nginx version: nginx/1.15.6


#回滚:
1. 查看历史更新
kubectl rollout history deploy nginx

[root@k8s-master01 yaml]# kubectl rollout history deploy nginx
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deploy nginx nginx=nginx:1.15.5 --record=true
3         kubectl set image deploy nginx nginx=nginx:1.15.6 --record=true

2. 回滚到上一个版本[kubectl rollout undo deploy {name} ]
[root@k8s-master01 yaml]# kubectl rollout undo deploy nginx
deployment.apps/nginx rolled back

3. 检查回滚状态:
[root@k8s-master01 yaml]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6cdd5dd489-bzdgd   1/1     Running   0          21s
nginx-6cdd5dd489-cwxv5   1/1     Running   0          22s
nginx-6cdd5dd489-xb6xj   1/1     Running   0          20s

3.1 进入容器检查:
[root@k8s-master01 yaml]# kubectl exec -it nginx-6cdd5dd489-bzdgd -- sh
# nginx -v
nginx version: nginx/1.15.4


4. 回滚到指定版本
[root@k8s-master01 yaml]# kubectl rollout history deploy nginx
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
1       kubectl set image deploy nginx nginx=nginx:1.15.5 --record=true
2       kubectl set image deploy nginx nginx=nginx:1.15.6 --record=true


# 查看指定版本信息
kubectl rollout history deploy nginx --revision=1


#回滚到指定版本
 kubectl rollout undo deploy nginx --to-revision=1


 [root@k8s-master01 yaml]# kubectl exec -it nginx-6cdd5dd489-q44cr -- sh
 # nginx -v 
 nginx version: nginx/1.15.5

使用pod扩容,缩容

[root@k8s-master01 yaml]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
nginx-df9789dc8-gqk5j   1/1     Running   0          11m
nginx-df9789dc8-vhqkd   1/1     Running   0          11m


#修改资源:
[root@k8s-master01 yaml]# kubectl edit deploy nginx
deployment.apps/nginx edited

找到: replicas: 2 
改为: replicas: 3

#检查状态:
[root@k8s-master01 yaml]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
nginx-df9789dc8-c47mc   1/1     Running   0          3s
nginx-df9789dc8-gqk5j   1/1     Running   0          11m
nginx-df9789dc8-vhqkd   1/1     Running   0          11m


#缩容就是继续把 replicas: 3 改为: replicas: 2即可:
[root@k8s-master01 yaml]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
nginx-df9789dc8-gqk5j   1/1     Running   0          13m
nginx-df9789dc8-vhqkd   1/1     Running   0          13m



#通过命令行进行扩容缩容
#缩容:
[root@k8s-master01 yaml]# kubectl scale --replicas=2 deploy nginx
deployment.apps/nginx scaled

#扩容:
[root@k8s-master01 yaml]# kubectl scale --replicas=10 deploy nginx
deployment.apps/nginx scaled
[root@k8s-master01 yaml]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-565979ccb4-5j896   1/1     Running   0          2s
nginx-565979ccb4-6hkjw   1/1     Running   0          2s
nginx-565979ccb4-6wkkx   1/1     Running   0          2s
nginx-565979ccb4-7nnlh   1/1     Running   0          8m54s
nginx-565979ccb4-cs2km   1/1     Running   0          2s
nginx-565979ccb4-dztkx   1/1     Running   0          2s
nginx-565979ccb4-jbmx7   1/1     Running   0          2s
nginx-565979ccb4-jqpzq   1/1     Running   0          2s
nginx-565979ccb4-vfnrd   1/1     Running   0          9m22s
nginx-565979ccb4-zsgwv   1/1     Running   0          2s


#注意,每个节点默认最大扩容数量为110个
# 如果需要修改则需要配置

使用yaml文件进行升级

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2020-09-19T02:41:11Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 3              # 副本数
  revisionHistoryLimit: 10 # 历史记录保留的个数
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.4
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
#修改:
    spec:
      containers:
      - image: nginx:1.15.5    #改为想要的镜像版本
      
#改为 1.15.5
[root@k8s-master01 yaml]# kubectl apply -f nginx-1.yaml
deployment.apps/nginx configured
[root@k8s-master01 yaml]# kubectl get pod



#注意升级的时候 他会起新的rs(replicas),通过命令可以看到,他会新起来一个pod 并把老副本数设置为2,新副本起来2个的时候
#老副本数会设置为1,直到变成0 最后才会真正的完成滚动更新。
[root@k8s-master01 yaml]# kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-5455fbc855   3         3         3       4m46s
nginx-565979ccb4   1         1         0       5s




[root@k8s-master01 yaml]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5455fbc855-j552c   1/1     Running   0          17s
nginx-5455fbc855-sl8m8   1/1     Running   0          15s
nginx-5455fbc855-sq4mr   1/1     Running   0          14s
[root@k8s-master01 yaml]# kubectl exec -it nginx-5455fbc855-j552c  -- sh
# nginx -v
nginx version: nginx/1.15.5



#查看滚动更新过程:
NewReplicaSet:   nginx-565979ccb4 (3/3 replicas created)
Events:
  Type    Reason             Age                     From                   Message
  ----    ------             ----                    ----                   -------
  Normal  ScalingReplicaSet  10m                     deployment-controller  Scaled up replica set nginx-6cdd5dd489 to 3
  Normal  ScalingReplicaSet  9m53s                   deployment-controller  Scaled up replica set nginx-df9789dc8 to 1
  Normal  ScalingReplicaSet  9m51s                   deployment-controller  Scaled down replica set nginx-6cdd5dd489 to 2
  Normal  ScalingReplicaSet  9m51s                   deployment-controller  Scaled up replica set nginx-df9789dc8 to 2
  Normal  ScalingReplicaSet  9m50s                   deployment-controller  Scaled down replica set nginx-6cdd5dd489 to 1
  Normal  ScalingReplicaSet  9m50s                   deployment-controller  Scaled up replica set nginx-df9789dc8 to 3
  Normal  ScalingReplicaSet  9m48s                   deployment-controller  Scaled down replica set nginx-6cdd5dd489 to 0
  Normal  ScalingReplicaSet  7m47s                   deployment-controller  Scaled up replica set nginx-5455fbc855 to 1
  Normal  ScalingReplicaSet  7m45s                   deployment-controller  Scaled down replica set nginx-df9789dc8 to 2
  Normal  ScalingReplicaSet  2m18s (x10 over 7m45s)  deployment-controller  (combined from similar events): Scaled down replica set nginx-5455fbc855 to 0

Deployment 暂停[优化触发更新]

暂停功能使用在多次更新场景下的多次更新有多个记录的问题,如果每条更新都被记录,在查找有用更新的时候会比较麻烦,通过暂停更新功能,可以退回到指定版本,并且rs回滚只会产生一条记录。

[root@k8s-master01 ~]# # 开启 Deployment 暂停功能
[root@k8s-master01 ~]# kubectl rollout pause deployment nginx 
deployment.apps/nginx paused
                       # 执行一次更新
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.15.3 --record
deployment.apps/nginx image updated


#此时按照常理来说 执行完了 kubectl set image deploy nginx nginx=nginx:1.15.3 --record 命令后应该会出现多次滚动更新来更新应用,但因为使用了 Deployment 暂停功能,在没有确认变更指令下达之前这些变更都不会生效



[root@k8s-master01 ~]# # 进行第二次配置变更
[root@k8s-master01 ~]# # 添加内存CPU配置
[root@k8s-master01 ~]# kubectl set resources deploy nginx -c nginx --limits=cpu=200m,memory=128Mi --requests=cpu=10m,memory=16Mi
deployment.apps/nginx resource requirements updated


#检查配置
[root@k8s-master01 ~]# kubectl get deploy nginx -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "11"
    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.15.3
      --record=true
  creationTimestamp: "2020-09-19T02:41:11Z"
  generation: 18
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "2660534"
  selfLink: /apis/apps/v1/namespaces/default/deployments/nginx
  uid: 1d9253a5-a36c-48cc-aefe-56f95967db66
spec:
  paused: true
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.3
        imagePullPolicy: IfNotPresent
        name: nginx
        resources:                    #-------------新增但未生效的配置
          limits:
            cpu: 200m
            memory: 128Mi
          requests:
            cpu: 10m
            memory: 16Mi             #-------------新增但未生效的配置
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 2
  conditions:
  - lastTransitionTime: "2020-09-19T03:26:50Z"
    lastUpdateTime: "2020-09-19T03:26:50Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-09-19T03:30:15Z"
    lastUpdateTime: "2020-09-19T03:30:15Z"
    message: Deployment is paused
    reason: DeploymentPaused
    status: Unknown
    type: Progressing
  observedGeneration: 18
  readyReplicas: 2
  replicas: 2


[root@k8s-master01 ~]# # 查看pod是否被更新 [未更新]
[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6cdd5dd489-lv28z   1/1     Running   0          30m
nginx-6cdd5dd489-nqqz7   1/1     Running   0          30m

#检查rs更新状态: [未更新]
[root@k8s-master01 pod]#  kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-5dfc8689c6   0         0         0       29m
nginx-64f878dfbf   0         0         0       32m
nginx-66bbc9fdc5   0         0         0       24m
nginx-7d5b7bcf78   2         2         2       30m


#关闭暂停更新功能
[root@k8s-master01 ~]# kubectl rollout resume deploy nginx 
deployment.apps/nginx resumed

#检查状态
[root@k8s-master01 ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-5475c49ffb   0         0         0       21m
nginx-5dfc8689c6   0         0         0       33m
nginx-66bbc9fdc5   0         0         0       52m
nginx-68db656dd8   1         1         0       15s   [状态更新]
nginx-6cdd5dd489   2         2         2       31m
nginx-799b8478d4   0         0         0       21m
nginx-7d79b96f68   0         0         0       24m
nginx-f974656f7    0         0         0       21m

#pod状态
[root@k8s-master01 pod]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-68db656dd8-cc4jv   1/1     Running   0          22s [状态更新]
nginx-68db656dd8-hvj8x   1/1     Running   0          20s [状态更新]

微信赞赏

支付宝赞赏

原文地址:https://www.cnblogs.com/superlinux/p/14979326.html