# Deployment Rollback * 透過 deployment 建立的物件除了可以 rolling upgrade,也可以 rollback 到最先前的版本 * `--record` 會記錄 deployment 的每一次更新 ``` # 建立 nginx:1.14.2 版本 $ kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true $ kubectl get po NAME READY STATUS RESTARTS AGE nginx-deployment-85996f8dbd-rxcjn 1/1 Running 0 111s nginx-deployment-85996f8dbd-w6265 1/1 Running 0 111s nginx-deployment-85996f8dbd-ws9lq 1/1 Running 0 111s $ kubectl describe deploy nginx-deployment ...... Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.14.2 Port: 80/TCP Host Port: 0/TCP ...... ``` * 更新 image 到 nginx:1.16.1 版本 ``` $ kubectl set image deployment/nginx-deployment --record nginx=nginx:1.16.1 deployment.apps/nginx-deployment image updated ``` * 查看部署狀態 ``` $ kubectl rollout status deployment/nginx-deployment deployment "nginx-deployment" successfully rolled out ``` * 可以看到 ReplicaSet 有兩個版本,分別是舊版跟新版 * 舊的 ReplicaSet 會縮減到 0 個副本 ``` $ kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-deployment-66f8758855-527lh 1/1 Running 0 81s pod/nginx-deployment-66f8758855-d5s2p 1/1 Running 0 51s pod/nginx-deployment-66f8758855-gws2w 1/1 Running 0 67s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 103d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 3/3 3 3 4m4s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-66f8758855 3 3 3 81s replicaset.apps/nginx-deployment-85996f8dbd 0 0 0 4m4s ``` * 查看現有 deployment image 版本 ``` $ kubectl describe deploy nginx-deployment ...... Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.16.1 Port: 80/TCP Host Port: 0/TCP ...... ``` * 修改一個錯誤的 image ``` $ kubectl set image deployment/nginx-deployment --record nginx=nginx:1.161 deployment.apps/nginx-deployment image updated ``` * 查看部署狀態會卡住 ``` $ kubectl rollout status deployment/nginx-deployment Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated... ``` * 查看修改 deployment 的歷史紀錄 ``` $ kubectl rollout history deployment/nginx-deployment deployment.apps/nginx-deployment REVISION CHANGE-CAUSE 1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true 2 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true 3 kubectl set image deployment/nginx-deployment nginx=nginx:1.161 --record=true ``` * 查看使用 第一版 會修改 deployment 那些設定 ``` $ kubectl rollout history deployment/nginx-deployment --revision=1 deployment.apps/nginx-deployment with revision #1 Pod Template: Labels: app=nginx pod-template-hash=85996f8dbd Annotations: kubernetes.io/change-cause: kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true Containers: nginx: Image: nginx:1.14.2 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> ``` * 指定 rollback 到第一版 ``` $ kubectl rollout undo deployment/nginx-deployment --to-revision=1 deployment.apps/nginx-deployment rolled back ``` * 確認 deployment 已回到第一版本 ``` $ kubectl describe deploy nginx-deployment ........ Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.14.2 Port: 80/TCP Host Port: 0/TCP ...... ```