簡體   English   中英

kubelet 因 kubelet cgroup 驅動程序失敗:“cgroupfs”不同於 docker cgroup 驅動程序:“systemd”

[英]kubelet failed with kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

cgroup driver的配置在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"

我還用 cli 檢查了Environment

$ systemctl show --property=Environment kubelet | cat
Environment=KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf\x20--require-kubeconfig=true KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests\x20--allow-privileged=true KUBELET_NETWORK_ARGS=--network-plugin=cni\x20--cni-conf-dir=/etc/cni/net.d\x20--cni-bin-dir=/opt/cni/bin KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10\x20--cluster-domain=cluster.local KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook\x20--client-ca-file=/etc/kubernetes/pki/ca.crt KUBELET_CADVISOR_ARGS=--cadvisor-port=0 KUBELET_CGROUP_ARGS=--cgroup-driver=systemd

KUBELET_CGROUP_ARGS=--cgroup-driver=systemd

如何重現它

  • yum 安裝-y docker-1.12.6
  • systemctl 啟用 docker && systemctl 啟動 docker
  • 設置強制 0
  • yum install -y kubelet kubeadm
  • systemctl 啟用 kubelet && systemctl 啟動 kubelet
  • systemctl守護進程重新加載
  • systemctl 重啟 kubelet
  • kubelet 日志

環境

  • Kube.netes 版本(使用kubectl version ):1.7.3
  • 雲供應商或硬件配置**:4核16G RAM
  • 操作系統(例如來自 /etc/os-release):CentOS Linux 7(核心)
  • Kernel(例如uname -a ):Linux 10-8-108-92 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
  • 安裝工具:kubeadm

可能的原因

kubelet 1.7.3 不讀取配置文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #50748

解決方案

kubeadm 故障排除

如果您使用 CentOS 並且在設置主節點時遇到困難,請驗證您的 Docker cgroup 驅動程序是否與 kubelet 配置匹配:

docker info | grep -i cgroup
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

如果 Docker cgroup 驅動程序和 kubelet 配置不匹配,請更改 kubelet 配置以匹配 Docker cgroup 驅動程序。 您需要更改的標志是 --cgroup-driver。 如果已經設置,您可以像這樣更新:

sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

這可以替換為:

CG=$(sudo docker info 2>/dev/null | sed -n 's/Cgroup Driver: \(.*\)/\1/p')
sed -i "s/cgroup-driver=systemd/cgroup-driver=$CG/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

為了讓 minicube 在 CentOS 7 上運行,我需要按照https://github.com/kubernetes/minikube/issues/2192 中的建議使用--extra-config=kubelet.cgroup-driver=systemd啟動它。

在我的環境中,它只能以相反的方式工作。 設置 systemd 總是會導致錯誤。 這是我目前的設置

OS: CentOS 7.6.1810 
Minikube Version v1.0.0
Docker Version  18.06.2-ce

我的解決方案是:檢查/etc/docker/daemon.json並將 systemd 更改為 cgroupfs

