Kubernetes集群Calico组件在云服务器节点运行异常,本地节点正常的排查求助
排查Calico云节点Pod异常的思路
先理一下你的核心问题:云服务器工作节点上的Calico组件(kube-controllers和node)启动失败,结合你提到的网络配置疑点,我分享几个针对性的排查方向:
1. 先确认跨节点网络连通性与端口可达性
虽然你说路由器已经转发了端口,但还是要手动验证云节点和控制节点之间的关键端口是否真的能通:
- 在云节点上测试控制节点的K8s API端口:
nc -zv <控制节点公网IP> 6443,确保能建立连接 - 在控制节点上测试云节点的BGP端口:
nc -zv <云节点公网IP> 179,BGP是Calico路由同步的核心,这个端口必须双向可达 - 在云节点上测试本地Calico Felix的端口:
nc -zv localhost 9099,确认本地服务是否真的没起来
2. 修正API Server的地址暴露配置
你提到kubectl get --raw /api返回控制节点本地IP,这大概率是Calico Pod无法正常连接API Server的根源之一:
- 检查控制节点上API Server的启动参数(通常在
/etc/kubernetes/manifests/kube-apiserver.yaml里):- 确保
--advertise-address设置为控制节点的公网IP,而不是本地IP - 确保
--bind-address设置为0.0.0.0,让API Server监听所有网络接口
- 确保
- 修改后保存文件,kubelet会自动重启API Server,之后再执行
kubectl get --raw /api,应该返回公网IP了
3. 检查Calico节点的IP识别与BGP配置
因为你用公网IP作为BGP对等体,Calico必须正确识别云节点的公网IP:
- 查看Calico节点的IP配置:
calicoctl get nodes -o yaml(如果没装calicoctl,也可以用kubectl get nodes -o yaml看status.addresses里的ExternalIP) - 如果Calico识别的是云节点的内网IP,需要修改Calico的配置来指定公网IP:
- 编辑Calico的ConfigMap:
kubectl edit configmap calico-config -n kube-system - 添加或修改
node-autodetection-method,比如指定公网网卡(假设是eth0):node-autodetection-method: interface=eth0,或者直接指定IP:node-ip: <云节点公网IP>
- 编辑Calico的ConfigMap:
- 查看calico-node的日志,找BGP连接失败的细节:
kubectl logs <calico-node-pod-name> -n kube-system -c calico-node,看有没有类似*“无法连接对等体”“BGP会话未建立”*的错误
4. 排查Kubelet与API Server的连接稳定性
calico-kube-controllers的Secret挂载超时,通常是Pod无法稳定访问API Server导致的:
- 查看云节点上kubelet的日志:
journalctl -u kubelet -f,看有没有*“连接API Server超时”“TLS认证失败”“DNS解析失败”*的错误 - 测试云节点对控制节点endpoint的DNS解析:
nslookup <你的control-plane-endpoint>,确保能正确解析到公网IP - 检查云节点的kubelet配置(
/var/lib/kubelet/config.yaml),确认server字段指向的是公网endpoint,而不是控制节点的本地IP
5. 检查云节点的本地网络与防火墙规则
- 查看云节点的iptables规则,确认Calico的链(比如
CALICO-*)是否正确加载:iptables-save | grep CALICO,如果没有相关链,说明Calico的CNI插件没正常初始化 - 检查云节点的路由表:
ip route,看有没有Calico Pod CIDR的路由条目,这些路由应该由Felix管理 - 确认云服务商的安全组/防火墙是否允许了所有K8s和Calico相关的流量(不仅是端口转发,云服务器本身的安全组也要放开)
内容的提问来源于stack exchange,提问作者Yakuraku
相关产品推荐
相关产品推荐

