參考:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
配置容器運行時 cgroup 驅動
容器運行時頁面提到: 由於 kubeadm 把 kubelet 視為一個系統服務來管理,所以對基於 kubeadm 的安裝, 我們推薦使用 systemd 驅動,不推薦 cgroupfs 驅動。
配置 kubelet 的 cgroup 驅動
kubeadm 支持在執行 kubeadm init 時,傳遞一個 KubeletConfiguration 結構體。 KubeletConfiguration 包含 cgroupDriver 字段,可用於控制 kubelet 的 cgroup 驅動。
FEATURE STATE: Kubernetes v1.21 [stable]
說明: 如果用戶沒有在 KubeletConfiguration 中設置 cgroupDriver 字段, kubeadm init 會將它設置為默認值 systemd。
這是一個最小化的示例,其中顯式的配置了此字段:
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta2
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。
遷移到 systemd 驅動
要將現有 kubeadm 集群的 cgroup 驅動就地升級為 systemd, 需要執行一個與 kubelet 升級類似的過程。 該過程必須包含下面兩個步驟:
說明: 還有一種方法,可以用已配置了 systemd 的新節點替換掉集群中的老節點。 按這種方法,在加入新節點、確保工作負載可以安全遷移到新節點、及至刪除舊節點這一系列操作之前, 只需執行以下第一個步驟。
修改 kubelet 的 ConfigMap
1.用命令 kubectl get cm -n kube-system | grep kubelet-config 找到 kubelet 的 ConfigMap 名稱。
2.運行 kubectl edit cm kubelet-config-x.yy -n kube-system (把 x.yy 替換為 Kubernetes 版本)。
3.修改現有 cgroupDriver 的值,或者新增如下式樣的字段:
cgroupDriver: systemd
該字段必須出現在 ConfigMap 的 kubelet: 小節下。
更新所有節點的 cgroup 驅動
對於集群中的每一個節點:
1.執行命令 kubectl drain <node-name> --ignore-daemonsets,以 騰空節點
2.執行命令 systemctl stop kubelet,以停止 kubelet
3.停止容器運行時
4.修改容器運行時 cgroup 驅動為 systemd
5.在文件 /var/lib/kubelet/config.yaml 中添加設置 cgroupDriver: systemd
6.啟動容器運行時
7.執行命令 systemctl start kubelet,以啟動 kubelet
8.執行命令 kubectl uncordon <node-name>,以 取消節點隔離
在節點上依次執行上述步驟,確保工作負載有充足的時間被調度到其他節點。
流程完成后,確認所有節點和工作負載均健康如常。