k8s 集群,使用 calico 作为 CNI,calico 的安装配置参考 https://docs.projectcalico.org/getting-started/kubernetes/hardway/overview。 calico 需要 k8s 运行 calico-node 的 daemonset 在每个node 上运行一个 calico-node,calico-node 里面包括了Felix,BIRD,confd组件。calico-node 是 node 上网络能够正常使用的必要条件。 k8s apply calico-node 的 daemonset 后,发现有两个 node 上面的 calico-node 运行失败导致对应节点上的网络不通
kube-system calico-node-5wfb9 1/1 Running 7 181d
kube-system calico-node-6hjkt 1/1 Running 9 181d
kube-system calico-node-r694q 0/1 CrashLoopBackOff 9318 181d
kube-system calico-node-wrx6h 0/1 CrashLoopBackOff 28 181d
执行 kubectl logs -n kube-system calico-node-r694q
查看对应 pod 的log,有如下错误提示:
2021-10-29 04:02:38.355 [INFO][9] startup.go 584: Using autodetected IPv4 address on interface br-84c838ba6a99: 172.18.0.1/16
2021-10-29 04:02:38.355 [INFO][9] startup.go 452: Node IPv4 changed, will check for conflicts
2021-10-29 04:02:38.365 [WARNING][9] startup.go 878: Calico node 'xxxxx' is already using the IPv4 address 172.18.0.1.
2021-10-29 04:02:38.366 [INFO][9] startup.go 210: Clearing out-of-date IPv4 address from this node IP="172.18.0.1/16"
2021-10-29 04:02:38.379 [WARNING][9] startup.go 1057: Terminating
从 log 来看是因为该 node 上面 calico-node 这个 pod 启动时获取的 ip 地址跟其他 node 上使用的 ip 地址冲突了,这个节点获取 ip 使用的网口是一个 bridge 口,明显不是该 node 的 WAN 口。如何才能使 calico-node 使用正确 WAN 上的ip呢。
https://docs.projectcalico.org/getting-started/kubernetes/hardway/install-node#install-daemon-set
有如下配置:
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
然后查看 calico 官方文档: https://docs.projectcalico.org/reference/node/configuration
有如下说明:
IP_AUTODETECTION_METHOD
The method to use to autodetect the IPv4 address for this host. This is only used when the IPv4 address is being autodetected. See IP Autodetection methods for details of the valid methods. [Default: first-found]
说明如果不配置 IP_AUTODETECTION_METHOD 这个环境变量,calico-node daemonset 默认的策略是获取第一个取到的网卡的 ip 作为 calico node 的ip,那样往往是不满足需求的,可以修改 calico-node daemonset, 增加如下环境变量配置,参考 https://docs.projectcalico.org/reference/node/configuration#ip-autodetection-methods:
- name: IP
value: "autodetect"
- name: IP_AUTODETECTION_METHOD
value: can-reach=114.114.114.114
然后重新 apply calico-node daemonset,问题解决。