高级滚动更新策略--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
.如果在继续更新出了问题,那回滚操作便是接下来的紧要任务。
浙公网安备 33010602011771号