跳转到内容

Service 连通性排障

本文提供一套从 Pod 到 CLB 的排障路径,适用于 ClusterIP、NodePort、LoadBalancer Service 无法访问的情况。


Terminal window
NAMESPACE=default
SERVICE=nginx
kubectl get svc "${SERVICE}" -n "${NAMESPACE}" -o wide
kubectl get endpoints "${SERVICE}" -n "${NAMESPACE}" -o wide
kubectl get endpointslice -n "${NAMESPACE}" -l kubernetes.io/service-name="${SERVICE}"
kubectl describe svc "${SERVICE}" -n "${NAMESPACE}"

判断重点:

  • Service 是否存在,type 是否符合预期。
  • selector 是否能匹配 Pod。
  • Endpoint/EndpointSlice 是否为空。
  • Service events 是否有 CLB、权限、配额、子网错误。

Terminal window
kubectl get pods -n "${NAMESPACE}" --show-labels -o wide
kubectl describe pod <pod-name> -n "${NAMESPACE}"
kubectl logs <pod-name> -n "${NAMESPACE}"

常见问题:

现象处理
Pod 不 Ready检查 readinessProbe、镜像、启动日志
Pod label 不匹配修正 Service selector 或 Pod label
Pod 端口不一致确认 containerPort、Service targetPort

在集群内启动临时客户端:

Terminal window
kubectl run net-debug --rm -it \
--image=curlimages/curl:8.8.0 \
--restart=Never \
-- sh

在容器内测试:

Terminal window
curl -v http://nginx.default.svc.cluster.local
curl -v http://<cluster-ip>:80

如果 DNS 失败但 ClusterIP 可访问,重点检查 CoreDNS;如果 ClusterIP 也失败,重点检查 Endpoint、NetworkPolicy、kube-proxy 或 CNI。


Terminal window
kubectl get svc "${SERVICE}" -n "${NAMESPACE}" -w
kubectl describe svc "${SERVICE}" -n "${NAMESPACE}"

EXTERNAL-IP 长时间 <pending> 时,检查:

检查项说明
CLB 配额默认配额不足会导致创建失败
CAM 权限集群相关角色需要创建/绑定 CLB 权限
子网参数内网 CLB 必须指定正确子网
Service 注解复制 YAML 时删除旧的 service.cloud.tencent.com/client-token
访问方式切换避免直接在公网、内网、已有 CLB 之间切换

Terminal window
kubectl get nodes -o wide
kubectl get svc "${SERVICE}" -n "${NAMESPACE}" -o jsonpath='{.spec.ports[*].nodePort}'

NodePort 或 CLB 后端访问依赖节点端口时,安全组需要放通对应 NodePort 端口段。VPC-CNI 场景还要关注 Pod IP 所在子网、路由表、ACL 和目标资源安全组。


Terminal window
kubectl get networkpolicy -A
kubectl describe networkpolicy -n "${NAMESPACE}"

如果命名空间启用了默认拒绝策略,需要显式放通来源命名空间、Pod selector 和端口。不要忘记 DNS 出站流量,常见端口为 UDP/TCP 53。


Terminal window
kubectl get svc,endpoints,endpointslice,pods -n "${NAMESPACE}" -o wide
kubectl describe svc "${SERVICE}" -n "${NAMESPACE}"
kubectl get events -n "${NAMESPACE}" --sort-by=.lastTimestamp

把现象记录成“从哪里访问、访问哪个地址、期望协议端口、实际报错”,再按链路逐层排查。