當某個 Linux 系統發行版使用 systemd 作為其初始化系統時,初始化進程會生成並使用一個 root 控制組 (cgroup), 並充當 cgroup 管理器。 Systemd 與 cgroup 集成緊密,並將為每個 systemd 單元分配一個 cgroup。 你也可以配置容器運行時和 kubelet 使用 cgroupfs。 連同 systemd 一起使用 cgroupfs 意味着將有兩個不同的 cgroup 管理器。
單個 cgroup 管理器將簡化分配資源的視圖,並且默認情況下將對可用資源和使用 中的資源具有更一致的視圖。 當有兩個管理器共存於一個系統中時,最終將對這些資源產生兩種視圖。 在此領域人們已經報告過一些案例,某些節點配置讓 kubelet 和 docker 使用 cgroupfs,而節點上運行的其余進程則使用 systemd; 這類節點在資源壓力下 會變得不穩定。
更改設置,令容器運行時和 kubelet 使用 systemd 作為 cgroup 驅動,以此使系統更為穩定。 對於 Docker, 設置 native.cgroupdriver=systemd 選項。
注意:更改已加入集群的節點的 cgroup 驅動是一項敏感的操作。 如果 kubelet 已經使用某 cgroup 驅動的語義創建了 pod,更改運行時以使用 別的 cgroup 驅動,當為現有 Pods 重新創建 PodSandbox 時會產生錯誤。 重啟 kubelet 也可能無法解決此類問題。 如果你有切實可行的自動化方案,使用其他已更新配置的節點來替換該節點, 或者使用自動化方案來重新安裝。
cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
