诊断Kubernetes自托管代理的常见网络问题
·
检查节点网络连通性
确保所有节点之间能够互相通信。使用 ping 和 traceroute 测试节点间的网络延迟和路由路径。如果节点间存在防火墙或安全组规则,需确保以下端口开放:
- 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无法访问。
更多推荐
所有评论(0)