kubelet因kubelet cgroup驱动程序失败:“ cgroupfs”与docker cgroup驱动程序:“ systemd”不同

Yuw*_*Yan 6 linux docker kubernetes kubelet kubeadm

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

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Run Code Online (Sandbox Code Playgroud)

我也Environment用cli 检查了

$ 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
Run Code Online (Sandbox Code Playgroud)

KUBELET_CGROUP_ARGS=--cgroup-driver=systemd

如何复制它

  • yum install -y docker-1.12.6
  • systemctl启用docker && systemctl启动docker
  • setenforce 0
  • yum install -y kubelet kubeadm
  • systemctl启用kubelet && systemctl启动kubelet
  • systemctl守护程序重新加载
  • systemctl重新启动kubelet
  • kubelet日志

环境

  • Kubernetes版本(使用kubectl version):1.7.3
  • 云提供商或硬件配置**:4核16G RAM
  • 操作系统(例如/ etc / os-release中的版本):CentOS Linux 7(核心)
  • 内核(例如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

Mch*_*eti 9

在我的环境中,它只能以相反的方式工作。设置 systemd 总是会导致错误。这是我当前的设置

OS: CentOS 7.6.1810 
Minikube Version v1.0.0
Docker Version  18.06.2-ce
Run Code Online (Sandbox Code Playgroud)

我的解决方案是:检查/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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后重新加载systemctlsystemctl daemon-reload 杀死之前的minikub配置minikube delete 并再次启动minikubeminikube start --vm-driver=none

现在检查命令行输出应该 cgroupfs在两个输出中找到

docker info | grep -i cgroup
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Run Code Online (Sandbox Code Playgroud)

最后你应该看到

   kubectl is now configured to use "minikube"
=   Done! Thank you for using minikube!
Run Code Online (Sandbox Code Playgroud)

简单的解决方案: 使用 Extra config 参数启动你的 minikube

--extra-config=kubelet.cgroup-driver=systemd
Run Code Online (Sandbox Code Playgroud)

启动 minikube 的完整命令是下一行

minikube start --vm-driver=none --extra-config=kubelet.cgroup-driver=systemd
Run Code Online (Sandbox Code Playgroud)

祝一切顺利,玩得开心


MUN*_*OGE 7

这是由于初始启动期间配置错误造成的。例如,在执行kubeadm init命令之前忘记更改 docker cgroup 驱动程序。

要在 CentOS 下解决此问题,请/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf在您的操作系统下打开或找到该文件。找到带有 的条目EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env。打开此文件并将 的值更改--cgroup-driversystemd或 与 docker cgroup driver 相同。旧内容:

KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1
Run Code Online (Sandbox Code Playgroud)

新内容:

KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1
Run Code Online (Sandbox Code Playgroud)


Ale*_*nen 7

最好做相反的事情,让 kubelet 使用 systemd

在 Kubernetes 站点中,他们建议使用 systemd https://kubernetes.io/docs/setup/product-environment/container-runtimes/ 更多详细信息请参见此处

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


cat /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
Run Code Online (Sandbox Code Playgroud)


mon*_*mon 5

可能的原因

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
Run Code Online (Sandbox Code Playgroud)

如果 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
Run Code Online (Sandbox Code Playgroud)

这可以替换为:

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
Run Code Online (Sandbox Code Playgroud)


ich*_*lau 2

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf从错误消息来看,kubelet 进程似乎没有加载正确的设置。

从聊天中获得更多信息后,我认为有几种可能的方法:

  1. 将 kubelet 和 docker cgroup 驱动程序切换为从默认cgroupfs 使用的下面的存储库下载 docker 。cgroupfs

    [dockerrepo] 
    name=Docker Repository 
    baseurl=https://yum.dockerproject.org/repo/main/centos/7 
    enabled=1 
    gpgcheck=1 
    gpgkey=https://yum.dockerproject.org/gpg
    
    Run Code Online (Sandbox Code Playgroud)

    并更改 kubelet conf 中的 cgroup 驱动程序。检查错误是否再次发生以及 kubelet 从其conf中加载了什么内容。

  2. 在 kubelet 代码中添加更多日志以进行调试

    是 kubelet 用于从双方获取 conf 的逻辑