시작하며

쿠버네티스에서 포드를 기반으로 동작하는 오브젝트는 Deployment 외에도 다양하다. 각각의 오브젝트는 서로 다른 워크로드 유형에 맞게 설계되어 있으며, 상황에 따라 적절한 오브젝트를 선택하는 것이 중요하다.

Jobs

특정 동작을 수행하고 종료해야 하는 작업을 위한 오브젝트이다. 포드가 실행되어 정상적으로 종료되는 것(컨테이너가 종료 코드 0을 반환해 Completed 상태가 되는 것)을 목표로 한다.

  • spec.completions: Job이 성공하려면 몇 개의 포드가 성공해야 하는지
  • spec.parallelism: 동시에 생성될 포드의 개수
  • spec.backoffLimit: 포드가 실패하는 경우 최대 재시도 횟수 (기본 6번)

CronJobs

CronJob은 주기적으로 Job을 실행하는 오브젝트이다. 데이터 백업이나 이메일 전송 등의 용도로 사용하기에 적절하다. 리눅스에서 흔히 쓰이는 크론(Cron)의 스케줄 방법을 그대로 사용한다. 나머지는 jobTemplate 선언 내용과 동일하다.

DaemonSets

DaemonSet은 쿠버네티스의 모든 노드에 동일한 포드를 하나씩 생성하는 오브젝트이다. 로깅, 모니터링, 네트워킹 등을 위한 에이전트를 각 노드에 생성해야 할 때 유용하다.

apiVersion: apps/v1
kind: DaemonSet                                     # DaemonSet 명시
metadata:
    name: daemonset-example
spec:
    selector:
        matchLabels:
            name: my-daemonset-example              # 포드를 생성하기 위한 라벨 셀렉터 설정
    template:
        metadata:                                   # 포드 라벨 설정
            labels:
                name: my-daemonset-example
        spec:
            tolerations:
            - key: node-role.kubernetes.io/master   # 마스터 노드에도 포드 생성
              effect: NoSchedule
            containers:
            - name: daemonset-example
              image: busybox                        # 테스트를 위해 busybox 사용
              args: ["tail", "-f", "/dev/null"]
              resources:
                limits:
                    cpu: 100m
                    memory: 200Mi

StatefulSets

쿠버네티스에서 마이크로서비스 구조로 동작하는 애플리케이션은 대부분 상태를 갖지 않는(Stateless) 경우가 많다. 그러한 경우에는 Deployment를 통해 쉽게 앱을 배포할 수 있다. 하지만 상태를 갖는(Stateful) 애플리케이션을 쿠버네티스에서 배포하는 것은 쉽지 않다. StatefulSet은 상태를 갖는 포드를 관리하기 위한 오브젝트이다.

포드 이름에 붙여지는 숫자를 통해 각 포드를 고유하게 식별한다. 또한 요청이 랜덤 포드가 아닌 개별 포드에 접근해야 하므로, 일반적인 서비스가 아닌 Headless Service를 사용한다.

쿠버네티스는 StatefulSet을 생성할 때 포드마다 PVC를 자동으로 생성함으로써 다이나믹 프로비저닝 기능을 지원한다. volumeClaimTemplates를 사용하면 StatefulSet의 각 포드에 대해 PVC가 동적으로 생성되지만, 반대로 삭제하는 경우에는 직접 삭제해 주어야 한다. 기존 데이터를 항상 안전하게 보존해야 하므로 자동 삭제는 이루어지지 않는다.

정리하며

쿠버네티스에서 워크로드 유형에 따라 적절한 오브젝트를 선택하는 것이 중요하다. 일회성 배치 작업에는 Job, 주기적 실행에는 CronJob, 전체 노드 에이전트 배포에는 DaemonSet, 상태 저장 애플리케이션에는 StatefulSet을 사용한다. 각 오브젝트의 특성을 이해하면 더 안정적이고 효율적인 클러스터 운영이 가능하다.