1. 程式人生 > >kubernetes DaemonSet的滾動更新

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的滾動更新策略

.spec.updateStrategyRollingUpdate

給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

滾動中斷

當容器映象不存在時,就會發生滾動中斷。

時鐘誤解

如果.spec.minReadySeconds 指定, master 跟 nodes節點可能會發生時鐘誤解.