Multi-Container Pod
- (처음 쿠버네티스와 Pod의 개념에 대해 설명할 때) 파드는 최소의 배포단위이기에 여러 개의 어플리케이션 컨테이너를 묶어 하나의 파드로 배포하는 것은 적절한 사용법이 아님.
- 그러나, 하나의 파드에 복수의 컨테이너를 함께 구성하여 배포하는 방식이 충분히 고려될 수 있음.
- 다른 컨테이너를 통해 실행되는 서비스가 메인 어플리케이션을 보조하는 경우
- 동일 스토리지 또는 네트워크의 공유하는 서비스가 필요한 경우
- 동일한 라이프사이클을 이루는 경우
- 생성, 배포, 삭제, 스케일 업다운이 동일하게 적용되어야 하는 경우.
- 예) 웹서버와 별도로 로깅 서비스가 함께 페어를 이룬 경우
- 따라서 굳이 별도의 파드에 분리할 필요가 없음.
- 이러한 경우를 Multi-Container Pod 구성 또는 디자인 패턴이라 함.
Multi-Container Pod 생성 방법
Pod를 정의할 때, 컨테이너를 array의 형태로 정의함.
# example
apiVersion: 1
kind: Pod
metadata:
name: my-webapp
labels:
name: my-webapp
spec:
containers:
- name: my-webapp
image: my-webapp
ports:
- containerPort: 8080
- name: log-agent
image: log-agent
Multi-Container Pod Design Pattern
Multi-Container Pod 에는 다음과 같은 디자인 패턴이 제시됨.
- Sidecar Container
- 기존 파드의 기능을 보조하고 스토리지 또는 파일시스템을 공유하는 형태의 보조 컨테이너를 사용하는 패턴
- Adapter Container
- 파드에서 실행 중인 애플리케이션의 출력을 특정 형태나 규격에 맞게 표준화하는 용도
- Ambassador Container
- 파드 외부의 서비스에 대한 엑세스를 간소화하는 프록시 컨테이너 유형
Init Container
하나의 파드에 한개 이상의 포드가 정의되는 또다른 유형.
Init Container는 실제로 동작할 어플리케이션의 컨테이너가 생성되기 이전에 동작하고 사라질 컨테이너
- 예)
- 코드를 pull하고 역할만 하는 컨테이너
- 데이터베이스를 초기 설정하는 컨테이너 (비슷한 예로 Airflow 예제를 보면 컨테이너 실행할 때 init container에서 postgres를 설정하는 부분이 있음)
- 예)
일반 컨테이너와의 차이점
- 사전 정의한 작업이 완료되면 종료되어야 함.
- 생명주기 옵션 사용을 사용할 수 없음.
- 여러 개를 정의한 경우에는 순차적으로 시작되며, 정상 종료되었을 때 다음 Init Container 가 시작됨.
- 구동이 실패한 경우 재시작하지만,
restartPolicy
가Never
로 명시되었을 때는 파드 자체의 status가 Failure로 기록되고 종료됨.
- 구동이 실패한 경우 재시작하지만,
Init Container 생성 방법 : initContainers
initContainers
로 정의함.- Pod가 생성될 때 initContainer 부터 먼저 실행 되고, 내부 정의된 프로세스가 완료될 때까지 실행됨.
- 복수개로 정의해도 됨. 위에서부터 아래로 순서대로 실행 됨.
# example
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
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;']
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']