高级滚动更新策略--deployment控制器

deployment以replicaset资源为基础资源进行编排

[root@k8s-master01 ~]# kubectl create namespace deploy
namespace/deploy created
[root@k8s-master01 ~]# vim /yaml/deployment-demo.yaml
[root@k8s-master01 ~]# vim /yaml/deployment-demo.yaml
[root@k8s-master01 ~]# cat /yaml/deployment-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-demo
  namespace: deploy
spec:
  minReadySeconds: 3
  replicas: 4
  selector:
    matchLabels:
      app: demoapp
      release: stable
  template:
    metadata:
      labels:
        app: demoapp
        release: stable
    spec:
      containers:
      - name: demoapp
        image: ikubernetes/demoapp:${VERSION}
        ports:
        - name: http
          containerPort: 80
        livenessProbe:
          httpGet:
            path: '/livez'
            port: 80
          initialDelaySeconds: 5
        readinessProbe:
          httpGet:
            path: '/readyz'
            port: 80
          initialDelaySeconds: 15
[root@k8s-master01 ~]# VERSION='v1.0' envsubst < /yaml/deployment-demo.yaml  | kubectl apply -f - -n deploy --record 
deployment.apps/deployment-demo created
[root@k8s-master01 ~]# 

 

查看pod状态

[root@k8s-master01 ~]# kubectl get deployments/deployment-demo -n deploy
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
deployment-demo   4/4     4            4           60s

 

deployment资源会由控制器自动创建下级replicaset资源

[root@k8s-master01 ~]# kubectl get replicaset -n deploy -l app=demoapp,release=stable --show-labels
NAME                         DESIRED   CURRENT   READY   AGE     LABELS
deployment-demo-6989db6d88   4         4         4       3m44s   app=demoapp,pod-template-hash=6989db6d88,release=stable
[root@k8s-master01 ~]# kubectl get pods -n deploy -l app=demoapp,release=stable --show-labels
NAME                               READY   STATUS    RESTARTS   AGE     LABELS
deployment-demo-6989db6d88-4hc48   1/1     Running   0          5m45s   app=demoapp,pod-template-hash=6989db6d88,release=stable
deployment-demo-6989db6d88-bg4vr   1/1     Running   0          5m45s   app=demoapp,pod-template-hash=6989db6d88,release=stable
deployment-demo-6989db6d88-fbq54   1/1     Running   5          5m45s   app=demoapp,pod-template-hash=6989db6d88,release=stable
deployment-demo-6989db6d88-m7mgn   1/1     Running   0          5m44s   app=demoapp,pod-template-hash=6989db6d88,release=stable
[root@k8s-master01 ~]# 

这里多出来的hash值由deployment控制器根据pod模板计算生成,而且还会将pod模板上的标签应用到下级replicaset资源上。

[root@k8s-master01 ~]# kubectl describe  deployments/deployment-demo -n deploy
Name:                   deployment-demo
Namespace:              deploy
CreationTimestamp:      Sun, 29 Aug 2021 06:57:24 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
                        kubernetes.io/change-cause: kubectl apply --filename=- --namespace=deploy --record=true
Selector:               app=demoapp,release=stable
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=demoapp
           release=stable
  Containers:
   demoapp:
    Image:        ikubernetes/demoapp:v1.0
    Port:         80/TCP
    Host Port:    0/TCP
    Liveness:     http-get http://:80/livez delay=5s timeout=1s period=10s #success=1 #failure=3
    Readiness:    http-get http://:80/readyz delay=15s timeout=1s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployment-demo-6989db6d88 (4/4 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  15m   deployment-controller  Scaled up replica set deployment-demo-6989db6d88 to 4
StrategyType:           RollingUpdate   #默认是滚动更新(多批次更新)

还有一种更新方式是重新创建(相当于replicaset更新的单批次更新);重建策略会导致应用更新期间不可用,建议使用蓝绿部署方式。

