Kubernetes - Calico-Nodes 0/1 就绪

Kubernetes - Calico-Nodes 0/1 Ready

我们正在 K8s env 上部署 Jenkins,使用 calico 网络插件有 1 个主节点和 4 个工作节点,pods 是在 Jenkins 运行 作业时创建的,但是问题主机名未解析,Jenkins 中没有错误日志,在检查 pods 时,主节点上的 calico pod 已关闭,不确定是否是上述问题的原因。

[root@kmaster-1 ~]#  kubectl get pod calico-node-lvvx4 -n kube-system -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP             NODE                                  NOMINATED NODE   READINESS GATES
calico-node-lvvx4   0/1     Running   9          9d    x0.x1.x5.x6   kmaster-1.b.x.x.com   <none>           <none>



Events:
  Type     Reason     Age                       From                                          Message
  ----     ------     ----                      ----                                          -------
  Warning  Unhealthy  107s (x34333 over 3d23h)  kubelet, kmaster-1.b.x.x.com  (combined from similar events): Readiness probe failed: calico/node is not ready: BIRD is not ready: BGP not established with 10.x1.2x.x23,10.x1.x7.x53,10.x1.1x.1x5,10.x1.2x.1x22020-04-12 08:40:48.567 [INFO][27813] health.go 156: Number of node(s) with BGP peering established = 0

10.x1.2x.x23,10.x1.x7.x53,10.x1.1x.1x5,10.x1.2x.1x2是worker的IPpods,他们是netstat 显示 BGP 已建立,但未与主站建立连接。 179端口在master上开放,不知道为什么BGP对等不建立,请指教。

将以下几行添加到 calico yaml 中产生了神奇效果。

指定接口

        - name: IP_AUTODETECTION_METHOD
          value: "interface=ens."

通过firewall-cmd激活calico使用的网络接口。

最近在使用虚拟机操作节点时,虚拟机的界面被停用,导致同样的现象。

此外,除了 Sanjay M. P.,我还要说我必须关闭防火墙。

systemctl disable --now firewalld

也许你可以以某种方式调整它,但我还没有测试过,所以我不会建议

Sanjay M.P. 分享的内容对我有用,但是我想澄清导致问题的原因,以及为什么该解决方案更详细。

首先,我正在 运行 设置一个 ubuntu 环境,所以 Piknik 共享的东西不起作用,firewalld 只在 centos / rhel 系统上。尽管如此,ufw 在所有节点上都被禁用了。

通过执行 kubectl describe pod calico-node-*****,我能够缩小我收到的导致此问题的确切错误。我发现 calico BIRD 服务无法连接到对等点。还显示了 calico 节点试图用来与其 BGP 对等方配对的 IP 地址。它使用了错误的接口,因此错误的 ips。

为了自己定义问题,我所有的节点主机虚拟机都有多个接口。如果您没有明确指定要使用的接口,calico 会“自动”选择一个,无论您是否需要该接口。

解决方案是在 calico.yaml 文件中构建 calico 覆盖网络时指定特定接口。 Sanjay M. P. 使用正则表达式,如果您有不同的命名接口,它可能会起作用,但是,由于我是 运行ning Ubuntu 服务器,所有接口都以字符串“ens”开头,因此会发生同样的问题。

我已经删除了大部分 calico.yaml 文件以显示此设置应该在哪里的确切位置(~第 675 行)在那里添加设置,我也留下了 CALICO_IPV4POOL_CIDR因为需要将此设置适当地设置为在 kubeadm 初始化时指定的相同子网范围:

spec:
  template:
    spec:
      containers:
        - name: calico-node
          image: calico/node:v3.14.2
          env:
            - name: CALICO_IPV4POOL_CIDR
              value: "192.168.0.0/22"
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens224"

不幸的是,我没有找到回滚旧配置的方法,所以我只是重建了整个集群,并重新部署了 calico overlay(感谢上帝提供 VM 快照)。

kubeadm 初始化您的集群。 然后 运行 kubectl create -f calico.yaml 添加设置以构建覆盖网络。

确认覆盖网络正常工作

  • 运行 watch -n1 kube-system get pods -o wide,然后添加您的节点。确保在新添加的 kube 节点上构建的所有 calico 节点都显示为“1/1 运行”。
  • 下载并安装 calicoctl,然后 运行 calicoctl node status,确保 BGP 使用正确的网络。

您可以阅读更多关于 IP_AUTODETECTION_METHOD here