【问题标题】:Kubernetes worker node is NotReady due to CNI plugin not initialized由于 CNI 插件未初始化,Kubernetes 工作节点未就绪
【发布时间】:2020-12-01 16:45:47
【问题描述】:

我正在使用 kind 在我的本地 Macbook 上运行测试 kubernetes 集群。

我找到了状态为NotReady的节点之一:

$ kind get clusters                                                                                                                                                                 
mc

$ kubernetes get nodes
NAME                STATUS     ROLES    AGE     VERSION
mc-control-plane    Ready      master   4h42m   v1.18.2
mc-control-plane2   Ready      master   4h41m   v1.18.2
mc-control-plane3   Ready      master   4h40m   v1.18.2
mc-worker           NotReady   <none>   4h40m   v1.18.2
mc-worker2          Ready      <none>   4h40m   v1.18.2
mc-worker3          Ready      <none>   4h40m   v1.18.2

kubectl describe node mc-worker唯一有趣的是CNI插件没有初始化:

Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Tue, 11 Aug 2020 16:55:44 -0700   Tue, 11 Aug 2020 12:10:16 -0700   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Tue, 11 Aug 2020 16:55:44 -0700   Tue, 11 Aug 2020 12:10:16 -0700   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Tue, 11 Aug 2020 16:55:44 -0700   Tue, 11 Aug 2020 12:10:16 -0700   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            False   Tue, 11 Aug 2020 16:55:44 -0700   Tue, 11 Aug 2020 12:10:16 -0700   KubeletNotReady              runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady
message:Network plugin returns error: cni plugin not initialized

我有 2 个类似的集群,而且这只发生在这个集群上。

由于kind使用本地Docker守护进程将这些节点作为容器运行,我已经尝试重启容器(应该相当于重启节点)。

我考虑过删除并重新创建集群,但应该有一种方法可以在不重新创建集群的情况下解决这个问题。

这是我正在运行的版本:

$ kind version                                                                                                                                                                     
kind v0.8.1 go1.14.4 darwin/amd64

$ kubectl version                                                                                                                                                  
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-30T20:19:45Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

你如何解决这个问题?

【问题讨论】:

    标签: kubernetes cni kind


    【解决方案1】:

    最可能的原因:

    docker 虚拟机正在耗尽某些资源,无法在该特定节点上启动 CNI。

    您可以通过连接到 HyperKit 虚拟机中四处浏览:

    从外壳:

    screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    

    如果由于某种原因这不起作用:

    docker run -it --rm --privileged --pid=host alpine nsenter -t 1 -m -u -n -i sh
    

    在虚拟机中一次:

    # ps -Af
    # free
    # df -h
    ...
    

    然后您可以随时更新 docker UI 上的设置:

    最后,您的节点毕竟是在容器中运行的。因此,您可以连接到该容器并查看您看到的 kubelet 错误:

    docker ps
    CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                       NAMES
    6d881be79f4a        kindest/node:v1.18.2   "/usr/local/bin/entr…"   32 seconds ago      Up 29 seconds       127.0.0.1:57316->6443/tcp   kind-control-plane
    docker exec -it 6d881be79f4a bash
    root@kind-control-plane:/# systemctl status kubelet
    ● kubelet.service - kubelet: The Kubernetes Node Agent
       Loaded: loaded (/kind/systemd/kubelet.service; enabled; vendor preset: enabled)
      Drop-In: /etc/systemd/system/kubelet.service.d
               └─10-kubeadm.conf
       Active: active (running) since Wed 2020-08-12 02:32:16 UTC; 35s ago
         Docs: http://kubernetes.io/docs/
     Main PID: 768 (kubelet)
        Tasks: 23 (limit: 2348)
       Memory: 32.8M
       CGroup: /docker/6d881be79f4a8ded3162ec6b5caa8805542ff9703fabf5d3d2eee204a0814e01/system.slice/kubelet.service
               └─768 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet
    /config.yaml --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --fail-swap-on=false --node-ip= --fail-swap-on=false
    ...
    

    ✌️

    【讨论】:

    • 我认为你是对的。我停止了所有容器并只启动了这种集群,现在一切都恢复正常了。我尝试启动另一种集群,但在启动时出现其他症状。在深入研究该问题后,它也可能与缺乏资源有关。本来我用的是 8GB/8CPU,但我会尝试 16GB。
    • 我似乎在使用 16GB 时也遇到了问题。使用 kubectl 时出现“无法连接到集群:EOF”。接下来,我正在尝试减少并仅使用单一类型的集群(删除所有其他集群)。我还意识到我有一个 docker kubernetes 集群在后台运行,我也将停止它。
    • 那么你的机器有多少内存?
    • 我的 Macbook 总共有 32GB。在运行 2 种 k8s 集群时,我确实尝试了 16GB 的 Docker 守护进程,但现在我只是一个单一的 k8s 集群并将其降低到 8GB。只要我只运行一种 k8s 集群,它现在似乎运行良好
    • 很高兴听到,我猜"cannot connect to cluster: EOF 是一个不同的错误。也许您的 kube-apiserver 无法启动或 Docker 出现问题。
    【解决方案2】:

    我遇到了这种情况。 Master 已就绪,但工作节点的状态不是。经过一番调查,我发现 /opt/cni/bin 是空的 - 我的工作节点主机没有网络插件。因此,我安装了这个“kubernetes-cni.x86_64”并重新启动了 kubelet 服务。这解决了我的工作节点的“NotReady”状态。

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2019-06-02
      • 2021-01-21
      • 2020-05-31
      • 2022-10-05
      • 2021-04-06
      • 2017-03-02
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多