原因:在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