3

卸载 calico 后,kubectl -f calico.yaml,无法在集群中创建新的 Pod。集群中的任何新 pod 都停留在容器创建状态。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拆解吊舱“test-9465-768b57b5df-fv9d4_policy-demo”网络:获取 ClusterInformation 时出错:连接未授权:未授权]

4

1 回答 1

11

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

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

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

从这个链接我们可以看到,kubelet 从默认目录读取配置文件,如果有多个配置文件,那么它会从按字母顺序出现的配置文件中应用 CNI 插件(为什么,天哪?? )。

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

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

于 2020-05-08T05:56:24.657 回答