问题
通过 kubeadm v1.14.0 版本安装kubernetes
并 通过容器的方式启动calico
也就是使用 calico.yaml 版本: v3.1.3
安装完成,并加入各个节点测试后发现
在各台Node上 都无法ping通pod IP
解决方案
calico.yaml 文件官方位置: calico.yaml
在calico.yaml
文件中的calico-node
部分加入环境变量IP_AUTODETECTION_METHOD
,并设置值为:can-reach=x.x.x.x
注意:请将
can-reach=x.x.x.x
的 x.x.x.x设置为你们集群中一个可以访问的IP地址,或者域名。
|
一般选择使用 网关的地址
calico.yaml如下:
spec:
hostNetwork: true
serviceAccountName: calico-node
terminationGracePeriodSeconds: 0
containers:
- name: calico-node
image: quay.io/calico/node:v3.1.3
env:
- name: IP_AUTODETECTION_METHOD
value: can-reach=172.22.203.1
172.22.203.1
是我的网关地址
重新apply calico.yaml
ping pod的IP 发现联通!
解决思路
我通过重启 calico 并在启动时候查看它的日志发现日志,选用了一个奇怪的网卡作为启动的网卡
kubectl delete -f /etc/kubernetes/addons/calico.yaml
kubectl apply -f /etc/kubernetes/addons/calico.yaml
kubectl get pods -n kube-system
kubectl log calico-node-hkcvz -c calico-node -n kube-system
calico-node-hkcvz 是我的calico pod名称,请按照实际情况修改。这个日志滚动比较快请尽快查看,一般在日志开始的一屏位置。
日志中选择出一个叫做br-b733428777f6
的网卡,这个网卡估计是bird产生的
2019-08-15 04:39:10.859 [INFO][8] startup.go 564: Using autodetected IPv4 address on interface br-b733428777f6: 172.19.0.1/16
很明显这个网卡是无法用来联通网络的
查阅了下 calico的官网 config
发现calico 默认以 first-found
的方式来检测网卡,也就是把找到的一个网卡作为calico的工作网卡,这就导致上面的问题。
所以需要在calico-node启动时,根据文档我们可以找到can-reach
的参数,该参数表明通过,否能到达某个ip作为检测手段。
因此我们可以将该检测地址设为 网关IP
在calico node下面加入如下环境变量
name: calico-node
image: quay.io/calico/node:v3.1.3
env:
- name: IP_AUTODETECTION_METHOD
value: can-reach=172.22.203.1
172.22.203.1 是我这几台机器网关的地址
这样删除calico后,重启启动calico,再次查看启动日志
2019-08-15 04:50:27.942 [INFO][10] reachaddr.go 46: Auto-detected address by connecting to remote Destination="172.22.203.1" IP=172.22.203.10
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="cali7b8c9bd2e1f"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="veth24c7125"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="br-0b07d34c53b5"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 57: Checking CIDR CIDR="172.18.0.1/16"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="tunl0"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 57: Checking CIDR CIDR="111.111.1.1/32"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="docker0"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 57: Checking CIDR CIDR="172.17.0.1/16"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="enp0s20u1u5"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="eno4"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="eno3"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="eno2"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 55: Checking interface CIDRs Name="eno1"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 57: Checking CIDR CIDR="172.22.203.10/24"
2019-08-15 04:50:27.943 [INFO][10] reachaddr.go 59: Found matching interface CIDR CIDR="172.22.203.10/24"
2019-08-15 04:50:27.943 [INFO][10] startup.go 590: Using autodetected IPv4 address 172.22.203.10/24, detected by connecting to 172.22.203.1
可以发现calico依次遍历各个网卡,尝试连接 网关IP172.22.203.1
最终找到一个能到达指定IP的网卡 eno1
参考文献
[1]. calico . v2.2 . https://docs.projectcalico.org/v2.2/reference/node/configuration