检查节点网络连通性

确保所有节点之间能够互相通信。使用 pingtraceroute 测试节点间的网络延迟和路由路径。如果节点间存在防火墙或安全组规则,需确保以下端口开放:

  • TCP 6443(Kubernetes API Server)
  • TCP 2379-2380(etcd)
  • TCP 10250(kubelet)
  • TCP 10259(kube-scheduler)
  • TCP 10257(kube-controller-manager)

运行以下命令检查节点间连通性:

kubectl get nodes -o wide  # 获取节点IP列表
ping <node-ip>
traceroute <node-ip>

验证DNS解析

Kubernetes依赖DNS服务(如CoreDNS)解析内部服务名称。检查Pod是否能够解析集群内服务:

kubectl run -it --rm --image=busybox:1.28 dns-test --restart=Never -- nslookup kubernetes.default

如果解析失败,检查CoreDNS Pod状态和日志:

kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system <coredns-pod-name>

检查Pod网络插件

自托管集群通常使用Calico、Flannel或Cilium等CNI插件。确认插件是否正常运行:

kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium'

如果插件Pod异常,检查其日志并排查配置错误:

kubectl logs -n kube-system <cni-plugin-pod-name>

确保主机网络配置(如/etc/cni/net.d/)与CNI插件兼容。

排查服务Endpoint问题

如果服务无法访问,检查Service和Endpoint资源:

kubectl get svc <service-name> -o yaml  # 查看服务配置
kubectl get endpoints <service-name>     # 确认Endpoint是否包含正确Pod IP

若Endpoint为空,可能是标签选择器不匹配或目标Pod未就绪。

测试跨节点Pod通信

验证Pod能否跨节点通信。创建测试Pod并尝试访问其他节点上的Pod IP:

kubectl run -it --rm --image=alpine network-test --restart=Never -- sh
ping <target-pod-ip>

如果通信失败,检查节点防火墙规则或CNI插件的网络策略。

检查网络策略限制

如果启用了NetworkPolicy,可能导致流量被拦截。列出所有网络策略:

kubectl get networkpolicy --all-namespaces

临时禁用策略测试是否影响连通性。

分析kube-proxy日志

kube-proxy负责Service的IPVS/IPtables规则。检查其日志和规则:

kubectl logs -n kube-system <kube-proxy-pod-name>
sudo iptables -L -t nat | grep <service-name>  # 或使用`ipvsadm`(IPVS模式)

规则缺失可能导致Service无法访问。

更多推荐