【问题标题】:Joining cluster takes forever加入集群需要永远
【发布时间】:2023-03-05 08:46:01
【问题描述】:

我已经设置了我的主节点,我正在尝试加入一个工作节点,如下所示:

kubeadm join 192.168.30.1:6443 --token 3czfua.os565d6l3ggpagw7 --discovery-token-ca-cert-hash sha256:3a94ce61080c71d319dbfe3ce69b555027bfe20f4dbe21a9779fd902421b1a63

但是该命令在以下状态下永远挂起:

[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

既然这只是一个警告,为什么它实际上会失败?

编辑:我在/var/log/syslog中注意到以下内容

Mar 29 15:03:15 ubuntu-xenial kubelet[9626]: F0329 15:03:15.353432    9626 server.go:193] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory
Mar 29 15:03:15 ubuntu-xenial systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Mar 29 15:03:15 ubuntu-xenial systemd[1]: kubelet.service: Unit entered failed state.

【问题讨论】:

    标签: kubernetes kubeadm


    【解决方案1】:

    首先,如果您想在您的工作人员加入主使用时查看更多详细信息:

    kubeadm join 192.168.1.100:6443 --token m3jfbb.wq5m3pt0qo5g3bt9     --discovery-token-ca-cert-hash sha256:d075e5cc111ffd1b97510df9c517c122f1c7edf86b62909446042cc348ef1e0b --v=2
    

    使用上面的命令我可以看到我的worker无法与master建立连接,所以我只是停止了防火墙:

    systemctl stop firewalld 
    

    【讨论】:

      【解决方案2】:

      这可以通过创建一个新令牌来解决 使用这个命令:

      kubeadm token create --print-join-command

      并使用生成的令牌将其他节点加入集群

      【讨论】:

        【解决方案3】:

        问题与 kubeadm 未安装开箱即用的网络 CNI 兼容解决方案有关;

        因此,如果没有这一步,kubernetes 节点/主节点将无法建立任何形式的通信;

        以下任务解决了这个问题:

        - name: kubernetes.yml --> Install Flannel
          shell: kubectl -n kube-system apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
          become: yes
          environment:
            KUBECONFIG: "/etc/kubernetes/admin.conf"
          when: inventory_hostname in (groups['masters'] | last)
        

        【讨论】:

        • when:run_once 比上次好
        【解决方案4】:

        我在 CentOS 7 上确实遇到了同样的错误,但在我的例子中,join 命令没有问题,所以它确实只是一个警告。

        >  [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker
        > cgroup driver. The recommended driver is "systemd". Please follow the
        > guide at https://kubernetes.io/docs/setup/cri/ [preflight] Reading
        > configuration from the cluster... [preflight] FYI: You can look at
        > this config file with 'kubectl -n kube-system get cm kubeadm-config
        > -oyaml' [kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.14" ConfigMap in the kube-system namespace
        

        正如官方文档中提到的,有两个常见的问题导致 init 挂起(我猜它也适用于 join 命令):

        kubelet 的默认 cgroup 驱动配置不同于 Docker使用的那个。检查系统日志文件(例如 /var/log/message) 或检查 journalctl -u kubelet 的输出。如果你看到了什么 像下面这样:

        首先尝试official documentation 中的步骤,如果不起作用,请提供更多信息,以便我们在需要时进行进一步的故障排除。

        【讨论】:

        • 这个问题似乎与master上的CRI配置有关;创建集群没有问题; join 命令是失败的;但是我在主节点和节点中使用完全相同的方式安装了docker
        • 我发布了 join 命令的结果,所以即使有这个警告,它也适用于我的情况。这是一个清晰的集群吗?我的意思是你可以重置它吗?如果是,请尝试执行 kubeadm reset 并从官方文档站点重新安装 docker(您是否也尝试过 this)?
        【解决方案5】:

        我有一堆 k8s 部署脚本最近因同样的错误消息而中断......看起来 docker 改变了它的安装。试试这个——

        以前的安装: apt-get isntall docker-ce

        更新安装: apt-get install docker-ce docker-ce-cli containerd.io

        【讨论】:

          【解决方案6】:

          /var/lib/kubelet/config.yaml 是如何创建的?

          关于/var/lib/kubelet/config.yaml: no such file or directory 错误。

          以下是应在工作节点上执行的步骤,以便创建上述文件。

          1 ) /var/lib/kubelet/ 文件夹的创建。
          它是在安装kubelet服务时创建的,如here

          sudo apt-get update && sudo apt-get install -y apt-transport-https curl
          curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
          cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
          deb https://apt.kubernetes.io/ kubernetes-xenial main
          EOF
          sudo apt-get update
          sudo apt-get install -y kubelet kubeadm kubectl
          sudo apt-mark hold kubelet kubeadm kubectl
          

          2 ) config.yaml 的创建。
          kubeadm 加入流程应该发生,因此当您运行 kubeadm join 时,kubeadm 使用 Bootstrap Token 凭证来执行 TLS 引导,它会获取下载 kubelet-config-1.X ConfigMap 所需的凭证并将其写入 /var/lib/kubelet/config.yaml

          成功执行后,您应该会看到以下日志:

          .
          .
          [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
          [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
          [kubelet-start] Starting the kubelet
          .
          .
          

          因此,在这两个步骤之后,您应该拥有/var/lib/kubelet/config.yaml

          kubeadm 加入流程失败

          在您的情况下,kubeadm join flow 似乎失败了,这可能是由于多种原因造成的,例如 iptables 的错误配置、已在使用的端口、容器运行时未正确安装等 - 如所述 herehere.

          据我所知,没有网络 CNI 兼容的解决方案不应该影响/var/lib/kubelet/config.yaml 的创建:

          A) 我们可以在kubeadm preflight checks 下看到哪些问题会导致加入阶段失败。

          B ) 我还通过删除我使用的当前解决方案 (Calico) 并再次运行 kubeadm resetkubeadm join 来测试这个问题,并且 kubeadm 日志中没有出现错误(我已经获得了成功的执行日志我上面提到的)和/var/lib/kubelet/config.yaml 已正确创建。

          (*) 当然集群不能在这种状态下运行——我只是想强调一下,我认为问题是 A 中提到的选项之一。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-17
            • 2014-02-24
            • 2014-07-08
            • 2013-02-17
            相关资源
            最近更新 更多