본문 바로가기

Docker & Kubenetes

Kubernetes - init container

Init Container

pod의 app container가 실행되기 전에 동작하는 초기화 컨테이너로, Init Container들이 정상 구동이 완료 되어야 Main Container(App)가 실행된다.

 

만약, Init Container가 실패하면 kubelet은 Init Container가 성공할 때 까지 반복 재시작 하고, restartPolicy를 Never로 설정했을 때 실패하면 k8s는 전체 pod가 실패한 것으로 처리한다.

 

Init Container는 lifecycle, livenessProbe, readinessProbe 또는 startupProbe를 지원하지 않으며 kubelet이 각 Init Container를 순차적으로 실행한다.

사용법

pod의 YAML 파일 중 pod spec 필드에서 initContainer 필드를 container 항목 배열에 추가하면 된다.

apiVersion: v1
kind: Pod
metadata:
  name: init-sample
spec:
  containers:
  - name: main
    image: ubuntu
...

  initContainers:
  - name: init
    image: alpine
...

Init Container는 APP Container와 별도의 이미지를 사용하기 때문에 구동에 관련하여 몇 가지 장점을 가질 수 있습니다.

  • 앱 이미지에는 없는 셋업을 위해 다양한 유틸리티나 맞춤 코드를 포함할 수 있으며 sed, awk, python 등 여러 도구를 사용하기 위해 다른 이미지로부터 새로운 이미지를 만들 필요가 없습니다.
  • Init Container에는 APP Container가 가질 수 없는 시크릿에 접근 권한을 줘 다른 파일 시스템 뷰를 가질 수 있습니다.(Linux 네임스페이스를 사용하기 때문)
  • APP Container의 보안성을 위협할 수 있는 유틸리티나 커스텀 코드를 안전하게 실행할 수 있으며 툴을 분리한 채 유지할 수 있어 이미지에 대한 공격에 노출을 제한할 수 있습니다.
  • Init Container는 별도의 이미지로 구동할 수 있어, 공동의 단일 앱 이미지 형태로 만들 필요가 없습니다.