K8s生产环境Service访问故障排查
Kubernetes生产环境Service访问故障排查指南(全流程图解)
在Kubernetes集群中,Service访问异常是最常见的网络问题之一。本文将结合生产实践经验,手把手教你从基础到高阶的排查方法,并附赠排查流程图。
一、5分钟快速定位(新手必会)
1. 基础四连击
# 查看Service基础信息
kubectl get svc <service-name> -o wide
# 检查Endpoint是否正常
kubectl get endpoints <service-name>
# 验证Pod是否健康
kubectl get pods -l app=<selector-label>
# 测试集群内访问
kubectl run -it --rm --image=alpine testpod -- sh
> curl -Iv http://<service-name>.<namespace>.svc.cluster.local
2. 常见快速修复场景
- Endpoint为空 ➜ 检查Pod标签与Service Selector是否匹配
- 端口映射错误 ➜ 确认targetPort与容器端口一致
- ClusterIP访问不通 ➜ 检查kube-proxy日志是否有异常
二、分层排查法(进阶必备)
第1层:Service配置验证
# 典型错误配置示例(避坑!)
spec:
ports:
- port: 80 # Service暴露端口
targetPort: 80 # 必须与Pod容器端口一致
selector:
app: frontend # 必须与Pod标签完全匹配
第2层:网络策略检查
# 查看生效的NetworkPolicy
kubectl describe networkpolicy <policy-name>
# 临时禁用所有策略(生产慎用)
kubectl label namespace <ns> projectcalico.org/disable-network-policy=true
第3层:DNS解析诊断
# 查看CoreDNS运行状态
kubectl -n kube-system get pods -l k8s-app=kube-dns
# 手动解析测试
kubectl run -it --rm --image=infoblox/dnstools dnscheck -- \
nslookup <service-name>.<namespace>.svc.cluster.local
第4层:节点级网络检查
# 检查kube-proxy iptables规则
iptables-save | grep <service-ip>
# 验证IPVS转发规则(如果使用IPVS模式)
ipvsadm -Ln | grep <service-ip>
# 查看conntrack表项
conntrack -L -d <pod-ip>
三、高阶排查工具链
1. 全链路抓包分析
# 在Service Pod所在节点抓包
tcpdump -i any host <pod-ip> and port <targetPort> -w service.pcap
# 使用Wireshark分析:
过滤条件:tcp.port == <targetPort> && http
2. eBPF深度观测
# 使用BCC工具追踪TCP连接
trace 'tcp_v4_connect(struct sock *sk) "saddr=%pi4 sport=%d daddr=%pi4 dport=%d", sk->__sk_common.skc_rcv_saddr, sk->__sk_common.skc_num, sk->__sk_common.skc_daddr, sk->__sk_common.skc_dport'
3. 网络拓扑可视化
# 安装Weave Scope
kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# 访问可视化界面
kubectl port-forward svc/weave-scope-app -n weave 4040:80
四、典型生产案例解析
案例1:NodePort访问不通
- 检查项:
- 节点防火墙是否开放NodePort范围(默认30000-32767)
- kube-proxy是否在所有Worker节点运行
- 云厂商安全组策略是否放行
案例2:Headless Service异常
- 排查要点:
# 验证SRV记录 dig +short SRV _<port>._tcp.<service>.<ns>.svc.cluster.local # 检查StatefulSet的Pod DNS格式 <pod-name>.<service>.<ns>.svc.cluster.local
案例3:跨命名空间访问失败
- 正确访问格式:
<service-name>.<namespace>.svc.cluster.local - 必须启用网络策略跨ns访问:
# NetworkPolicy配置示例 ingress: - from: - namespaceSelector: matchLabels: project: prod
五、预防性配置清单
1. Service健康检查配置
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
2. 服务网格加固(Istio示例)
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: dr-retry
spec:
host: my-service
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
outlierDetection:
consecutiveErrors: 5
interval: 5m
baseEjectionTime: 1m
3. 监控告警配置
关键监控指标:
kube_service_spec_typekube_endpoint_address_availableprobe_success{job="kubernetes-services"}
Prometheus告警规则示例:
- alert: ServiceEndpointDown
expr: up{job="kubernetes-service-endpoints"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Service endpoint down ({{ $labels.instance }})"
六、终极排查流程图
graph TD
A[Service访问失败] --> B{Endpoint是否正常?}
B -->|否| C[检查Pod标签/状态]
B -->|是| D{集群内访问是否通?}
D -->|否| E[检查kube-proxy/网络插件]
D -->|是| F{NodePort/LB是否通?}
F -->|否| G[检查防火墙/云安全组]
F -->|是| H{跨集群访问是否通?}
H -->|否| I[检查Ingress/网关配置]
H -->|是| J[检查应用层协议]
排查口诀:一验配置二看Pod,三查网络四看DNS,内核日志不能忘,全链路跟踪见真章。
通过系统化的排查方法,90%的Service访问问题可以在30分钟内定位。建议每月进行一次Service连通性巡检,提前发现潜在隐患。
浙公网安备 33010602011771号