Init Container

Yu Sang Min·2025년 6월 10일

CKA

목록 보기
36/110
post-thumbnail

멀티 컨테이너 파드에서는 각 컨테이너가 파드의 수명 동안 계속 실행되는 프로세스를 담당하는 것이 일반적입니다. 예를 들어 앞서 언급한 웹 애플리케이션과 로깅 에이전트를 포함하는 멀티 컨테이너 파드에서는, 두 컨테이너 모두 항상 실행 상태를 유지해야 합니다. 로깅 에이전트 컨테이너의 프로세스도 웹 애플리케이션이 실행되는 동안 계속 살아 있어야 하며, 둘 중 하나라도 실패하면 파드 전체가 재시작됩니다.

하지만 때로는 파드가 처음 생성될 때 한 번만 실행되면 되는 프로세스가 필요할 때도 있습니다. 예를 들어, 웹 애플리케이션이 사용할 코드를 외부 저장소에서 가져오는 작업이 그 예입니다. 또는 실제 애플리케이션이 실행되기 전에 외부 서비스나 데이터베이스가 준비될 때까지 대기하는 과정도 해당됩니다.
이럴 때 사용하는 것이 바로 Init Container(초기화 컨테이너)입니다.

✅ Init Container란?

Init Container는 일반 컨테이너처럼 파드 안에 정의되지만, initContainers 섹션 안에 따로 명시됩니다. 예시는 다음과 같습니다:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'git clone <어플리케이션이 사용할 저장소> ; done;']

위 예제에서 파드가 생성되면 init container가 먼저 실행됩니다. 그리고 해당 init container의 작업이 정상적으로 완료되어야만 실제 애플리케이션 컨테이너가 시작됩니다.

✅ 여러 개의 Init Container 사용

Init Container는 여러 개 정의할 수도 있으며, 이 경우에는 정해진 순서대로 하나씩 순차적으로 실행됩니다.
아래는 외부 서비스(myservice)와 데이터베이스(mydb)가 준비될 때까지 각각 대기하는 Init Container를 설정한 예제입니다:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

위 구성에서는:
1. init-myservice가 먼저 실행되고, myservice가 DNS로 조회될 수 있을 때까지 대기합니다.
2. 그 다음 init-mydb가 실행되며, mydb가 준비될 때까지 대기합니다.
3. 이 모든 과정이 완료되면 비로소 메인 컨테이너인 myapp-container가 실행됩니다.

만약 어떤 init container라도 실패하면, Kubernetes는 해당 파드를 반복적으로 재시작하며 init container가 성공할 때까지 계속 시도합니다.

profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글