🍳머리말
k8s docs 복붙글입니다.
📕 Init container
📔 역할
pod의 app container들이 실행되기 전에 실행되는 특수한 container며 app image는 없는 utility, 설정 script등을 포함할 수 있습니다. 초기화 container는 containers 배열과 나란히 pod spec에 명시할 수 있습니다.
📔 일반 container와 유사점
항상 완료를 목표로 실행됩니다.
각 초기화 container는 다음 init container가 시작되기 전에 성공적으로 완료되어야 합니다.
📔 일반 container와 차이점
초기화 컨테이너는 앱 컨테이너의 리소스 상한(limit), 볼륨, 보안 세팅을 포함한 모든 필드와 기능을 지원합니다. 그러나, 초기화 컨테이너를 위한 리소스 요청량과 상한은 리소스에 문서화된 것처럼 다르게 처리됩니다.
또한, 초기화 컨테이너는 lifecycle, livenessProbe, readinessProbe 또는 startupProbe 를 지원하지 않습니다. 왜냐하면 초기화 컨테이너는 파드가 준비 상태가 되기 전에 완료를 목표로 실행되어야 하기 때문입니다.
만약 다수의 초기화 컨테이너가 파드에 지정되어 있다면, kubelet은 해당 초기화 컨테이너들을 한 번에 하나씩 실행합니다. 각 초기화 컨테이너는 다음 컨테이너를 실행하기 전에 꼭 성공해야 합니다. 모든 초기화 컨테이너들이 실행 완료되었을 때, kubelet은 파드의 애플리케이션 컨테이너들을 초기화하고 평소와 같이 실행합니다
📔 이해
만약 pod의 init container가 실패하면 kubelet은 init container가 성공할 때까지 반복적으로 재시작합니다. 그러나, 만약 pod의 restartPolicy를 Never로 설정했을 때 실패하면 k8s는 전체 pod가 실패한 것으로 처리합니다.
컨테이너를 초기화 컨테이너로 지정하기 위해서는, pod spec에 initContainers 필드를 container 항목(앱 container 필드 및 내용과 유사한)들의 배열로서 추가하면 됩니다. container에 대한 더 상세한 사항은 API 레퍼런스를 참고합니다.
초기화 컨테이너의 상태는 컨테이너 상태의 배열(.status.containerStatuses 필드와 유사)로 .status.initContainerStatuses 필드에 반환됩니다.
📔 사용
초기화 컨테이너는 앱 컨테이너와는 별도의 이미지를 가지고 있기 때문에, 시동(start-up)에 관련된 코드로서 몇 가지 이점을 가집니다.
- 앱 이미지에는 없는 셋업을 위한 유틸리티 또는 맞춤 코드를 포함할 수 있습니다. 예를 들어, 셋업 중에 단지 sed, awk, python, 또는 dig와 같은 도구를 사용하기 위해서 다른 이미지로부터(FROM) 새로운 이미지를 만들 필요가 없습니다.
- 애플리케이션 이미지 빌더와 디플로이어 역할은 독립적으로 동작될 수 있어서 공동의 단일 앱 이미지 형태로 빌드될 필요가 없습니다.
- 초기화 컨테이너는 앱 컨테이너와 다른 파일 시스템 뷰를 가지도록 리눅스 네임스페이스를 사용합니다. 결과적으로, 초기화 컨테이너에는 앱 컨테이너가 가질 수 없는 시크릿에 접근 권한이 주어질 수 있습니다.
- 앱 컨테이너들은 병렬로 실행되는 반면, 초기화 컨테이너들은 어떠한 앱 컨테이너라도 시작되기 전에 실행 완료되어야 하므로, 초기화 컨테이너는 사전 조건들이 충족될 때까지 앱 컨테이너가 시동되는 것을 막거나 지연시키는 간편한 방법을 제공합니다.
- 초기화 컨테이너는 앱 컨테이너 이미지의 보안성을 떨어뜨릴 수도 있는 유틸리티 혹은 커스텀 코드를 안전하게 실행할 수 있습니다. 불필요한 툴들을 분리한 채로 유지함으로써 앱 컨테이너 이미지의 공격에 대한 노출을 제한할 수 있습니다.
📔 예제
초기화 컨테이너를 사용하는 방법에 대한 몇 가지 아이디어는 다음과 같습니다.
1. 다음과 같은 셸 커맨드로, 서비스가 생성될 때까지 기다리기.
2.
for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
3. 다음과 같은 커맨드로, 다운워드 API(Downward API)를 통한 원격 서버에 해당 파드를 등록하기.
curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$(<POD_NAME>)&ip=$(<POD_IP>)'
4. 다음과 같은 커맨드로 앱 컨테이너가 시작되기 전에 일정 시간 기다리기.
sleep 60
Git 저장소를 볼륨 안에 클론하기.
설정 파일에 값을 지정하고 메인 앱 컨테이너를 위한 설정 파일을 동적으로 생성하기 위한 템플릿 도구를 실행하기. 예를 들어, 설정에 POD_IP 값을 지정하고 메인 앱 설정 파일을 Jinja를 통해서 생성
📕참조
https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/
'Cloud' 카테고리의 다른 글
(Kubernetes) - Custom Resource (0) | 2021.12.01 |
---|---|
(Kubernetes) - operator pattern (0) | 2021.11.17 |
(Kubernetes) - pod lifecycle (0) | 2021.11.15 |
(Kubernetes) - k8s namespace 생성하기 (0) | 2021.11.09 |
(Kubernetes) - storage (0) | 2021.10.26 |