節點狀態

Kubernetes 中節點的狀態是管理 Kubernetes 叢集的關鍵方面。在本文中,我們將介紹監控和維護節點狀態以確保叢集健康且穩定的基礎知識。

節點狀態欄位

節點的狀態包含以下資訊

您可以使用 kubectl 來檢視節點的狀態和其他詳細資訊

kubectl describe node <insert-node-name-here>

以下說明輸出的每個區段。

位址

這些欄位的使用方式取決於您的雲端供應商或裸機組態。

  • HostName:節點核心回報的主機名稱。可以透過 kubelet --hostname-override 參數覆寫。
  • ExternalIP:通常是節點的 IP 位址,該位址可從外部路由 (可從叢集外部存取)。
  • InternalIP:通常是節點的 IP 位址,該位址僅可在叢集內路由。

狀況

conditions 欄位描述所有 執行中 節點的狀態。狀況範例包括

節點狀況,以及每個狀況適用的時間說明。
節點狀況描述
就緒如果節點健康且準備好接受 Pod,則為 True;如果節點不健康且未接受 Pod,則為 False;如果節點控制器在上次 node-monitor-grace-period (預設為 50 秒) 內未收到節點的訊號,則為 Unknown
磁碟壓力如果磁碟大小存在壓力 (亦即,如果磁碟容量不足),則為 True;否則為 False
記憶體壓力如果節點記憶體存在壓力 (亦即,如果節點記憶體不足),則為 True;否則為 False
PID 壓力如果程序存在壓力 (亦即,如果節點上有太多程序),則為 True;否則為 False
網路無法使用如果節點的網路未正確設定,則為 True;否則為 False

在 Kubernetes API 中,節點的狀況會表示為 Node 資源的 .status 的一部分。例如,以下 JSON 結構描述健康節點

"conditions": [
  {
    "type": "Ready",
    "status": "True",
    "reason": "KubeletReady",
    "message": "kubelet is posting ready status",
    "lastHeartbeatTime": "2019-06-05T18:38:35Z",
    "lastTransitionTime": "2019-06-05T11:41:27Z"
  }
]

當節點發生問題時,Kubernetes 控制平面會自動建立與影響節點狀況相符的污點(taint)。例如,當 Ready 狀況的 status 維持在 UnknownFalse 的時間,超過 kube-controller-manager 的 NodeMonitorGracePeriod(預設為 50 秒)時,就會發生這種情況。這會導致系統為狀態為 Unknown 的節點加上 node.kubernetes.io/unreachable 污點,或是為狀態為 False 的節點加上 node.kubernetes.io/not-ready 污點。

這些污點會影響待定 Pod,因為排程器在將 Pod 指派給節點時,會將節點的污點納入考量。已經排程到節點的現有 Pod 可能會因為套用 NoExecute 污點而被驅逐。Pod 也可能具有容忍度(toleration),使其即使節點具有特定污點,仍能排程到該節點並繼續在其上執行。

請參閱基於污點的驅逐依狀況為節點加上污點以瞭解更多詳細資訊。

容量和可分配

描述節點上可用的資源:CPU、記憶體,以及可以排程到節點上的 Pod 最大數量。

capacity 區塊中的欄位表示節點擁有的資源總量。allocatable 區塊表示節點上可供一般 Pod 使用的資源量。

您可以在學習如何在節點上保留計算資源時,閱讀更多關於 capacity 和 allocatable 資源的資訊。

資訊

描述關於節點的一般資訊,例如核心版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、容器執行階段詳細資訊,以及節點使用的作業系統。kubelet 從節點收集這些資訊,並將其發布到 Kubernetes API 中。

心跳訊號

由 Kubernetes 節點傳送的心跳訊號,可協助您的叢集判斷每個節點的可用性,並在偵測到故障時採取行動。

對於節點,心跳訊號有兩種形式

相較於更新節點的 .status,Lease 是一種輕量級資源。對於大型叢集,使用 Lease 作為心跳訊號可減少這些更新對效能的影響。

kubelet 負責建立和更新節點的 .status,以及更新其相關的 Lease。

  • kubelet 會在節點狀態發生變更時,或是在設定的間隔內沒有更新時,更新節點的 .status。節點 .status 更新的預設間隔為 5 分鐘,遠長於無法連線節點的 40 秒預設逾時時間。
  • kubelet 會建立,然後每 10 秒(預設更新間隔)更新其 Lease 物件。Lease 更新獨立於節點 .status 的更新進行。如果 Lease 更新失敗,kubelet 會重試,使用指數輪詢退避演算法,從 200 毫秒開始,上限為 7 秒。
上次修改時間為 2024 年 11 月 26 日下午 9:30 PST:修正 node-monitor-grace-period (6685c008b5)