這篇文章會解釋
kubelet 是 Kubernetes 中 Node 的代理,它的主要角色是向 CRI 溝通,所以它有兩個特性,作為最靠近 Node,以及最靠近 Container 的元件。
瞭解 kubelet 的責任時,經常會把它作為 Data Plane Components 跟 Control Plane Components 區隔,但這樣的敘事容易會有一個誤解,就是 kubelet 的責任是維護 Data Plane Node,kubelet 跟 Control Plane Node 的運行是無關的,但實際上 kubelet 也可能運行在 Control Plane Node,因此我們可以從這個深度理解這個情境,來理解 Node-Pressure Eviction。
Static Pod 是一種全然由 kubelet 管理,不需要與 Control Plane 溝通的 Pod,常見於 kubeadm 建立 kubenetes control plane components。
kubeadm 會藉由 Static Pod 的方式,讓 kubelet 以 Pod 作為單位運行 Control Plane Components,例如 api-server, kube-scheduler 以及 kube-controller-manager
由此我們得知一個問題,由於 kubelet 也負責運行 Control Plane components,因此,kubelet 需要在沒有 Control Plane 的狀態管理 Pod。
所以 kubelet 為了保護 Pod 的可靠性,發動驅逐的行為,只能依賴三個:Node CRI、手上 Pod API Object 以及 Node 本身。
不依賴 Control Plane 的行動,是 Hub and Spoke Pattern 以及 choreography 的重要特性
kubelet 會每十秒監控 Node 的資源使用情況,以此分析壓力,比如說 memory.available nodefs.available。
當 Eviction Signals 達到閥值,就會觸發回收行為,而這邊的閥值有兩個,分別為 Soft Eviction thresholds 以及 Hard Eviction thresholds
Eviction thresholds 是由 kubelet 用於決定何時從 Node 中驅逐 Pod 的指標。 我們可以設定Soft Eviction thresholds 和 Hard Eviction thresholds。
Soft Eviction thresholds 會遵循 Grace period。 在超過period之前,kubelet 不會驅逐 Pod。 如果您沒有指定 Grace period,kubelet 會在啟動時傳回錯誤。
舉例來說,如果設定 eviction-soft: memory.available<1.5Gi
作為 ,並設定 **eviction-soft-grace-period: memory.available=1m30s
,那麼當 Node 上的可用記憶體低於 1.5GiB 時,Kubelet 會先等待 1 分 30 秒。如果在這段時間內,可用記憶體仍然低於閾值,Kubelet 才會開始驅逐 Pod。
可以設定 eviction-max-pod-grace-period
參數來限制 Pod 終止時的最大寬限期。當滿足軟性逐出閾值時,Kubelet 會比較 eviction-max-pod-grace-period
和 eviction-soft-grace-period
,並使用較短的時間作為 Grace Period。
Hard Eviction thresholds 沒有Grace period。 當滿足 Hard Eviction thresholds 時,kubelet 會立即終止 Pod,而不會進行優雅終止,以回收缺乏的資源。
這篇文章先介紹什麼是 Node-Pressure Eviction 以及 Eviction thresholds,下一篇會提到 碰到 Eviction thresholds 之後 kubelet 的行為。