節點狀態
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 |
注意
如果您使用命令列工具列印已封鎖節點的詳細資訊,則狀況包括SchedulingDisabled
。SchedulingDisabled
不是 Kubernetes API 中的狀況;相反地,已封鎖的節點會在規格中標記為 Unschedulable。在 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
維持在 Unknown
或 False
的時間,超過 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 物件,位於
kube-node-lease
命名空間(namespace)中。每個節點都有一個相關聯的 Lease 物件。
相較於更新節點的 .status
,Lease 是一種輕量級資源。對於大型叢集,使用 Lease 作為心跳訊號可減少這些更新對效能的影響。
kubelet 負責建立和更新節點的 .status
,以及更新其相關的 Lease。
- kubelet 會在節點狀態發生變更時,或是在設定的間隔內沒有更新時,更新節點的
.status
。節點.status
更新的預設間隔為 5 分鐘,遠長於無法連線節點的 40 秒預設逾時時間。 - kubelet 會建立,然後每 10 秒(預設更新間隔)更新其 Lease 物件。Lease 更新獨立於節點
.status
的更新進行。如果 Lease 更新失敗,kubelet 會重試,使用指數輪詢退避演算法,從 200 毫秒開始,上限為 7 秒。