본문 바로가기

Cloud/Kubernetes

[CKA - 2] Pod 및 Workload 관리

 

1. Deployment, ReplicaSet, DaemonSet, StatefulSet 구성

1.1 Deployment

Deployment는 애플리케이션의 무중단 배포, 롤링 업데이트, 롤백 등을 지원하는 가장 일반적인 리소스이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

1.2 ReplicaSet

ReplicaSet은 지정한 수의 동일한 Pod가 항상 동작하도록 보장하는 역할을 한다. 보통은 Deployment를 통해 생성되며, 단독 사용은 거의 하지 않는다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

1.3 DaemonSet

DaemonSet은 클러스터의 모든 노드에 하나씩 Pod를 실행하고자 할 때 사용한다. 대표적인 예는 로그 수집, 모니터링 에이전트 등이다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
spec:
  selector:
    matchLabels:
      app: agent
  template:
    metadata:
      labels:
        app: agent
    spec:
      containers:
      - name: agent
        image: fluentd

1.4 StatefulSet

StatefulSet은 고유한 네트워크 ID와 고정된 스토리지를 갖는 상태 저장 애플리케이션에 사용한다. 예: Cassandra, MongoDB, etcd 등.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

2. Job, CronJob 생성 및 관리

2.1 Job

Job은 일회성 작업을 위한 리소스로, 지정된 수의 성공적인 Pod 완료를 보장한다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

2.2 CronJob

CronJob은 리눅스의 크론처럼 특정 시간마다 Job을 실행한다.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from Kubernetes
          restartPolicy: OnFailure

3. Pod Lifecycle 및 Restart 정책 이해

Pod Lifecycle 주요 상태

  • Pending: 스케줄되었으나 컨테이너 생성 전
  • Running: 컨테이너가 하나 이상 실행 중
  • Succeeded: 모든 컨테이너 정상 종료
  • Failed: 컨테이너 하나 이상 비정상 종료
  • Unknown: 상태를 알 수 없음

Restart 정책

  • Always (기본값): 항상 재시작 (Deployment 사용 시 기본)
  • OnFailure: 실패 시 재시작 (Job 등에서 사용)
  • Never: 절대 재시작하지 않음

4. initContainer, sidecar 패턴

4.1 initContainer

initContainer는 메인 컨테이너가 시작되기 전 필요한 작업을 처리한다. 예: 설정 복사, 외부 서비스 체크 등

initContainers:
- name: init-myservice
  image: busybox
  command: ['sh', '-c', 'echo initializing... && sleep 5']

4.2 Sidecar 패턴

Sidecar는 메인 컨테이너를 보조하는 컨테이너로, 같은 Pod 내에서 함께 실행된다. 예: 로그 수집, 프록시 등

※ CKA mock exam에서 SideCar 패턴을 구현하는 문제가 있는데, 정답 코드에는 initContainer로 구현되어있다. initContainer는 한 번 실행되고 종료되는 일회성 컨테이너이기 때문에, sidecar처럼 계속 동작하거나 반복 실행되게 만드는 것과는 어울리지 않는다. 목적 상 아무리 봐도 container로 구현하는게 맞는 것 같다... (개인적인 생각)

containers:
- name: app
  image: myapp
- name: sidecar-logger
  image: fluentd