{
  "exec-opts": ["native.cgroupdriver=cgroupfs"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

然后重新加載 systemctl systemctl daemon-reload殺死之前的 minikub 配置minikube delete並再次minikube start --vm-driver=none

現在檢查命令行輸出應該在兩個輸出中找到cgroupfs

docker info | grep -i cgroup
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

最后你應該看到

   kubectl is now configured to use "minikube"
=   Done! Thank you for using minikube!

簡單的解決方案:使用 Extra config 參數啟動您的 minikube

--extra-config=kubelet.cgroup-driver=systemd

啟動 minikube 的完整命令是下一行

minikube start --vm-driver=none --extra-config=kubelet.cgroup-driver=systemd

祝一切順利,玩得開心

我按照 Ubuntu 18.04 LTS 中的以下步驟使用 Kube.netes v1.22.6 和最新版本的 Docker CE 和 Containerd。

我把docker服務文件改成了systemd。 在 1.21.1 之前的舊版本 kubeadm、kubectl 和 kubelet 中沒有問題。

今后 docker 服務應該默認使用 systemd。

第一步:停止docker服務

    `systemctl stop docker`

第 2 步:更改文件 /etc/systemd/system/multi-user.target.wants/docker.service 和 /usr/lib/systemd/system/docker.service

注意:文件 /usr/lib/systemd/system/docker.service 在我的系統中不可用。

從:

    `ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock`

到:

    `ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd`

第三步:啟動docker服務和kubelet服務

    `systemctl daemon-reload`
    `systemctl start docker`
    

第 4 步:因為我已經運行了 kubeadm reset,所以我必須運行 kubeadm init。 但它奏效了。

第 0 步:在所有這些之前,需要運行幾個命令以使 containerd 能夠使用 systemd。

貓 <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br.netfilter EOF

sudo modprobe 覆蓋 sudo modprobe br.netfilter

設置所需的 sysctl 參數,這些參數在重新啟動后仍然存在。

貓 <<EOF | sudo tee /etc/sysctl.d/99-kube.netes-cri.conf.net.bridge.bridge-nf-call-iptables = 1.net.ipv4.ip_forward = 1.net.bridge.bridge-nf-call -ip6tables = 1 EOF

在不重啟的情況下應用 sysctl 參數

sudo sysctl --系統

Kube.netes 容器運行時

看起來 kubelet 進程沒有從/etc/systemd/system/kubelet.service.d/10-kubeadm.conf加載正確的設置,從錯誤消息中得知。

從聊天中獲得更多信息后,我認為有幾種可能的方法:

  1. 將 kubelet 和 docker cgroup 驅動程序切換到cgroupfs從下面的 repo 下載cgroupfs ,默認情況下使用cgroupfs

     [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7 enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg

    並在 kubelet conf 中更改 cgroup 驅動程序。 檢查錯誤是否再次發生以及 kubelet 從其 conf 加載了什么。

  2. 在 kubelet 代碼中添加更多日志進行調試

    是 kubelet 用來從雙方獲取 conf 的邏輯

這是由初始啟動期間的錯誤配置引起的。 例如,在執行kubeadm init命令之前kubeadm init更改kubeadm init cgroup 驅動程序。

要在 CentOS 下解決此問題,請打開/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf或在您的操作系統下找到該文件。 找到帶有EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env 打開這個文件並將--cgroup-driver的值更改為systemd或與--cgroup-driver cgroup driver 相同。 舊內容:

KUBELET_KUBEADM_ARGS=--cgroup-driver=cgrouopfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1

新內容:

KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1

反過來做,讓 kubelet 使用 systemd 可能會更好

在 Kubernetes 站點,他們推薦使用 systemd https://kubernetes.io/docs/setup/production-environment/container-runtimes/更多細節在這里

您可以按照https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/將其添加到 /etc/sysconfig/kubelet 來更改 kubelet 以使用 systemd


cat /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd

編輯此文件/etc/systemd/system/kubelet.service.d/10-kubeadm.confsystemd更改為cgroupfs "。然后重新啟動 kubelet systemctl restart kubelet

更改答案中提到的 dockers cgroup 驅動程序對我有用。

操作系統:Centos 7.4 因為 kubernetes 1.23.1 推薦使用 cgroup systemdcgroupfs 20.10.20 使用 cgroup cgroupfs 因此,您必須更改 docker 服務文件。

step1:停止docker服務

systemctl stop docker

步驟 2:更改文件/etc/systemd/system/multi-user.target.wants/docker.service/usr/lib/systemd/system/docker.service

從 :

`ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock`

到:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd

step3:啟動docker服務和kubelet

systemctl start docker
kubeadm init phase kubelet-start

https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/kubeadm\/configure-cgroup-driver\/<\/a>

使用 cgroupfs 驅動程序 如本指南所述,不建議將 cgroupfs 驅動程序與 kubeadm 一起使用。

要繼續使用 cgroupfs 並防止 kubeadm upgrade 在現有設置上修改 KubeletConfiguration cgroup 驅動程序,您必須明確其值。 這適用於您不希望未來版本的 kubeadm 默認應用 systemd 驅動程序的情況。

有關如何明確該值的詳細信息,請參閱下面的“修改 kubelet ConfigMap”部分。

如果您希望將容器運行時配置為使用 cgroupfs 驅動程序,則必須參考您選擇的容器運行時的文檔

轉到將配置 docker cgroupfs 更改為 systemd

編輯:\/etc\/docker\/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

首先安裝docker:

yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm

yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm

[root@cgfs-dock ~]# docker info | grep -i cgroup
Cgroup Driver: cgroupfs

然后安裝kubelet,這將解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM