Kubernetes InitContainer

dlwpdnr213
|2024. 10. 23. 00:17

InitContainer란

 

일반적으로 다중 컨테이너 Pod에서는 각 컨테이너가 Pod의 생명주기 동안 지속적으로 실행된다.

 

예를 들어, 웹 애플리케이션 컨테이너와 로그 에이전트 컨테이너가 함께 실행되는 경우, 두 컨테이너 모두 Pod의 수명 동안 계속 살아 있어야 하며, 하나라도 실패하면 Pod가 재시작된다.

 

때로는 특정 작업이 Pod의 주 컨테이너가 실행되기 전에 단 한 번만 실행되고 완료되어야 할 때가 있다.

 

예를 들어, 웹 애플리케이션이 실행되기 전에 코드나 바이너리를 git과 같은 저장소에서 가져오는 작업이 필요할 수 있다.

 

또는 외부 서비스나 데이터베이스가 준비될 때까지 대기하는 작업이 필요할 수도 있다. 이런 경우에 InitContainer가 사용된다.

 

InitContainer의 특징

 

1. 완료 후에 주 컨테이너가 실행된다. 

 

InitContainer는 일반 컨테이너와 유사하게 구성되지만, Pod의 initContainers 섹션에 명시된다. InitContainer가 완료될 때까지 주 컨테이너는 실행되지 않으며, InitContainer가 여러 개 있을 경우 순차적으로 실행된다.

 

2. InitContainer가 실패하면 주 컨테이너는 실행되지 않는다.

 

만약 InitContainer가 실패할 경우, 쿠버네티스는 Pod를 반복해서 재시작하며, InitContainer가 성공할 때까지 주 컨테이너가 실행되지 않는다. Pod는 pending 상태로 멈춰있게 된다.

 

InitContainer 실습

 

정상적으로 InitContainer가 실행되었을 때 

 

다음과 같은 yaml 파일로 multi container pod를 실행시킨다.

apiVersion: v1
kind: Pod
metadata:
  name: blue
  namespace: default
spec:
  containers:
  - command:
    - sh
    - -c
    - echo The app is running! && sleep 3600
    image: busybox:1.28
    name: green-container-1
  initContainers:
  - command:
    - sh
    - -c
    - sleep 5
    image: busybox
    name: init-myservice

 

 

정상적으로 Running 되는 것을 확인 가능하다.

 

 

 

kubectl  describe po blue

 

다음 명령어로 Init container 상태 확인 시 정상적으로 실행이 완료된 후에 바로 Terminated로 바뀌는 것을 확인할 수 있다.

 

 

InitContainer가 아직 끝나지 않았을 때

 

InitContainer 부분을 다음과 같이 설정할 경우 sleep을 30분동안 진행한다. 

의도적으로 주 컨테이너가 실행이 되는지 안 되는지 확인이 가능하다. 

initContainers:
  - command:
    - sh
    - -c
    - sleep 600
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    name: warm-up-1
    
   - command:
    - sh
    - -c
    - sleep 1200
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    name: warm-up-2

 

예상대로 다른 Pod들과 달리 아직 Init으로 멈춰있는 것을 확인 가능하다. 

 

 

InitContainer가 정상 실행되지 않았을 때

 

의도적으로 command를 sleeeep으로 오류로 줘 정상적인 실행이 불가하게끔 해주었다.

 

initContainers:
  - command:
    - sh
    - -c
    - sleeeep 600
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    name: warm-up-1

 

상태를 확인할 경우 purple과 다르게 CrashLoopBackOff 오류가 반환되는 것을 확인 가능하다.