← 中文资源

简体中文版本

Kubernetes Service 无 Endpoints — 选择器不匹配

通过让选择器与 Pod 标签匹配,并确认 Pod 处于 Ready,修复无 Endpoints 的 Service。

阅读英文原文

症状

遇到“Kubernetes Service 无 Endpoints — 选择器不匹配”时靠猜测只会浪费时间。请按证据排查:先复现症状,再执行针对性诊断,定位根因后修复,并用明确检查验证结果。

可观察到的症状包括:

  • kubectl get endpoints 的端点为
  • Pod 正在运行,客户端却收到连接拒绝
  • 标签变更前该 Service 可用

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

kubectl get svc <svc> -o jsonpath="{.spec.selector}"; kubectl get pods --show-labels

endpoints 为空且标签不匹配,即确认选择器不匹配。

步骤 2

kubectl get endpointslices -l kubernetes.io/service-name=<svc> -o yaml | grep -A 5 conditions

EndpointSlices 会列出就绪地址;若为空,说明 Pod 未 Ready。

常见诱因(按出现频率排序):

  • Service 选择器与任何 Pod 标签都不匹配
  • 匹配的 Pod 未 Ready,因而被排除在 endpoints 之外
  • 命名空间或标签拼写错误使选择器无所指向

根因

Service 会把流量路由到标签匹配其选择器且处于 Ready 的 Pod。若选择器无所匹配,或匹配的 Pod 未通过就绪,endpoint 列表为空,连接被拒。

修复

让 Service 选择器与稳定的 Pod 标签对齐,修正就绪探针使 Pod 就绪,并避免选择器使用过度具体或拼写错误的标签。

注意:过宽的选择器会把流量路由到非预期的 Pod;选择器应针对该工作负载具体化。

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web        # must match pod labels below
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    metadata:
      labels:
        app: web     # <- matched by the selector
    spec:
      containers:
        - name: web
          ports: [{ containerPort: 8080 }]

验证

确认 endpoints 列表已填充 Pod IP 且 kubectl get endpoints 报告就绪地址;通过 Service 测试连通性。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。