我部署了一个基于 kubeadm 的 kubernetes 集群 v1.24.3,它由一个控制平面节点和 3 个工作节点(所有 Centos 7 VM)组成。这些都在单个物理节点上“本地”运行。
在此设置中,我正在尝试部署 CNI 网络插件,但 CNI 提供程序容器在工作节点上出现故障,kubectl 日志报告的错误是“获取“https://10.96.0.1:443/api?timeout=32s”:拨号 tcp 10.96.0.1:443:连接:没有到主机的路由”。
控制平面节点上部署的 pod 正在运行,没有错误。
当我安装 Calico 的 tigera-operator 或 Weave net 时,会出现这种情况。Weave-net 部署了一个 DaemonSet,其控制平面节点上的 pod 成功运行,但部署在工作节点上的 pod 失败并出现上述错误。
对于 Calico 的 tigera-operator,单个 pod 部署在其中一个工作节点上,这也会失败并出现上述错误。
当我通过 ssh 进入控制平面节点并发出命令“nc -w 2 -v 10.96.0.1 443”时,我连接上了。当我尝试在任何一个工作节点上发出相同的命令时,连接未建立,我收到消息“Ncat:连接超时。”。
从工作节点,我是否应该手动配置 10.96.0.1 到控制平面节点的路由,如果是,我该怎么做?在我的设置中,控制平面节点的 IP 地址为 192.168.12.17,而其中一个工作节点的 IP 地址为 192.168.12.20。
答案1
此错误消息意味着节点无法访问集群内部的 kubernetes API。这意味着节点和控制平面之间的某些流量在某处被阻塞。
这可能与网络接口配置、kubeadm 配置(关于 IP 地址)以及最后的防火墙配置有关。
对我来说,最有效的方法是,首先观察一下,当我关闭所有防火墙时,一切开始正常。然后,我一步步回到安全配置,直到出现问题。通过使用 ufw,它的日志告诉我哪些流量使用的是公共接口而不是私有网络。解决方案是 InitConfiguration 中缺少一组参数:
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
...
nodeRegistration:
kubeletExtraArgs:
"node-ip": "<insert the controllers private ip here>"
localAPIEndpoint:
advertiseAddress: "<insert the controllers private ip here>"
bindPort: 6443
在 HA 设置中,还要记得在 JoinConfiguration -> controlPlane 部分为额外的控制器添加这些行。