网络问题排查
网络问题排查
网络问题是 Kubernetes 中最常见也最复杂的故障类型之一。
DNS 解析问题
症状
# Pod 内无法解析域名
nslookup kubernetes.default
# Server: 10.96.0.10
# ** server can't find kubernetes.default: NXDOMAIN
排查步骤
# 1. 检查 CoreDNS Pod 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 2. 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns
# 3. 测试 DNS 服务
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default
# 4. 检查 DNS 配置
kubectl get svc -n kube-system kube-dns
kubectl get configmap -n kube-system coredns -o yaml
常见原因及解决方案
原因 1:CoreDNS Pod 未运行
# 查看 CoreDNS 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 如果 Pending,检查资源
kubectl describe pod -n kube-system -l k8s-app=kube-dns
# 解决方案:确保节点资源充足
原因 2:DNS 服务 IP 配置错误
# 检查 kubelet 配置
cat /var/lib/kubelet/config.yaml | grep clusterDNS
# 应该指向 kube-dns Service IP
clusterDNS:
- 10.96.0.10
# 检查 Service
kubectl get svc -n kube-system kube-dns
原因 3:CoreDNS ConfigMap 配置错误
# 检查 CoreDNS 配置
kubectl get configmap -n kube-system coredns -o yaml
# 正确的配置示例
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
原因 4:NetworkPolicy 阻止 DNS 流量
# 检查 NetworkPolicy
kubectl get networkpolicy -n <namespace>
# 确保允许访问 kube-dns
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
Service 访问不通
症状
# Pod 之间无法通过 Service 访问
curl http://myapp-service:8080
# curl: (7) Failed to connect to myapp-service port 8080: Connection refused
排查步骤
# 1. 检查 Service 是否存在
kubectl get svc myapp-service
# 2. 检查 Endpoints
kubectl get endpoints myapp-service
# 3. 检查 Pod 标签
kubectl get pods --show-labels
# 4. 测试直接访问 Pod IP
kubectl get pods -o wide
curl http://<pod-ip>:8080
# 5. 在 Pod 内测试
kubectl exec -it <pod-name> -- curl http://myapp-service:8080
常见原因及解决方案
原因 1:Service 选择器不匹配
# 检查 Service selector
kubectl get svc myapp-service -o yaml | grep -A 5 selector
# 检查 Pod labels
kubectl get pods -l app=myapp --show-labels
# 解决方案:确保标签匹配
kubectl label pods <pod-name> app=myapp
原因 2:Endpoints 为空
# 检查 Endpoints
kubectl get endpoints myapp-service
# 如果 ENDPOINTS 列为空
# 原因:没有 Pod 匹配 Service selector
# 解决方案
# 1. 检查 Pod 是否 Ready
kubectl get pods -l app=myapp
# 2. 检查健康检查
kubectl describe pod <pod-name> | grep -A 10 Conditions
原因 3:端口配置错误
# Service 配置
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 8080 # Service 端口
targetPort: 3000 # 容器端口(必须匹配)
# 检查容器端口
kubectl get pod <pod-name> -o yaml | grep -A 5 ports
# 确保 targetPort 与容器端口一致
原因 4:NetworkPolicy 阻止流量
# 检查是否有 NetworkPolicy
kubectl get networkpolicy -n <namespace>
# 查看详细配置
kubectl describe networkpolicy <policy-name>
# 测试:暂时删除 NetworkPolicy
kubectl delete networkpolicy <policy-name>
# 测试是否恢复正常
Pod 间网络不通
症状
# Pod A 无法访问 Pod B
kubectl exec pod-a -- curl http://<pod-b-ip>:8080
# 超时或连接拒绝
排查步骤
# 1. 检查 Pod IP
kubectl get pods -o wide
# 2. 测试 Pod 之间连通性
kubectl exec pod-a -- ping <pod-b-ip>
# 3. 检查网络插件
kubectl get pods -n kube-system | grep -E 'calico|flannel|weave'
# 4. 检查路由
kubectl exec pod-a -- ip route
# 5. 使用 tcpdump 抓包
kubectl exec pod-a -- tcpdump -i any -nn host <pod-b-ip>
CNI 插件问题
Calico 问题排查
# 检查 Calico 组件
kubectl get pods -n kube-system -l k8s-app=calico-node
# 查看日志
kubectl logs -n kube-system -l k8s-app=calico-node
# 检查 BGP 对等
calicoctl node status
# 检查 IP Pool
calicoctl get ippool -o yaml
# 检查路由
kubectl exec <pod-name> -- ip route
Flannel 问题排查
# 检查 Flannel DaemonSet
kubectl get ds -n kube-system kube-flannel-ds
# 查看日志
kubectl logs -n kube-system -l app=flannel
# 检查 Flannel 配置
kubectl get cm -n kube-system kube-flannel-cfg -o yaml
跨节点网络不通
症状
同节点的 Pod 可以通信,跨节点的 Pod 无法通信。
排查步骤
# 1. 检查节点网络
kubectl get nodes -o wide
# 2. 在节点上测试连通性
# 登录到节点
ping <other-node-ip>
# 3. 检查防火墙规则
sudo iptables -L -n | grep <pod-cidr>
# 4. 检查路由表
ip route | grep <pod-cidr>
# 5. 检查 CNI 网桥
ip link show cni0
brctl show
常见原因及解决方案
原因 1:防火墙阻止
# 检查防火墙
sudo iptables -L -n
# 临时关闭防火墙测试
sudo iptables -F
# 或添加允许规则
sudo iptables -A FORWARD -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10250 -j ACCEPT
原因 2:云平台安全组配置
# AWS 安全组需要允许:
# - VPC CIDR 内所有流量
# - NodePort 范围(30000-32767)
# - API Server(6443)
# 阿里云安全组需要允许:
# - Pod CIDR 内所有流量
# - Service CIDR 内所有流量
原因 3:路由表缺失
# 检查路由
ip route
# 应该有类似的路由:
# 10.244.1.0/24 via 192.168.1.2 dev eth0
# 10.244.2.0/24 via 192.168.1.3 dev eth0
# 如果缺失,检查 CNI 插件配置
Ingress 访问问题
症状
外部无法访问通过 Ingress 暴露的服务。
排查步骤
# 1. 检查 Ingress 资源
kubectl get ingress
# 2. 查看详细信息
kubectl describe ingress <ingress-name>
# 3. 检查 Ingress Controller
kubectl get pods -n ingress-nginx
# 4. 查看 Controller 日志
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
# 5. 测试后端服务
kubectl get svc <backend-service>
常见原因及解决方案
原因 1:Ingress Controller 未运行
# 检查 Controller
kubectl get pods -n ingress-nginx
# 查看日志
kubectl logs -n ingress-nginx <controller-pod>
# 重新部署
kubectl delete pod -n ingress-nginx <controller-pod>
原因 2:Ingress 配置错误
# 检查 Ingress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx # 必须指定
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service # 确保存在
port:
number: 80
原因 3:DNS 解析问题
# 测试 DNS
nslookup myapp.example.com
# 或直接使用 IP 测试
curl -H "Host: myapp.example.com" http://<ingress-ip>
原因 4:TLS 证书问题
# 检查 Secret
kubectl get secret <tls-secret> -o yaml
# 验证证书
kubectl get secret <tls-secret> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
# 重新创建证书
kubectl delete secret <tls-secret>
kubectl create secret tls <tls-secret> --cert=tls.crt --key=tls.key
网络性能问题
测试网络性能
# 使用 iperf3 测试带宽
# 服务端
kubectl run iperf3-server --image=networkstatic/iperf3 -- -s
# 客户端
kubectl run iperf3-client --image=networkstatic/iperf3 -- -c <server-ip> -t 30
# 查看结果
kubectl logs iperf3-client
常见性能问题
问题 1:MTU 配置不当
# 检查 MTU
ip link show
# CNI 接口 MTU 应小于物理接口
# 通常设置为 1450(考虑 VXLAN 封装)
# 修改 CNI MTU
kubectl edit cm -n kube-system kube-flannel-cfg
# 添加 "Network": "10.244.0.0/16", "MTU": 1450
问题 2:iptables 规则过多
# 检查 iptables 规则数量
sudo iptables -t nat -L -n | wc -l
# 超过 5000 条规则会影响性能
# 解决方案:使用 IPVS 模式
# 切换到 IPVS
kubectl edit cm -n kube-system kube-proxy
# mode: "ipvs"
调试工具
netshoot 多功能调试容器
# 运行调试容器
kubectl run netshoot --rm -it --image=nicolaka/netshoot -- /bin/bash
# 包含的工具:
# - curl, wget
# - nslookup, dig
# - ping, traceroute
# - tcpdump, nmap
# - iperf3
网络诊断命令
# DNS 查询
nslookup kubernetes.default
dig kubernetes.default
# 端口测试
telnet <service-ip> <port>
nc -zv <service-ip> <port>
# 路由追踪
traceroute <ip>
mtr <ip>
# 抓包
tcpdump -i any -nn port 80
# 查看连接
netstat -tunlp
ss -tunlp
小结
本节介绍了网络问题排查:
✅ DNS 问题:CoreDNS 配置和故障排查
✅ Service 问题:Endpoints、标签匹配、NetworkPolicy
✅ Pod 网络:CNI 插件、跨节点通信
✅ Ingress 问题:Controller、配置、TLS
✅ 性能优化:MTU、iptables、IPVS
✅ 调试工具:netshoot、tcpdump、iperf3
下一节:性能问题分析。