Kubernetes 服务流量排查工具

本工具用于快速诊断 Kubernetes 集群中服务的流量问题,帮助 SRE 和运维人员在用户反馈服务无法访问或访问异常时进行系统化排查。通过一系列检查,它能够自动识别常见问题并提供清晰的错误提示和解决建议。

下载工具脚本

功能特点

使用方法

基本用法

./k8s-service-check.sh -s <service_name> -n <namespace>

完整参数

./k8s-service-check.sh -s <service_name> -n <namespace> [-p <protocol>] [-o <port>] [-i <ingress_host>] [-h <health_check_path>]
参数 说明 是否必填 默认值
-s, --service 服务名称 -
-n, --namespace 命名空间 -
-p, --protocol 协议类型 (http|https|tcp) http
-o, --port 服务端口 80
-i, --ingress Ingress 主机名(如果通过 Ingress 暴露) -
-h, --health 健康检查路径(HTTP/HTTPS 服务) /

使用示例

1. 检查默认命名空间中的 nginx 服务(HTTP 协议,端口 80):

./k8s-service-check.sh -s nginx -n default

2. 检查 API 服务(HTTPS 协议,端口 443,健康检查路径 /healthz):

./k8s-service-check.sh -s my-api -n api-system -p https -o 443 -h /healthz

3. 检查通过 Ingress 暴露的 Web 应用:

./k8s-service-check.sh -s web-app -n frontend -i webapp.example.com
提示: 如果您的集群环境特殊,可能需要修改脚本中的诊断 Pod 镜像。默认使用 nicolaka/netshoot 镜像,您可以根据需要替换为其他具有网络诊断工具的镜像。

检查内容

1. Kubernetes 对象检查

2. 网络连通性检查

3. 应用层检查

实际案例分析

案例 1:服务选择器配置错误

症状: 服务无法访问,没有可用的 Endpoints

排查过程:

  1. 运行工具检查服务:./k8s-service-check.sh -s frontend -n webapp
  2. 工具输出问题:WARNING: Service selector 'app=frontend' doesn't match any pods
  3. 进一步检查 Pod 标签:kubectl get pods -n webapp --show-labels
  4. 发现 Pod 标签是 app=frontend-v2,而不是 app=frontend

解决方案: 更新服务选择器以匹配正确的 Pod 标签

kubectl patch svc frontend -n webapp -p '{"spec":{"selector":{"app":"frontend-v2"}}}'

案例 2:NetworkPolicy 阻止流量

症状: 服务有 Endpoints,但从某些命名空间无法访问

排查过程:

  1. 运行工具检查连通性:./k8s-service-check.sh -s api -n backend
  2. 工具输出警告:WARNING: Found restrictive NetworkPolicy that may block service traffic
  3. 检查 NetworkPolicy:kubectl get networkpolicy -n backend
  4. 发现存在仅允许特定命名空间访问的 NetworkPolicy

解决方案: 更新 NetworkPolicy 以允许来自所需来源的流量:

kubectl edit networkpolicy api-access -n backend

添加所需的命名空间标签到 namespaceSelector 规则中。

常见问题排查

服务无法访问的常见原因

1. 服务配置问题

2. Pod 问题

3. 网络问题

4. Ingress 问题

高级排查技巧

有时候,自动化工具可能无法发现所有问题。以下是一些手动排查技巧:

  1. 检查 Pod 日志
    kubectl logs -n <namespace> <pod-name>
  2. 检查 Pod 内部网络配置
    kubectl exec -it -n <namespace> <pod-name> -- ip addr
    kubectl exec -it -n <namespace> <pod-name> -- netstat -tuln
  3. 检查 kube-proxy 日志
    kubectl logs -n kube-system -l k8s-app=kube-proxy
  4. 检查节点上的 iptables 规则
    kubectl debug node/<node-name> -it --image=nicolaka/netshoot -- iptables-save | grep <service-name>
  5. 使用 tcpdump 捕获网络流量
    kubectl debug node/<node-name> -it --image=nicolaka/netshoot -- tcpdump -i any port <port>