配置 cgroup 驅動程式
本頁面介紹如何配置 kubelet 的 cgroup 驅動程式,以使其與 kubeadm 叢集的容器執行時 cgroup 驅動程式匹配。
準備工作
你應該熟悉 Kubernetes 的容器執行時要求。
配置容器執行時 cgroup 驅動程式
容器執行時頁面解釋說,對於基於 kubeadm 的設定,推薦使用 systemd
驅動程式,而不是 kubelet 的預設 cgroupfs
驅動程式,因為 kubeadm 將 kubelet 作為 systemd 服務進行管理。
該頁面還提供瞭如何預設使用 systemd
驅動程式設定多個不同容器執行時的詳細資訊。
配置 kubelet cgroup 驅動程式
kubeadm 允許你在 kubeadm init
期間傳遞一個 KubeletConfiguration
結構體。此 KubeletConfiguration
可以包含 cgroupDriver
欄位,該欄位控制 kubelet 的 cgroup 驅動程式。
注意
在 v1.22 及更高版本中,如果使用者未在 KubeletConfiguration
下設定 cgroupDriver
欄位,則 kubeadm 預設將其設定為 systemd
。
在 Kubernetes v1.28 中,你可以將 cgroup 驅動程式的自動檢測作為 Alpha 功能啟用。有關詳細資訊,請參閱 systemd cgroup 驅動程式。
顯式配置該欄位的最小示例
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta4
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
然後可以將這樣的配置檔案傳遞給 kubeadm 命令
kubeadm init --config kubeadm-config.yaml
注意
Kubeadm 對叢集中的所有節點使用相同的 KubeletConfiguration
。KubeletConfiguration
儲存在 kube-system
名稱空間下的 ConfigMap 物件中。
執行子命令 init
、join
和 upgrade
將導致 kubeadm 將 KubeletConfiguration
作為檔案寫入 /var/lib/kubelet/config.yaml
並將其傳遞給本地節點 kubelet。
在每個節點上,kubeadm 會檢測 CRI 套接字並將其詳細資訊儲存到 /var/lib/kubelet/instance-config.yaml
檔案中。執行 init
、join
或 upgrade
子命令時,kubeadm 會將此例項配置中的 containerRuntimeEndpoint
值修補到 /var/lib/kubelet/config.yaml
中。
使用 cgroupfs
驅動程式
要使用 cgroupfs
並防止 kubeadm upgrade
在現有設定中修改 KubeletConfiguration
cgroup 驅動程式,你必須明確指定其值。這適用於你不希望未來版本的 kubeadm 預設應用 systemd
驅動程式的情況。
有關如何明確指定該值的詳細資訊,請參閱下面關於“修改 kubelet ConfigMap”的部分。
如果你希望將容器執行時配置為使用 cgroupfs
驅動程式,你必須參考所選容器執行時的文件。
遷移到 systemd
驅動程式
要將現有 kubeadm 叢集的 cgroup 驅動程式從 cgroupfs
原地更改為 systemd
,需要執行類似於 kubelet 升級的過程。這必須包括下面列出的兩個步驟。
注意
或者,也可以用使用systemd
驅動程式的新節點替換叢集中的舊節點。這隻需要在加入新節點之前執行下面的第一個步驟,並確保工作負載可以安全地移動到新節點,然後才能刪除舊節點。修改 kubelet ConfigMap
呼叫
kubectl edit cm kubelet-config -n kube-system
。修改現有的
cgroupDriver
值或新增一個新欄位,如下所示cgroupDriver: systemd
此欄位必須存在於 ConfigMap 的
kubelet:
部分。
更新所有節點上的 cgroup 驅動程式
對於叢集中的每個節點
- 使用
kubectl drain <node-name> --ignore-daemonsets
排空節點 - 使用
systemctl stop kubelet
停止 kubelet - 停止容器執行時
- 將容器執行時 cgroup 驅動程式修改為
systemd
- 在
/var/lib/kubelet/config.yaml
中設定cgroupDriver: systemd
- 啟動容器執行時
- 使用
systemctl start kubelet
啟動 kubelet - 使用
kubectl uncordon <node-name>
解禁節點
逐個節點執行這些步驟,以確保工作負載有足夠的時間排程到不同的節點上。
流程完成後,確保所有節點和工作負載都處於健康狀態。