# 設定 worker failover 時間 * `node-status-update-frequency`: kubelet 定期回應頻率,預設 10 秒。 * `default-not-ready-toleration-seconds`: 控制 Pod 容忍節點未就緒狀態的時間長度。預設值為 300 秒。 * `default-unreachable-toleration-seconds`: 控制 Pod 可以容忍節點不可達的時間長度。預設值為 300 秒。 * `node-monitor-period`: Master 每一段時間會跟 node 溝通,確認 node 是否還活者,預設值為 5 秒。 * `node-monitor-grace-period`: 當 node 失聯後判定為 NotReady 所需的時間,預設為 50 秒。 * `pod-eviction-timeout`: 當 node 狀態為 NotReady ,k8s 開始刪除原本 node 上的 pod,預設為 300 秒。 ## 注意 pod-eviction-timeout 參數 controller-manager 在 1.27.0 版本後被移除 ## rke 設定 cluster.yml * 調整為以下設定後 pod 重啟時間大約變成 1 分鐘。 ``` services: kubelet: extra_args: node-status-update-frequency: 4s kube-api: extra_args: default-not-ready-toleration-seconds: 30 default-unreachable-toleration-seconds: 30 kube-controller: extra_args: node-monitor-period: "2s" node-monitor-grace-period: "20s" pod-eviction-timeout: "30s" ``` ![image](https://hackmd.io/_uploads/ryhypSQ4p.png) ![image](https://hackmd.io/_uploads/HyneTBQNa.png) ![image](https://hackmd.io/_uploads/rJLf6BXEp.png) ## rke2 設定方式 ![image](https://hackmd.io/_uploads/Sk3uvLXVp.png) ![image](https://hackmd.io/_uploads/rk0UPUQNT.png) ``` node-status-update-frequency=4s pod-eviction-timeout=30s node-monitor-period=2s node-monitor-grace-period=20s default-not-ready-toleration-seconds=30 default-unreachable-toleration-seconds=30 ``` ## 使用 toleration 方式驅趕 * 由於 `pod-eviction-timeout` 參數在 1.27.0 版本後被移除,因此使用 toleration 的方式將 pod 從不可用的節點驅趕到可用的節點上。 * 設定 api server 參數 - `default-not-ready-toleration-seconds`: 控制 Pod 容忍節點未就緒狀態的時間長度。預設值為 300 秒。 - `default-unreachable-toleration-seconds`: 控制 Pod 可以容忍節點不可達的時間長度。預設值為 300 秒。 * rke2 設定方式,設定只能忍受 30 秒。 ![image](https://hackmd.io/_uploads/Sy2lYohWA.png) * 測試建立一個 deploy ``` $ kubectl create deploy test --image=nginx ``` * 確任新建立的 pod 預設 `tolerationSeconds` 都是 30 秒,代表只要 pod 在 `node.kubernetes.io/not-ready` 或 `node.kubernetes.io/unreachable` 這兩個 Taints 上超過 30 秒後就會被驅離。 ``` $ kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-5746d4c59f-ddxlk 1/1 Running 0 3m 10.42.1.180 cilium-w1 <none> <none> $ kubectl get po test-5746d4c59f-ddxlk -o yaml | grep -A8 tolerations: tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 30 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 30 ``` * 將 cilium-w1 關機,確認 pod 是否會在 node 判為 NotReady 狀態後的 30 秒被驅離 ``` # pod 已重新長在 cilium-w2 $ kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-5746d4c59f-7rbch 1/1 Running 0 16s 10.42.2.26 cilium-w2 <none> <none> test-5746d4c59f-ddxlk 1/1 Terminating 0 5m52s 10.42.1.180 cilium-w1 <none> <none> ``` ## 參考 https://github.com/kubernetes/website/issues/39681 https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/#taint-based-evictions https://godleon.github.io/blog/Kubernetes/k8s-Taints-and-Tolerations/