下面测试滚动更新
[root@k8s-master01 ~]# kubectl patch deployments/deployment-demo -n deploy -p '{"spec":{"minReadySeconds":30}}'    #设置更新等待时长,便于观察
deployment.apps/deployment-demo patched
[root@k8s-master01 ~]# VERSION='v1.1' envsubst < /yaml/deployment-demo.yaml  | kubectl apply -f - -n deploy --record    #更新版本
deployment.apps/deployment-demo configured
[root@k8s-master01 ~]# kubectl rollout status deployments/deployment-demo -n deploy
Waiting for deployment "deployment-demo" rollout to finish: 3 of 4 updated replicas are available...
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "deployment-demo" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deployment-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deployment-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deployment-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deployment-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deployment-demo" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "deployment-demo" rollout to finish: 3 of 4 updated replicas are available...
Waiting for deployment "deployment-demo" rollout to finish: 3 of 4 updated replicas are available...
Waiting for deployment "deployment-demo" rollout to finish: 3 of 4 updated replicas are available...
Waiting for deployment "deployment-demo" rollout to finish: 3 of 4 updated replicas are available...
^C[root@k8s-master01 ~]#                                                                                 #kubectl rollout status 命令实时打印滚动更新过程中的状态信息

 

[root@k8s-master01 ~]# kubectl get deployments/deployment-demo -w -n deploy
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
deployment-demo   3/4     3            3           30m
deployment-demo   4/4     3            3           30m
deployment-demo   5/4     3            3           31m
deployment-demo   4/4     3            3           31m
deployment-demo   5/4     3            4           31m
deployment-demo   5/4     3            4           31m
deployment-demo   4/4     3            3           31m
deployment-demo   4/4     4            3           31m
deployment-demo   3/4     4            3           32m
deployment-demo   4/4     4            3           32m
deployment-demo   5/4     4            3           32m
deployment-demo   5/4     4            4           33m
deployment-demo   5/4     4            4           33m
deployment-demo   4/4     4            3           33m
deployment-demo   3/4     4            3           33m
deployment-demo   4/4     4            3           33m
deployment-demo   3/4     4            3           34m
^C[root@k8s-master01 ~]#                                   #kubectl get  deployments/deployment-demo  -w 命令监控更新过程中pod对象的变动过程
[root@k8s-master01 ~]# kubectl get replicasets -n deploy -l app=demoapp,release=stable
NAME                         DESIRED   CURRENT   READY   AGE
deployment-demo-6989db6d88   1         1         1       32m
deployment-demo-c9dc75cd7    4         4         3       3m26s
[root@k8s-master01 ~]# kubectl get replicasets -n deploy -l app=demoapp,release=stable
NAME                         DESIRED   CURRENT   READY   AGE
deployment-demo-6989db6d88   1         1         1       32m
deployment-demo-c9dc75cd7    4         4         4       3m45s
[root@k8s-master01 ~]# kubectl get replicasets -n deploy -l app=demoapp,release=stable
NAME                         DESIRED   CURRENT   READY   AGE
deployment-demo-6989db6d88   0         0         0       33m
deployment-demo-c9dc75cd7    4         4         4       3m52s
[root@k8s-master01 ~]# kubectl get replicasets -n deploy -l app=demoapp,release=stable
NAME                         DESIRED   CURRENT   READY   AGE
deployment-demo-6989db6d88   0         0         0       33m
deployment-demo-c9dc75cd7    4         4         4       3m55s
[root@k8s-master01 ~]# kubectl get replicasets -n deploy -l app=demoapp,release=stable
NAME                         DESIRED   CURRENT   READY   AGE
deployment-demo-6989db6d88   0         0         0       33m
deployment-demo-c9dc75cd7    4         4         3       4m12s
[root@k8s-master01 ~]# kubectl get pods -n deploy -o wide
NAME                              READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
deployment-demo-c9dc75cd7-gmwnm   1/1     Running   4          4m48s   10.244.2.48   k8s-node01   <none>           <none>
deployment-demo-c9dc75cd7-ldlqw   1/1     Running   0          4m48s   10.244.1.60   k8s-node02   <none>           <none>
deployment-demo-c9dc75cd7-zcts9   1/1     Running   0          3m40s   10.244.3.49   k8s-node03   <none>           <none>
deployment-demo-c9dc75cd7-zns84   1/1     Running   0          2m8s    10.244.2.49   k8s-node01   <none>           <none>
[root@k8s-master01 ~]# 

可以看到老版本的pod数量在减少,最后pod副本变成0.

验证版本信息

kubectl get pods -n deploy -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}'

 

 

