本文共 3723 字,大约阅读时间需要 12 分钟。
原因:在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/bincurl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.11.3/calicoctlchmod +x calicoctl
二、编辑配置文件/etc/calico/calicoctl.cfg
mkdir /etc/calico
因为我们使用的是内部etcd集群,所以需要对calicoctl进行配置,使其能读取calico配置信息。
cat > /etc/calico/calicoctl.cfg << EOFapiVersion: projectcalico.org/v3kind: CalicoAPIConfigmetadata:spec: datastoreType: "kubernetes" kubeconfig: "/root/.kube/config"EOF
如果你使用的是外部etcd集群,这里提供个模版可参考:
apiVersion: projectcalico.org/v3kind: CalicoAPIConfigmetadata: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 statusNo IPv6 peers found.
状态“up”为正常,状态为“start”为还在启动状态,未就绪
四、使用calicoctl工具来对calico进行更改
(1)查看问题节点的yaml文件calicoctl get node p40 -o yaml
apiVersion: projectcalico.org/v3kind: Nodemetadata: 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-7f1f21ab86caspec: 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.yamlkubectl get pod -n kube-system
可以看到calico-node的节点都正常启动
以上步骤完美解决,感谢
转载地址:http://bxhwi.baihongyu.com/