/엔지니어/트러블슈팅/Kubernetes Endpoints none 진단
트러블슈팅중급linuxkubernetesendpointsendpointslice

Kubernetes Endpoints none 진단 — 셀렉터·Ready·targetPort

Service는 있는데 Endpoints가 비는 원인을 selector·Ready·targetPort·NetworkPolicy 순으로 좁히는 진단형 런북입니다. 체크리스트와 kubectl 명령을 포함합니다.

Endpoints none 진단 런북

Service는 살아 있는데 Endpoints/EndpointSlice가 비어 있으면(Endpoints none, endpoints: []) 트래픽이 Pod로 전달되지 않습니다. 증상은 타임아웃·connection refused·로드밸런서 unhealthy로 나타납니다.

30초 체크리스트

  1. kubectl get svc,endpoints,endpointslice -n <ns> — Service 대비 Endpoints 비었는지
  2. Service selector와 Pod labels완전히 일치하는지
  3. Ready Pod가 있는지 (kubectl get pods READY 0/1이면 Endpoints에 안 실음)
  4. publishNotReadyAddresses / headless / ExternalName 예외인지
  5. NetworkPolicy·kube-proxy·Cilium/kube-proxy-free 환경 여부

Events·오브젝트 확인

Bash
kubectl get svc <svc> -n <ns> -o yaml
kubectl get endpoints <svc> -n <ns> -o yaml
kubectl get endpointslice -n <ns> -l kubernetes.io/service-name=<svc> -o yaml
kubectl describe svc <svc> -n <ns>

Endpoints가 비어 있으면 kube-proxy/ dataplane이 백엔드를 프로그램할 대상이 없습니다.

selector ↔ label 대조

Bash
# Service selector
kubectl get svc <svc> -n <ns> -o jsonpath='{.spec.selector}{"\n"}'

# 그 selector로 Pod가 실제로 잡히는지
SEL=$(kubectl get svc <svc> -n <ns> -o jsonpath='{range $k,$v := .spec.selector}{$k}={$v},{end}' | sed 's/,$//')
kubectl get pods -n <ns> -l "$SEL" -o wide

# Pod 라벨 덤프
kubectl get pods -n <ns> --show-labels

흔한 실수:

  • app: api vs app.kubernetes.io/name: api 혼용
  • Helm 차트에서 selector를 immutable하게 바꾼 뒤 업그레이드 실패/불일치
  • 잘못된 네임스페이스의

Ready가 아니면 Endpoints에 안 붙음

Bash
kubectl get pods -n <ns> -o wide
kubectl describe pod <pod> -n <ns> | sed -n '/Conditions:/,/Containers:/p'
kubectl get pod <pod> -n <ns> -o jsonpath='{range .status.conditions[*]}{.type}={.status}{"\n"}{end}'
상태결과
Ready=False (probe fail)Endpoints에서 제외
CrashLoopBackOff제외
Pending / ImagePullBackOff제외
Ready=TrueEndpoints에 IP 등록
YAML
# 디버그 중에만 — NotReady도 노출 (주의)
spec:
  publishNotReadyAddresses: true

targetPort·프로토콜

Bash
kubectl get svc <svc> -n <ns> -o jsonpath='{range .spec.ports[*]}{.name}{"\t"}{.port}{"→"}{.targetPort}{"\t"}{.protocol}{"\n"}{end}'
kubectl get pod <pod> -n <ns> -o jsonpath='{range .spec.containers[*].ports[*]}{.containerPort}{"\t"}{.protocol}{"\n"}{end}'

Endpoints에 IP는 있는데 포트가 비면 targetPort 이름이 컨테이너 포트 name과 안 맞는 경우입니다.

NetworkPolicy·dataplane

  • Ingress/Egress policy가 kube-apiserver→Pod 또는 클라이언트→Pod를 막는지
  • Cilium/Calico identity 기반 정책에서 label 변경 후 미반영
  • kubectl run netshot --rm -it --image=nicolaka/netshoot -- /bin/bash로 Service ClusterIP·Pod IP 직접 curl

빠른 판정표

관찰조치
selector로 Pod 0개라벨/네임스페이스 수정
Pod는 있는데 Ready=Falseprobe·CrashLoop·이미지 문제 먼저
Endpoints IP 있는데 접속 실패targetPort·NetworkPolicy·노드 방화벽
ExternalName/없는 selectorEndpoints가 비는 것이 정상일 수 있음

재발 방지

  • Service selector와 Deployment template labels를 한 소스(Helm values)에서 생성
  • CI에서 kubectl get endpoints가 비면 배포 실패 처리
  • readinessProbe를 실제 트래픽 포트에 맞추기
  • 라벨 스키마를 app.kubernetes.io/*로 통일

Endpoints none은 “Service 고장”이 아니라 셀렉터·Ready·포트 계약이 깨졌다는 신호입니다. selector로 Pod가 잡히는지부터 확인하면 대부분 갈래가 정해집니다.

#kubernetes#endpoints#endpointslice#service#troubleshooting
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요. 이메일로 제보

관련 공식 문서Kubernetes 공식 문서

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.