如何查看deployment资源的修订记录呢(通过命令

kubectl rollout history

最大标识符为当前使用的版本

[root@k8s-master01 ~]# kubectl rollout history deployments/deployment-demo -n deploy
deployment.apps/deployment-demo 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=- --namespace=deploy --record=true
2         kubectl apply --filename=- --namespace=deploy --record=true

[root@k8s-master01 ~]# 

怎么回滚到之前的状态呢

kubectl rollout undo --to-revision 1 deployments/deployment-demo  -n deploy

 再次验证版本信息

 

 
金丝雀发布
[root@k8s-master01 ~]# kubectl patch deployments/deployment-demo -n deploy -p '{"spec": {"strategy":{"rollingUpdate": {"maxSurge": 1, "maxUnavailable":0}}}}'
deployment.apps/deployment-demo patched

[root@k8s-master01 ~]# VERSION='v1.2' envsubst < /yaml/deployment-demo.yaml  | kubectl apply -f - -n deploy --record  && kubectl rollout pause deployments/deployment-demo -n deploy
deployment.apps/deployment-demo changed
deployment.apps/deployment-demo paused
[root@k8s-master01 ~]# kubectl get pods -n deploy -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}'
 [deployment-demo-8578c588bb-d7nq4, ikubernetes/demoapp:v1.2]
 [deployment-demo-c9dc75cd7-llf7c, ikubernetes/demoapp:v1.1]
 [deployment-demo-c9dc75cd7-pbc8b, ikubernetes/demoapp:v1.1]
 [deployment-demo-c9dc75cd7-wxphc, ikubernetes/demoapp:v1.1]
 [deployment-demo-c9dc75cd7-xwvxq, ikubernetes/demoapp:v1.1]
[root@k8s-master01 ~]# kubectl get pods -n deploy -l app=demoapp,release=stable --show-labels
NAME                               READY   STATUS    RESTARTS   AGE   LABELS
deployment-demo-8578c588bb-d7nq4   1/1     Running   0          94s   app=demoapp,pod-template-hash=8578c588bb,release=stable
deployment-demo-c9dc75cd7-llf7c    1/1     Running   0          14m   app=demoapp,pod-template-hash=c9dc75cd7,release=stable
deployment-demo-c9dc75cd7-pbc8b    1/1     Running   0          14m   app=demoapp,pod-template-hash=c9dc75cd7,release=stable
deployment-demo-c9dc75cd7-wxphc    1/1     Running   0          13m   app=demoapp,pod-template-hash=c9dc75cd7,release=stable
deployment-demo-c9dc75cd7-xwvxq    1/1     Running   0          12m   app=demoapp,pod-template-hash=c9dc75cd7,release=stable
[root@k8s-master01 ~]# 

金丝发布通常都是采用先增后减操作

上面命令是设置deployment控制器的属性值来达到增加pod。

然后通过命令更换版本,并且apply应用上,同时立即执行了暂停命令

可以看到实际上多了一个正在运行的pod,并且版本为1.2

后面测试请求引流到该pod上,如果没有问题,再执行后续命令

[root@k8s-master01 ~]# kubectl rollout resume deployments/deployment-demo -n deploy
deployment.apps/deployment-demo resumed
[root@k8s-master01 ~]# 

进行继续滚动更新

[root@k8s-master01 ~]# kubectl get pods -n deploy -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}'
 [deployment-demo-8578c588bb-8dqfn, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-d7nq4, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-dhhsv, ikubernetes/demoapp:v1.2]
 [deployment-demo-c9dc75cd7-llf7c, ikubernetes/demoapp:v1.1]
 [deployment-demo-c9dc75cd7-wxphc, ikubernetes/demoapp:v1.1]
[root@k8s-master01 ~]# kubectl get pods -n deploy -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}'
 [deployment-demo-8578c588bb-2pcnb, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-8dqfn, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-d7nq4, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-dhhsv, ikubernetes/demoapp:v1.2]
 [deployment-demo-c9dc75cd7-llf7c, ikubernetes/demoapp:v1.1]
 [deployment-demo-c9dc75cd7-wxphc, ikubernetes/demoapp:v1.1]
[root@k8s-master01 ~]# kubectl get pods -n deploy -l app=demoapp,release=stable -o jsonpath='{range .items[*]} [{.metadata.name}, {.spec.containers[0].image}]{"\n"}{end}'
 [deployment-demo-8578c588bb-2pcnb, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-8dqfn, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-d7nq4, ikubernetes/demoapp:v1.2]
 [deployment-demo-8578c588bb-dhhsv, ikubernetes/demoapp:v1.2]

可以看到已经更新完成,pods副本是4

.如果在继续更新出了问题,那回滚操作便是接下来的紧要任务。

 

 
posted @ 2021-08-29 07:53  拥抱大海,面向天空  阅读(279)  评论(0)    收藏  举报