当前位置: 首页 > article >正文

Service 无法访问后端 Pod,如何逐步定位问题

Service 无法访问后端 Pod 的逐步排查指南

一、基础信息确认
  1. 检查 Service 和 Pod 是否在相同 Namespace

    kubectl get svc <service-name> -n <namespace>          # 确认 Service Namespace
    kubectl get pods -n <namespace>                        # 确认 Pod 是否存在
  2. 验证 Pod 是否处于 Running 状态

    kubectl get pods -n <namespace> --show-labels           # 检查 Pod 状态和标签
    kubectl describe pod <pod-name> -n <namespace>         # 查看 Pod 详细事件

二、网络层诊断
1. 检查 Service 和 Endpoints 关联
kubectl get endpoints <service-name> -n <namespace>        # 确认 Endpoints 是否包含 Pod IP
# 正常输出示例:
# ENDPOINTS: <service-name>: [<pod-ip>:<port>, ...]
2. 验证网络连通性

从 Service IP 访问 Pod

curl -v http://<service-ip>:<port>                      # 检查是否返回 HTTP 错误
# 如果无法访问,继续排查:

从其他 Pod 访问目标 Pod

kubectl exec -it <other-pod-name> --namespace=<namespace> -- sh
# 在 Pod 内执行:
wget http://<target-pod-ip>:<port> -O -
3. 检查网络策略(NetworkPolicy)
kubectl get networkpolicies -n <namespace>               # 查看是否有拦截流量的策略
# 示例 NetworkPolicy 规则:
# allow egress from <namespace>/default to <target-pod-label>
4. 检查防火墙和安全组

云环境:确认云服务商的安全组/ACL 是否放行 Service 端口。

本地集群:检查 iptablesfirewalld 规则是否拦截流量。


三、Service 配置诊断
1. 检查 Service 类型
# 示例:ClusterIP/NodePort/ExternalName 等类型
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  type: ClusterIP  # 或 NodePort/ExternalName
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9090
  selector:
    app: my-app

NodePort/ExternalName:需额外检查端口映射和 DNS 解析。

Headless Service:需直接访问 Pod IP,而非通过负载均衡。

2. 验证 Service 选择器(Selector)
kubectl get pods -n <namespace> -l app=my-app          # 确认 Pod 是否匹配 Service 的 Selector

四、Pod 端诊断
1. 检查 Pod 日志
kubectl logs <pod-name> -n <namespace>                # 查看应用日志
kubectl logs <pod-name> -n <namespace> --previous       # 查看重启前日志
2. 检查 Pod 网络配置
kubectl describe pod <pod-name> -n <namespace> | grep IPAddress
# 输出示例:
# IPAddress: 10.244.1.2
# HostIP: 10.244.1.2
3. 测试 Pod 内服务是否运行
kubectl exec -it <pod-name> --namespace=<namespace> -- sh
# 在 Pod 内执行:
curl http://localhost:<port>                           # 测试服务是否正常响应

五、高级诊断工具
1. 使用 tcpdump 捕获流量
# 在目标 Pod 内执行(需安装 tcpdump):
kubectl exec -it <pod-name> --namespace=<namespace> -- sh -c "tcpdump -i any -nn port <port> -w /tmp/capture.pcap"
​
# 在攻击者 Pod 内执行:
kubectl exec -it <source-pod> --namespace=<namespace> -- sh -c "tcpdump -i any -nn port <port> -w /tmp/capture.pcap"
2. 检查 DNS 解析
# 在 Pod 内执行:
dig +trace <service-name>.<namespace>.svc.cluster.local    # 检查 DNS 解析路径
nslookup <service-name>                                # 确认解析结果
3. 使用 istioctl 检查服务网格(Istio)
istioctl analyze --set namespace=<namespace>           # 自动分析网络配置
istioctl proxy-config routes <pod-name>               # 查看 Sidecar 路由规则

六、常见故障场景与解决方案

现象可能原因解决方案
Endpoints 为空Selector 不匹配更新 Service 的 selector 字段,确保与 Pod 标签一致。
Pod IP 未注册CNI 插件故障重启 CNI 插件(如 Calico、Flannel),检查节点网络配置。
防火墙拦截流量安全组规则错误添加入站规则放行 Service 端口(如 tcp 80/443)。
服务未监听端口应用配置错误检查 Pod 内的应用日志,确认服务是否在指定端口监听(如 netstat -tuln)。
Service 类型错误NodePort 未暴露公网 IP使用 kubectl port-forward 临时测试,或配置 Ingress 资源暴露服务。


http://www.kler.cn/a/576533.html

相关文章:

  • C++ `bitset` 入门指南
  • 蓝桥杯P17153-班级活动 题解
  • Elastic如何获取当前系统时间
  • 【算法方法总结·四】字符串操作的一些技巧和注意事项
  • Chrome 扩展开发:Chrome 扩展的作用和开发意义(一)
  • Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!
  • 网络与网络安全
  • 每天记录一道Java面试题---day28
  • 3.6 登录认证
  • el-table一格两行;概率;find
  • 面向服务的架构风格
  • P63 C++当中的计时
  • Vim复制内容到系统剪切板
  • 深入HarmonyOS NEXT开发中的ArkData操作SQLite数据库
  • 如何收集 Kubernetes 集群的日志
  • 在 k8s中查看最大 CPU 和内存的极限
  • Vue-flow中动态流程图的实现
  • C++学习——栈(一)
  • 江科大51单片机笔记【9】DS1302时钟可调时钟(下)
  • 基于 uni-app 和 Vue3 开发的汉字书写练习应用