卸载 calico 后,新 pods 卡在容器创建状态

After uninstalling calico, new pods are stuck in container creating state

卸载 calico 后,kubectl -f calico.yaml,无法在集群中创建新的 pods。集群中的任何新 pods 都停留在容器创建状态。 Kubectl describe 显示以下错误:

Warning FailedCreatePodSandBox 2m kubelet, 10.0.12.2 Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "f15743177fd70c5eabf70c60be5b8b354e5346837d1b5d59bf99d1d1b5d6416c" network for pod "test-9465-768b57b5df-fv9d4": NetworkPlugin cni failed to set up pod "test-9465-768b57b5df-fv9d4_policy-demo" network: error getting ClusterInformation: connection is unauthorized: Unauthorized, failed to clean up sandbox container "f15743177fd70c5eabf70c60be5b8b354e5346837d1b5d59bf99d1d1b5d6416c" network for pod "test-9465-768b57b5df-fv9d4": NetworkPlugin cni failed to teardown pod "test-9465-768b57b5df-fv9d4_policy-demo" network: error getting ClusterInformation: connection is unauthorized: Unauthorized]

主要问题是因为calico有一个init容器但是没有cleanup容器。 T

要取消部署 calico,我们必须执行通常的操作 kubectl delete -f <yaml>,然后在每个节点 /etc/cni/net.d/ 中删除一个 calico conf 文件。此配置文件与其他二进制文件一起由 init 容器加载到主机上。

https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/

由此link我们可以看出kubelet是从默认目录读取配置文件,如果有多个配置文件,则从字母顺序第一个出现的配置文件中应用CNI插件订单(为什么,天哪,为什么??)。

因此,在我们的例子中,卸载 calico 后,它会从所有管理员权限中删除,但节点仍会尝试根据从默认目录中获取的配置文件应用 calico 规则。然后重新启动节点以摆脱 iptable 规则。

删除文件并重新启动节点解决了问题,我们恢复了正常行为。解决相同问题的另一种方法是,如果您在托管的 kubernetes 集群上,只需从集群中终止节点。因为,public 云基础架构自动启动另一个节点以保持相同状态,它不再具有 calico 配置文件。