报错详情
Calico CNI panicked during ADD:runtime error: invalid memory address or nil pointer dereference
多次报错后,pod会正常启动。
解决
我的环境是:k8s 1.20.15,calico 3.21.6
参考这篇issue:https://github.com/projectcalico/calico/issues/5779
尝试重启calico-node pod和应用pod,未生效,重启node也未生效。未修改ippool测试。
怀疑是版本bug,升级calico版本到3.22.5,升级教程
https://docs.tigera.io/archive/v3.22/maintenance/kubernetes-upgrade#upgrading-an-installation-that-uses-manifests-and-the-kubernetes-api-datastore
curl https://projectcalico.docs.tigera.io/archive/v3.22/manifests/calico.yaml -O
kubectl apply -f calico.yaml
升级完成后,再次启动pod,没有这个报错了,但是出现了新的报错:出现多次后pod也能正常启动。
(combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "xxx" network for pod "xxx": networkPlugin cni failed to set up pod "xxx" network: error adding host side routes for interface: caliefdccd95d3d, error: route (Ifindex: 9709, Dst: 10.43.166.169/32, Scope: link) already exists for an interface other than 'caliefdccd95d3d': route (Ifindex: 1214, Dst: 10.43.166.169/32, Scope: link, Iface: calib3187871ec0)
这个报错是calico去分配pod地址的时候发现已经被占用了,就尝试用别的ip,如果还冲突就继续报错,直到分配到正常ip。为什么会冲突呢,因为环境中有的pod ip在IPAM的bolck内,但实际上并未分配。
kubectl get ipamblocks.crd.projectcalico.org 10-43-135-0-26 node3
calicoctl ipam show --allow-version-mismatch
解决方法:
- 使用calicoctl检查异常的ip,释放异常ip,再删除所有异常的pod。
- 还有一种是切换cidr https://docs.tigera.io/calico/latest/networking/ipam/migrate-pools#features ,kube-proxy 配置也要换。
- 重启node
使用calicoctl检查异常的ip命令:
calicoctl ipam check --allow-version-mismatch --show-problem-ips
这里采用了重启node的方式,我这里有100多个异常ip,下面是重启多台node后的。再删除这几个coredns的异常pod即可。
calicoctl ipam check
返回的problem数字下降到0,所有节点上的pod都可以正常创建。