Kubernetes 주요 오브젝트 이해 - Pod와 적절한 배포 방식的选择

Pod의 이해와 직접 배포의 문제점

Kubernetes 환경에서 Pod는 가장 기본적인 배포 단위입니다. 하나의 Pod는 하나 이상의 밀접하게 연관된 컨테이너를 포함할 수 있습니다. 아래는 Pod를 직접 배포하는 예시입니다.

apiVersion: v1
kind: Pod
metadata:
  name: httpd-pod
  labels:
    app: httpd
spec:
  containers:
  - name: httpd
    image: httpd:latest
    ports:
    - containerPort: 8080

그러나 실제 프로덕션 환경에서는 Kind를 Pod로 설정하여 배포하는 경우는 매우 드뭅니다. 그 이유는 Pod 자체가 제공하는 기능에 있습니다.

Pod는 단순히 컨테이너의 실행 단위일 뿐이며, 다음 기능들이 부족합니다:

  • 자기 복구(Self-healing) 기능 없음
  • 수동 확장/축소 불가
  • 롤링 업데이트 미지원
  • 롤백 기능 없음

이러한 고급 기능들은 Deployment, StatefulSet, DaemonSet, Job/CronJob, ReplicaSet 같은 컨트롤러가 제공합니다. 따라서 Apache 서버를 배포할 때는 아래와 같이 Deployment를 사용하는 것이 적절합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:latest
        ports:
        - containerPort: 8080

이렇게 배포하면 간단한 명령어로 스케일링이 가능합니다: kubectl scale deployment httpd-deployment --replicas=4

어떤 리소스 유형으로 배포할 것인가?

애플리케이션의 특성에 따라 적절한 Kind를 선택해야 합니다.

1. Deployment

  • 적용 대상: Stateless 애플리케이션
  • 주요 특징:
    • 롤링 업데이트 및 롤백 지원
    • 수평 스케일링 가능
    • Pod 실패 시 자동 복구
    • 자주 업데이트가 필요한 서비스에 적합
  • 선택 이유: Apache, Nginx 같은 웹 서버는 일반적으로 상태 정보를 저장하지 않으므로 Deployment가 최적입니다. 서비스 버전 업그레이드 시 무중단 배포가 가능합니다.

2. StatefulSet

  • 적용 대상: Stateful 애플리케이션
  • 주요 특징:
    • 각 Pod에 안정적인 네트워크 식별자(DNS) 제공
    • Pod의 순차적 시작 및 종료 보장
    • 영구 저장소 연동 가능
  • 미선택 이유: 웹 서버는 고정된 신원이나 순차적 실행이 필요하지 않습니다. 데이터베이스, 캐시 서버 등 상태 유지가 필요한 경우에 사용합니다.

3. DaemonSet

  • 적용 대상: 각 노드에서 반드시 실행되어야 하는 서비스
  • 주요 특징:
    • 모든 노드에 Pod 인스턴스 배포
    • 로그 수집, 모니터링 에이전트 등에 적합
  • 미선택 이유: 웹 서버는 모든 노드에서 실행할 필요가 없으며, 일반적으로 Service를 통해 로드밸런싱됩니다.

4. Job / CronJob

  • 적용 대상: 일회성 작업 또는 스케줄링된 작업
  • 주요 특징:
    • Job: 한 번만 실행되는 태스크
    • CronJob: cron 표현식 기반 반복 실행
  • 미선택 이유: 웹 서버는 지속적으로 실행되는 서비스이므로 일회성 작업용 컨트롤러는 적합하지 않습니다.

5. ReplicaSet

  • 적용 대상: Pod 복제본 수 직접 제어
  • 주요 특징:
    • 지정된 수만큼 Pod 유지
  • 미선택 이유:ReplicaSet은 Deployment에 의해 관리되는 경우가 많으며, 단독 사용 시 롤링 업데이트功能和 롤백 기능이欠乏합니다. 따라서 Deployment를 통해 사용하는 것이 권장됩니다.

결론

애플리케이션의 유형에 따라 적절한 Kubernetes 리소스 유형을 선택해야 합니다. 대부분의 경우 Stateless 웹 서비스는 Deployment를, 데이터베이스 등은 StatefulSet을, 노드 단위 서비스는 DaemonSet을 사용하면 됩니다. 직접 Pod를 배포하는 것은 테스트 환경이나 특별한 상황을 제외하고는 권장되지 않습니다.

태그: kubernetes deployment Pod statefulset daemonset

7월 10일 16:32에 게시됨