【问题标题】:kubelet failed with kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"kubelet 使用 kubelet cgroup 驱动程序失败:“cgroupfs”不同于 docker cgroup 驱动程序:“systemd”
【发布时间】:2018-01-24 06:41:40
【问题描述】:

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 install -y docker-1.12.6
  • systemctl enable docker && systemctl start docker
  • setenforce 0
  • yum install -y kubelet kubeadm
  • systemctl enable kubelet && systemctl start kubelet
  • systemctl daemon-reload
  • 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

【问题讨论】:

    标签: linux docker kubernetes kubeadm kubelet


    【解决方案1】:

    在我的环境中,它只能以相反的方式工作。设置 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 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
    

    一切顺利,玩得开心

    【讨论】:

      【解决方案2】:

      可能的原因

      kubelet 1.7.3 not reading config file /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #50748

      解决方案

      Troubleshooting 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
      

      【讨论】:

        【解决方案3】:

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

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

        KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --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
        

        【讨论】:

          【解决方案4】:

          要让 minicube 在 CentOS 7 上运行,我需要按照https://github.com/kubernetes/minikube/issues/2192 中的建议使用--extra-config=kubelet.cgroup-driver=systemd 启动它。

          【讨论】:

          • 嗨,谢谢,在 rhel7.5 上使用 minikube 对我有用
          【解决方案5】:

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

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

          1. 将 kubelet 和 docker cgroup 驱动程序切换到 cgroupfs 从下面的 repo 下载 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
            

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

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

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

          【讨论】:

          • 我不这么认为,错误信息是说kubelet的cgroup-driver已经是cgroupfs了,和docker有差异。
          • @YuwenYan 你的 docker 的 cgroup 驱动是什么? sudo docker info | grep Cgroup
          • 我问cos默认docker 1.12.6在Centos 7中使用cgroupfs。
          • systemd,之前没改过,所以我觉得docker的默认配置也是systemd
          • 这取决于你用来下载 docker 的 repo,我想。我使用的是和你一样的环境(相同的 k8s 版本,相同的 docker 版本,相同的操作系统)。我从 repo yum.dockerproject.org/repo/main/centos/7 下载了 docker,并预先配置了 cgroupfs。我认为值得尝试将这两个设置都更改为 cgroupfs 以查找原因。
          【解决方案6】:

          反之,让kubelet使用systemd可能会更好

          在 Kubernetes 站点中,他们推荐使用 systemd https://kubernetes.io/docs/setup/production-environment/container-runtimes/ 更多详情here

          您可以通过以下操作更改 kubelet 以使用 systemd https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 将此添加到 /etc/sysconfig/kubelet


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

          【讨论】:

          • 这终于对我有用了。经过数小时的搜索后,在 stackoverflow 答案的底部找到了这个,最终使事情正常进行。
          【解决方案7】:

          操作系统:Centos 7.4 由于 kubernetes 1.23.1 推荐使用 cgroup systemd,docker 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
          

          【讨论】:

            【解决方案8】:

            我在 Ubuntu 18.04 LTS 和 Kubernetes v1.22.6 以及最新版本的 Docker CE 和 Containerd 中按照以下步骤操作。

            我已更改 docker 服务文件以将其更改为 systemd。在旧版本的 kubeadm、kubectl 和 kubelet 直到 1.21.1 都没有问题。

            以后 docker 服务应该默认使用 systemd。

            第 1 步:停止 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。

            sudo modprobe 覆盖 sudo modprobe br_netfilter

            设置所需的 sysctl 参数,这些参数在重新启动后仍然存在。

            无需重启即可应用 sysctl 参数

            sudo sysctl --system

            Kubernetes Container Runtime

            【讨论】:

              【解决方案9】:

              编辑此文件/etc/systemd/system/kubelet.service.d/10-kubeadm.confsystemd更改为cgroupfs"。然后重新启动kubelet systemctl restart kubelet

              【讨论】:

                【解决方案10】:

                this 答案中提到的更改 dockers cgroup 驱动程序对我有用。

                【讨论】:

                  【解决方案11】:

                  https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/

                  使用 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"]
                  }
                  

                  重启服务泊坞窗

                  systemctl daemon-reload && systemctl restart docker && systemctl restart kubelet
                  

                  显示配置

                  docker info |grep Cgroup
                  

                  【讨论】:

                    猜你喜欢
                    • 2017-10-03
                    • 2020-03-28
                    • 2023-03-17
                    • 2018-05-02
                    • 2016-04-26
                    • 2012-11-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多