k8s集群使用calico遇到的问题,报错内容如:“Readiness probe failed: caliconode is not ready: BIRD is not ready: BGP not established with”

原因:在calico.yaml文件中,IP_AUTODETECTION_METHOD 配置项默认为first-found,这种模式中calico会使用第一获取到的有效网卡,虽然会排除docker网络,localhost啥的,但是在复杂网络环境下还是有出错的可能。在这次异常中p40主机上的calico选择了一个vbr网卡。

提供两种解决方案,第一种机器重启后依然生效,解决方案是修改calico.yaml中 IP_AUTODETECTION_METHOD 的默认值,第二种机器重启后需要重新配置,解决方案是使用calicoctl命令。

第一种方案:

一、修改 calico.yaml 文件

调整calicao
网络插件的网卡发现机制,修改IP_AUTODETECTION_METHOD对应的value值。官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-node
mesh。我们可以修改成can-reach或者interface的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

calico.yaml 文件添加以下二行

   - name: IP_AUTODETECTION_METHOD
      value: "interface=ens.*"  # ens 根据实际网卡开头配置,支持正则表达式

配置示例如下

            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens.*"
            # Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"
            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"

二、重新应用calico.yaml

kubectl apply -f calico.yaml

查看

kubectl get pod --all-namespaces

第二种方案:

一、下载和安装calicoctl工具,注意calico版本与calicoctl版本要相同

cd /usr/local/bin
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.11.3/calicoctl
chmod +x calicoctl

二、编辑配置文件/etc/calico/calicoctl.cfg

mkdir /etc/calico

因为我们使用的是内部etcd集群,所以需要对calicoctl进行配置,使其能读取calico配置信息。

cat > /etc/calico/calicoctl.cfg << EOF
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "kubernetes"
  kubeconfig: "/root/.kube/config"
EOF

如果你使用的是外部etcd集群,这里提供个模版可参考:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "etcd"
  etcdEndpoints: "https://192.168.246.193:2379,https://192.168.246.194:2379,https://192.168.246.195:2379"
  etcdKeyFile: "/etc/kubernetes/pki/etcd/etcd-key.pem"
  etcdCertFile: "/etc/kubernetes/pki/etcd/etcd.pem"
  etcdCACertFile: "/etc/kubernetes/pki/etcd/ca.pem"

三、calicoctl常用命令
(1)查看网络节点

calicoctl get node
NAME     
node-1   
node-2   
p40      

(2)节点网络状态

calicoctl node status 
Calico process is running.

IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
|  PEER ADDRESS   |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+-----------------+-------------------+-------+----------+-------------+
| 10.95.10.92 | node-to-node mesh | up    | 05:08:38 | Established |
| 10.95.10.20 | node-to-node mesh | start | 05:08:38 | Passive |
+-----------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

状态“up”为正常,状态为“start”为还在启动状态,未就绪

四、使用calicoctl工具来对calico进行更改
(1)查看问题节点的yaml文件

calicoctl get node p40 -o yaml
apiVersion: projectcalico.org/v3
kind: Node
metadata:
  annotations:
    projectcalico.org/kube-labels: '{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"p40","kubernetes.io/os":"linux","node-role.kubernetes.io/master":""}'
  creationTimestamp: 2020-09-04T03:02:35Z
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/os: linux
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: p40
    kubernetes.io/os: linux
    node-role.kubernetes.io/master: ""
  name: p40
  resourceVersion: "948517"
  uid: 68bb3f69-6726-4c52-b9a2-7f1f21ab86ca
spec:
  bgp:
    ipv4Address: 192.168.1.254/24  #很明显,calico网络绑定了错误的IP地址,正确的IP地址应该是:10.95.10.20
    ipv4IPIPTunnelAddr: 10.244.185.0

(2)将ip更改正确

calicoctl get node p40 -o yaml > calico_p40.yaml
vim calico_p40.yaml

......
spec:
  bgp:
    ipv4Address: 10.95.10.20/24
    ipv4IPIPTunnelAddr: 10.244.185.0

重新启动

calicoctl apply -f calico_p40.yaml
kubectl get pod -n kube-system

可以看到calico-node的节点都正常启动

以上步骤完美解决,感谢https://blog.51cto.com/wutengfei/2478495

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