kubernetes DaemonSet的滾動更新
DaemonSet的滾動更新
DaemonSet 更新策略
DaemonSet 有兩種更新策略 :
-
OnDelete: 預設的向後相容更新策略. 只有當你手動刪除老的DaemonSet pods時,新的DaemonSet pods 才會被自動建立。跟k8s 1.5版本及以前的行為類似。
-
RollingUpdate: 老的DaemonSet pods會被自動殺死,新的DaemonSet pods會自動建立。
限制
-
DaemonSet rollout歷史目前還不支援.
-
DaemonSet 回滾 目前 kubectl還不支援. 你可以修改到DaemonSet 模板到以前版本來實現rollback.
警告: 更新Kubernetes1.5 及以前版本建立的DeamonSet
當你第一次設定RollingUpdate 滾動更新策略時,rollout 會被觸發, 即使DaemonSet 模板沒有修改. 所有的DaemonSet pods 會重啟.
要避免重啟, 首先獲取DaemonSet .spec.templateGeneration:的當前值。
kubectl get ds/<daemonset-name> -o go-template='{{.spec.templateGeneration}}{{"\n"}}'
輸出應為數字N. 如果沒有輸出數字,則 N = 0.
然後在設定DaemonSet的滾動更新策略
給DaemonSet pods 打上標籤 pod-template-generation=<N>kubectl label pods -l <daemonset-selector-key>=<daemonset-selector-value> pod-template-generation=<N>
這步主要是告訴DaemonSet剛剛打標籤的 DaemonSet pods 是被當前模板建立的.
配置DaemonSet 滾動更新策略
開啟滾動更新功能.spec.updateStrategy.type
設定為 RollingUpdate.
你同時也想設定 .spec.updateStrategy.rollingUpdate.maxUnavailable (預設為 1) 跟 .spec.minReadySeconds (預設為 0) 兩個引數.
Step 1: 檢查當前滾動更新策略
kubectl get ds/<daemonset-name> -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}'
如果你還沒有建立DaemonSet, 使用以下命令:
kubectl create -f ds.yaml --dry-run -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}'
輸出應該是:
RollingUpdate
如果輸出不是 RollingUpdate, 修改 DaemonSet 資源物件的相關欄位。
Step 2: 使用滾動更新策略建立DaemonSet
如果你已經建立DaemonSet,跳到 step 3
kubectl create -f ds.yaml
如果使用kubectl apply部署 DaemonSet ,使用以下命令
kubectl apply -f ds.yaml
Step 3: 更新 DaemonSet 模板
以下三個命令都可以修改DaemonSet 模板
kubectl apply -f ds-v2.yaml
kubectl edit ds/<daemonset-name>
kubectl patch ds/<daemonset-name> -p=<strategic-merge-patch>
如果只更新映象,可以使用以下命令:
kubectl set image ds/<daemonset-name> <container-name>=<container-new-image>
Step 4: 檢視滾動更新狀態
kubectl rollout status ds/<daemonset-name> 當滾地更新完成,輸出如下:
daemon set"<daemonset-name>" successfully rolled out
Troubleshooting
DaemonSet 滾動更新卡住
可能有以下原因:
一些節點資源用盡
可以使用以下命令檢視那個節點資源用盡:
kubectl get pods -l <daemonset-selector-key>=<daemonset-selector-value> -o wide
滾動中斷
當容器映象不存在時,就會發生滾動中斷。