【问题标题】:Kubernetes - Calico-Nodes 0/1 ReadyKubernetes - Calico-Nodes 0/1 就绪
【发布时间】:2020-07-26 19:13:13
【问题描述】:

我们在 K8s 环境中部署 Jenkins,使用 calico 网络插件有 1 个主节点和 4 个工作节点,pod 是在 Jenkins 中运行作业时创建的,但问题是主机名无法解析,没有错误日志在 Jenkins 中,在检查 pod 时,主节点上的 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 是工作 pod 的 IP,它们相互连接,如 netstat 所示BGP 已建立,但未与 master 建立。 179端口在master上是开放的,不知道为什么BGP peering没有建立,请指教。

【问题讨论】:

  • 您是否尝试过 calico 故障排除? There 正是您遇到的错误。我假设您使用 kubeadm,您是否添加了 here 中提到的 --pod-network-cidr?
  • @jt97 是的,我之前确实通过了它们,我的 CoreDNS 已启动并正在运行,不知道如何在主 calico pod 和节点 calico pod、主节点和工作节点之间建立 BGP 会话可以到达。
  • 您是否尝试过指定stackoverflow answer 中提到的接口?也许尝试安装新/旧版本的印花布?
  • @jt97 感谢您的宝贵时间,是的,我尝试在运行时使用上述更改进行编辑,但它不接受,所以我将重新安装 calico 并检查。

标签: jenkins kubernetes project-calico cni


【解决方案1】:

将以下几行添加到 calico yaml 中起到了神奇的作用。

指定接口

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

【讨论】:

  • 很难判断您是指定特定接口还是使用正则表达式函数。如果使用正则表达式”value: "interface=ens." 需要为 "value: "interface=ens.*" “ens.”不起作用。
【解决方案2】:

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

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

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

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

解决方案是在 calico.yaml 文件中构建 calico 覆盖网络时指定特定接口。 Sanjay M. P. 使用正则表达式,如果您有不同的命名接口,它可能会起作用,但是,当我运行 Ubuntu Server 时,字符串“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 覆盖(感谢上帝提供 VM 快照)。

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

确认覆盖网络正常工作

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

您可以阅读有关 IP_AUTODETECTION_METHOD here 的更多信息。

【讨论】:

    【解决方案3】:

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

    systemctl disable --now firewalld
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 2019-07-22
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        相关资源
        最近更新 更多