節點資源管理
計算節點除CPU、記憶體和存儲等硬體相關資源外,還有作業系統資源,例如程序上限、磁盤I/O 等。
在Kubernetes 叢集中,同一節點上會運作多個不同應用的容器程序。不可避免地,這些程序會共享節點資源,并可能發生資源競争(request limit)。合理的節點資源管理能提高節點資源使用率,避免相鄰程序彼此幹擾,保證系統服務正常運作(驅逐條件)。Kubernetes 計算節點資源管理方案已漸趨成熟:具體展現在狀态彙報、資源預留、防止節點資源耗盡的防禦機制驅逐及容器和系統資源的配置。
狀态上報
kubelet 是部署在每個Kubernetes 節點上、負責Pod 生命周期及節點狀态上報的元件。
它周期性地向
API Server
進行彙報,并
更新節點的相關健康
和
資源使用資訊
,以供
Kubernetes 的控制平面子產品對節點和節點上的
Pod
進行管理和決策。上報資訊如下:
- 節點基礎資訊,包括IP 位址、作業系統、核心、運作時、kubelet、kube-proxy 版本資訊。部分資訊直接從節點擷取,而部分資訊需要調用雲提供商的API 擷取。
- 節點資源資訊包括CPU、記憶體、Hugepage、臨時存儲、GPU 等注冊裝置,以及這些資源中可以配置設定給容器使用的部分。
- 排程器在為Pod 選擇節點時會将機器的狀态資訊作為依據。表2-6 展示了節點狀态及其代表的意義。比如Ready 狀态反映了節點是否就緒,True 表示節點健康;False 表示節點不健康;Unknown 表示節點控制器在最近40s 内沒有收到節點的消息。排程器在排程Pod 時會過濾掉所有Ready 狀态為非True 的節點。
表
2-6
節點的狀态及其意義
資源預留
計算節點除使用者容器外,還存在很多支撐系統運作的基礎服務,譬如 systemd、journald、sshd、dockerd、Containerd、kubelet 等。如果這些服務的運作受到影響,系統将變得不穩定,進而影響使用者的容器程序。為了使服務程序能夠正常運作,要確定它們在任何時候都可以擷取足夠的系統資源,是以我們要為這些系統程序預留資源。
kubelet
可以通過衆多啟動參數為系統預留
CPU
、 記憶體、
PID
等資源, 比如
SystemReserved、
KubeReserved
等。如下代碼所示,在節點對象狀态中可以看到目前節點的
CPU 、memory
、
emphermal-storage
等資源資訊,其中每一項資源分為系統的可配置設定資源(
Allocatable)和節點的容量(
Capacity
)資源。
容量資源(
Capacity
)是指
kubelet
擷取的計算節點目前的資源資訊。
CPU
是從
/proc/cpuinfo 檔案中擷取的節點
CPU
核數;
memory
是從
/proc/memoryinfo
中擷取的節點記憶體大小;ephemeral-storage
是指節點根分區的大小。
資源可配置設定額(
Allocatable
)是使用者
Pod
可用的資源,是資源容量減去配置設定給系統的資源的剩餘部分,兩者的關系如表2-7
所示。
表
2-7
節點的資源容量和可配置設定資源