날씨 정보를 불러오는 중...

Service 생성기

파드를 노출할 Service YAML을 만듭니다. 타입에 따라 필요한 필드가 자동으로 바뀝니다.

Deployment의 labels.app과 같아야 연결됩니다.
service.yaml
세 가지 타입 중 무엇을 골라야 하나요?
  • ClusterIP (기본값) — 클러스터 안에서만 접근 가능합니다. 백엔드 API, 데이터베이스처럼 외부에 열 필요가 없는 것은 전부 이걸 씁니다. 다른 파드에서는 서비스명.네임스페이스.svc.cluster.local로 접근합니다.
  • NodePort — 모든 노드의 특정 포트(30000~32767)를 열어 외부에서 노드IP:포트로 접근하게 합니다. 홈랩이나 테스트에 간편하지만, 포트 번호가 지저분하고 노드 IP를 알아야 해서 운영에는 잘 안 씁니다.
  • LoadBalancer — 클라우드에서는 실제 로드밸런서가 붙고 외부 IP가 할당됩니다. 온프레미스에서는 MetalLB 같은 것이 없으면 EXTERNAL-IP<pending>에서 멈춰 있습니다.

웹 서비스를 도메인으로 노출하려면 보통 ClusterIP + Ingress 조합을 씁니다. Service를 외부에 직접 여는 대신 Ingress가 도메인·경로·TLS를 처리하게 하는 방식입니다.

port와 targetPort의 차이
  • port — 다른 파드가 이 서비스에 접속할 때 쓰는 포트
  • targetPort — 실제 컨테이너가 열고 있는 포트

예를 들어 컨테이너가 5000번에서 돌지만 서비스는 80으로 받고 싶다면 port: 80, targetPort: 5000이 됩니다. 둘을 같게 두는 경우가 많아 헷갈리기 쉬운데, 값이 다를 때 방향을 반대로 적는 실수가 흔합니다.

연결이 안 될 때 확인 순서

대부분 selector가 파드 라벨과 안 맞는 것이 원인입니다. 아래로 확인하세요.

# Endpoints가 비어 있으면 selector가 안 맞는 것
kubectl get endpoints 서비스명 -n 네임스페이스

# 파드에 실제로 붙은 라벨 확인
kubectl get pods -n 네임스페이스 --show-labels

# 클러스터 내부에서 직접 호출해 보기
kubectl run tmp --rm -it --image=curlimages/curl -- \
  curl -s http://서비스명.네임스페이스.svc.cluster.local

← 도구 전체 보기