본문 바로가기
문서 목차
QKS · Networking

Services

Service 는 파드 집합을 안정적인 네트워크 엔드포인트로 노출하는 Kubernetes 오브젝트입니다. 파드는 재시작될 때마다 IP 주소가 변경되지만, Service는 고정된 ClusterIP와 DNS 이름을 제공하여 안정적인 통신을 가능하게 합니다.

QUANTUM C&S

개요

Service는 파드 집합을 안정적인 네트워크 엔드포인트로 노출하는 Kubernetes 오브젝트입니다. 파드는 재시작될 때마다 IP 주소가 변경되지만, Service는 고정된 ClusterIP와 DNS 이름을 제공하여 안정적인 통신을 가능하게 합니다.


QKS 콘솔에서 Service 확인

  1. 왼쪽 메뉴에서 Networking > Services를 선택합니다.
  2. 네임스페이스를 선택하면 Service 목록이 표시됩니다.

목록에서 확인할 수 있는 정보:

  • 이름: Service 이름
  • 타입: ClusterIP / NodePort / LoadBalancer
  • ClusterIP: 클러스터 내부 IP
  • 외부 IP: LoadBalancer 타입의 경우 외부에서 접근 가능한 IP
  • 포트: 노출된 포트 번호

Service 타입

ClusterIP (기본값)

클러스터 내부에서만 접근 가능한 가상 IP를 Service에 부여합니다. 외부에서는 직접 접근할 수 없으며, 클러스터 내 다른 파드끼리 통신할 때 사용합니다.

spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - port: 80        # Service 포트
      targetPort: 8080  # 파드 포트

내부 DNS: my-service.my-namespace.svc.cluster.local

NodePort

각 노드의 특정 포트를 통해 외부에서 Service에 접근할 수 있습니다. 포트 범위는 30000~32767입니다.

spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30080   # 명시적 지정 (생략 시 자동 할당)

접근 방법: http://<node-ip>:30080

LoadBalancer

외부 로드 밸런서를 프로비저닝하고 고정 외부 IP를 Service에 할당합니다. 외부 트래픽을 클러스터 안으로 가져오는 가장 일반적인 방법입니다.

spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

LoadBalancer IP는 할당 후 Service의 EXTERNAL-IP 필드에서 확인할 수 있습니다.


kubectl로 관리

# Service 목록
kubectl get services -n <namespace>

# Service 상세 정보 (Endpoints 포함)
kubectl describe service <name> -n <namespace>

# Endpoints 확인 (실제 파드 IP 목록)
kubectl get endpoints <name> -n <namespace>

# Service 생성
kubectl apply -f service.yaml

# Service 삭제
kubectl delete service <name> -n <namespace>

Service YAML 전체 예시

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  namespace: production
  labels:
    app: my-app
spec:
  type: LoadBalancer
  selector:
    app: my-app          # 이 라벨을 가진 파드로 트래픽 전달
  ports:
    - name: http
      protocol: TCP
      port: 80           # Service 포트 (외부 또는 내부에서 접근하는 포트)
      targetPort: 8080   # 파드가 실제로 리스닝하는 포트

트러블슈팅

Service에 접근이 안 되는 경우

# 1. Service가 실제 파드와 연결되어 있는지 확인
kubectl get endpoints <service-name> -n <namespace>
# ENDPOINTS가 <none>이면 selector 라벨 불일치 확인

# 2. 파드의 라벨 확인
kubectl get pods -n <namespace> --show-labels

# 3. 파드가 정상 실행 중인지 확인
kubectl get pods -n <namespace>

Endpoints가 비어 있다면 Service의 selector와 파드의 labels가 일치하지 않는 경우가 대부분입니다.