節點狀態
Kubernetes 中 節點 的狀態是管理 Kubernetes 叢集的關鍵方面。在本文中,我們將介紹監控和維護節點狀態的基礎知識,以確保叢集健康穩定。
節點狀態欄位
節點的狀態包含以下資訊
您可以使用 kubectl
檢視節點的 狀態 和其他詳細資訊。
kubectl describe node <insert-node-name-here>
輸出的每個部分將在下面進行描述。
地址
這些欄位的使用取決於您的雲提供商或裸機配置。
- HostName: 節點核心報告的主機名。可以透過 kubelet 的
--hostname-override
引數進行覆蓋。 - ExternalIP: 通常是節點可從叢集外部訪問的 IP 地址。
- InternalIP: 通常是節點只能在叢集內部訪問的 IP 地址。
狀況
conditions
欄位描述了所有 Running
節點的 狀態。條件示例包括:
節點條件 | 描述 |
---|---|
Ready | 如果節點健康且準備好接受 Pod,則為 True ;如果節點不健康且不接受 Pod,則為 False ;如果節點控制器在 node-monitor-grace-period (預設為 50 秒)內未收到節點的訊息,則為 Unknown 。 |
DiskPressure | 如果存在磁碟空間壓力(即磁碟容量低),則為 True ;否則為 False 。 |
MemoryPressure | 如果存在節點記憶體壓力(即節點記憶體低),則為 True ;否則為 False 。 |
PIDPressure | 如果程序數存在壓力(即節點上的程序過多),則為 True ;否則為 False 。 |
NetworkUnavailable | 如果節點的網路配置不正確,則為 True ;否則為 False 。 |
注意
如果您使用命令列工具列印已被封鎖(cordoned)的節點詳細資訊,該條件將包含SchedulingDisabled
。SchedulingDisabled
並非 Kubernetes API 中的一個條件;而是,被封鎖的節點在其 spec 中被標記為 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 控制平面會自動建立與影響節點的條件相匹配的 汙點(taints)。例如,當 Ready 條件的 status
持續 Unknown
或 False
的時間超過 kube-controller-manager 的 NodeMonitorGracePeriod
(預設為 50 秒)時,就會發生這種情況。這會導致向 Node 新增 node.kubernetes.io/unreachable
汙點(對於 Unknown
狀態)或 node.kubernetes.io/not-ready
汙點(對於 False
狀態)。
這些汙點會影響待處理的 Pod,因為排程程式在將 Pod 分配到 Node 時會考慮 Node 的汙點。應用 NoExecute
汙點可能會導致已排程到該節點的現有 Pod 被驅逐。Pod 也可能具有 容忍(tolerations),使其能夠在具有特定汙點的 Node 上進行排程並繼續執行。
有關更多詳細資訊,請參閱 基於汙點的驅逐 和 按條件汙點化節點。
容量和可分配資源
描述了節點上的可用資源:CPU、記憶體以及可以排程到該節點上的最大 Pod 數量。
capacity 塊中的欄位表示 Node 的總資源量。allocatable 塊表示 Node 上可供普通 Pod 消耗的資源量。
您可以在學習如何 在 Node 上預留計算資源 時,閱讀有關容量和可分配資源的內容。
資訊
描述了關於節點的常規資訊,例如核心版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、容器執行時詳細資訊以及節點使用的作業系統。kubelet 從節點收集此資訊並將其釋出到 Kubernetes API。
心跳(Heartbeats)
Kubernetes 節點發送的心跳有助於您的叢集確定每個節點的可訪問性,並在檢測到故障時採取相應措施。
節點有兩種形式的心跳:
與 Node 的 .status
更新相比,Lease 是一種輕量級資源。使用 Lease 進行心跳可以減少這些更新對大型叢集的效能影響。
kubelet 負責建立和更新 Node 的 .status
,以及更新其相關的 Lease。
- kubelet 會在狀態發生更改時,或者如果一段時間內沒有更新,則會以配置的間隔更新節點的
.status
。節點.status
更新的預設間隔是 5 分鐘,遠長於 40 秒的預設不可訪問節點超時時間。 - kubelet 每 10 秒(預設更新間隔)建立並更新其 Lease 物件。Lease 更新獨立於 Node 的
.status
更新。如果 Lease 更新失敗,kubelet 會重試,使用指數退避策略,起始延遲為 200 毫秒,最高上限為 7 秒。