[CKAD] Kubernetes Service

HongSeokChoi·2025년 9월 3일

ckad

목록 보기
14/14

Service란?

  • Service는 쿠버네티스의 핵심 네트워킹 추상화로, 변동적인 Pod들을 고정된 엔드포인트(DNS/IP)로 묶어주고, 트래픽을 분산시켜주는 역할을 합니다.

  • 이를 통해 애플리케이션 간의 통신을 가능하게 하고, 외부 사용자와 애플리케이션을 연결할 수 있도록 돕습니다.

Service의 필요성

  • Pod는 생성될 때마다 동적으로 IP를 부여받고, Pod가 죽고 새로 생성될 때마다 IP가 변경됩니다.
  • 따라서 애플리케이션 간의 통신을 Pod의 IP로 직접 하면 안정적이지 않으며, IP 변경으로 인해 연결이 끊길 수 있습니다.
  • Service는 특정 라벨(label)을 가진 Pod들을 묶어서 하나의 고정된 엔드포인트 (가상 IP, DNS 이름)를 제공합니다. 이를 통해 안정적인 트래픽 분산을 보장합니다.

Service 유형

1. ClusterIP (기본)

  • 목적: 클러스터 내부에서만 접근할 수 있는 IP를 제공합니다.
  • 사용 사례: 내부 마이크로서비스 통신 (예: frontend ↔ backend)
  • 설명: 클러스터 내부에서만 접근 가능하며, 외부 사용자는 접근할 수 없습니다.
  • 예시 코드:
    apiVersion: v1
    kind: Pod
    metadata:
      name: backend-pod
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: nginx:1.27-alpine
          ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: backend
    spec:
      type: ClusterIP
      selector:
        app: backend
      ports:
        - port: 80

2. NodePort

  • 목적: 모든 노드에 지정된 포트를 열어 외부에서 접근할 수 있게 합니다.
  • 사용 사례: 개발/테스트 환경에서 외부 접근이 필요할 때
  • 설명: 내부적으로는 ClusterIP 위에 설정되며, 외부에서 NodeIP:포트로 접근이 가능합니다.
  • 예시 코드:
    apiVersion: v1
    kind: Pod
    metadata:
      name: frontend-pod
      labels:
        app: frontend
    spec:
      containers:
        - name: frontend
          image: nginx:1.27-alpine
          ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: frontend
    spec:
      type: NodePort
      selector:
        app: frontend
      ports:
        - port: 80   # nodePort는 자동으로 30000~32767 사이의 포트를 할당

3. LoadBalancer

  • 목적: 클라우드 환경에서 외부 LoadBalancer를 생성하여 공인 IP를 할당받습니다.
  • 사용 사례: 프로덕션 환경에서 외부 서비스 노출이 필요할 때
  • 설명: 클라우드 프로바이더가 외부 LoadBalancer를 자동으로 생성하고, 이를 통해 NodePortClusterIP를 거쳐 트래픽을 Pod로 전달합니다.
  • 예시 코드:
    apiVersion: v1
    kind: Pod
    metadata:
      name: web-pod
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: nginx:1.27-alpine
          ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: web
    spec:
      type: LoadBalancer
      selector:
        app: web
      ports:
        - port: 80

4. ExternalName

  • 목적: Pod가 직접 외부 서비스를 연결하지 않고, DNS 이름을 통해 외부 자원(DB, API 등)을 내부에서 접근할 수 있도록 도와줍니다.
  • 사용 사례: 외부 데이터베이스나 API 서비스 연결 시 사용
  • 설명: DNS CNAME을 반환하고, 프록시 동작 없이 외부 서비스로 연결됩니다.
  • 예시 코드:
    apiVersion: v1
    kind: Service
    metadata:
      name: external-db
    spec:
      type: ExternalName
      externalName: db.mycompany.com

Service와 Pod 연결 방식

  • Pod 정의 시 라벨을 붙여(예: app=frontend, app=backend) 해당 라벨을 서비스 정의에서 selector로 지정하여, 서비스가 자동으로 Pod를 엔드포인트로 묶습니다.
  • 예를 들어, frontend Podbackend Pod에 접근할 때 http://backend-service:80와 같이 DNS 이름을 사용하여 접근할 수 있습니다.

서비스 디스커버리와 내장 로드밸런싱

  • 서비스 디스커버리: 쿠버네티스는 모든 서비스 이름을 자동으로 DNS로 등록합니다. 예를 들어, backend-service.default.svc.cluster.local와 같이 내부에서 쉽게 접근할 수 있습니다.
  • 내장 로드밸런싱: Service는 기본적으로 라운드로빈 방식으로 트래픽을 여러 Pod에 분산합니다. 이 방식은 트래픽을 고르게 분산시키고, 클러스터 내에서의 안정성을 보장합니다.

실무 권장 패턴

외부 노출:

  • IngressLoadBalancer 조합을 사용하여 도메인 기반 라우팅을 처리합니다.
  • 예를 들어, example.comLoadBalancer로 노출되고, 이를 통해 외부에서 특정 서비스에 접근할 수 있도록 합니다.

내부 통신:

  • ClusterIP 서비스를 사용하여 내부 마이크로서비스 간의 통신을 처리합니다. Pod IP는 변경되기 때문에 직접 접근하지 않고, 항상 Service를 통해 접근해야 합니다.

profile
Network/Cloud

0개의 댓글