1.Deployment的升級
示例:滾動升級busybox-deployment容器
apiVersion: apps/v1 kind: Deployment metadata: name: busybox-deployment spec: replicas: 3 template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox: 1.7 # 查看busybox容器副本數量 kubectl get pods # 使用以下命令更新busybox到1.9版 kubectl set image deployment/busybox-deployment busybox=busybox:1.9 或者kubectl edit編輯bosybox的deployment文件將image 1.7改為1.9,修改后會自 動出發Pod滾動升級 # 查看更新過程 kubectl rollout status deployment/busybox-deployment
Deployment的更新策略包括:
1)Recreate:設置spec.strategy.type=Recreate,表示在更新Pod時會先殺掉所有正好運行的Pod,然后創建新的Pod
2)RollingUpdate:設置spec.strategy.type=RollingUpdate,表示Pod會以滾動升級的方式逐個更新,此為默認值,其中
spec.strategy.rollingUpdate.maxUnavilable指定更新過程中不可用狀態的Pod的數量上限,如設置為30%,則更新過程中確保運行的Pod總數至少占Pod期望副本總數的70%。
spec.strategy.rollingUpdate.maxSurge:用於指定更新過程中Pod總數超過Pod期望副本數部分的最大值,如設為30%,則新的ReplicaSet可以在滾動更新開始時立即進行副本擴容,只需保證新舊ReplicaSet的Pod副本數之和不超過期望副本數的130%即可,一旦舊的Pod被殺掉,新的ReplicaSet就會進一步擴容。
2.Deployment的回滾
# 使用kubectl rollout history命令查看deployment部署記錄 kubectl rollout history deployment/nginx-deployment # 查看特定版本的詳細信息,加上revision=<N>參數 kubectl rollout history deployment/nginx-deployment --revision=3 # 回滾到ngin-deploymment上一個部署版本 kubectl rollout undo deployment/nginx-deployment # 使用--to-revision回滾到指定部署版本 kubectl rollout undo deployment/nginx-deployment --to-revision=2
3.暫停和恢復Deployment的部署操作
對於一次復雜的Deployment配置修改,為了避免頻繁觸發Deployment的更新操作,可先暫停Deployment的更新操作,待修改完成后再恢復
# 通過kubectl rollout pause命令暫定deployment更新操作 kubectl rollout pause deployment/nginx-deployment # 做更新image版本和容器資源操作 kubectl set image deployment/nginx-deployment nginx=nginx:1.10.1 kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=768Mi # 恢復Deployment的部署操作 kubectl rollout resume deployment/nginx-deployment
4.RC的滾動升級
使用kubectl rolling-update命令進行RC的滾動升級,升級時系統要求新的RC與舊的RC必須在相同的namespace里
# 使用nginx-rc-rollout-v1.17.yaml升級到1.17版,舊版本時1.15版 apiVersion: v1 kind: ReplicatonController metadata: name: nginx-rc-v1.17 # RC的name不能與舊版本相同 labels: name: nginx-rc version: v1.17 spec: replicas: 1 selector: # selector中至少有一個version與舊版中的不同 name: nginx-rc version: v1.17 template: metadata: labels: name: nginx-rc version: v1.17 spec: containers: - name: nginx image: nginx:1.17 ports: - containerPort: 80 # 執行命令滾動升級nginx-rc kubectl rolling-update nginx-rc -f nginx-rc-rollout-v1.17.yaml 或者 # 直接使用命令更新 kubectl rolling-update nginx-rc --image=nginx:1.17 注:使用命令升級后新RC仍使用舊RC的name # 如果在更新過程中發現配置有誤,則可中斷更新,執行以下命令回滾 kubectl rolling-update nginx-rc --image=nginx:1.17 --rollback
RC的滾動升級不具有Deployment在應用版本升級過程中的歷史記錄、新舊版本數量的精細控制等功能。
5.DaemonSet的更新策略
DaemonSet包含兩種升級策略:
1)OnDelete:默認的升級策略,使用此策略,在創建好新的DaemonSet配置之后,新的Pod並不會被自動創建,直到用戶手動刪除舊Pod才會出發新建操作
2)RollingUpdate:使用此策略更新時,舊版的Pod將被自動殺掉,然后自動創建新版的Pod,整改過程與普通Deployment的滾動升級一樣可控,但回滾時不能通過kubectl rollback命令完成,必須通過再次提交舊版本配置的方式實現
要啟用DaemonSet的滾動更新特性,必須將其spec.updateStrategy.type設置為RollingUpdate。
還可以設置spec.updateStrategy.rollingUpdate.maxUnavailable(默認值為1)和spec.minReadySeconds(默認值為0)
6.StatefulSet的更新策略
更新策略向Deployment和DaemonSet的策略看齊,也可使用RollingUpdate、Paritioned和OnDelete策略。