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 에는 다음과 같은 디자인 패턴이 제시됨.

Source: Multi-Container Pod Design Patterns in Kubernetes

Source: Multi-Container Pod Design Patterns in Kubernetes

  1. Sidecar Container
    • 기존 파드의 기능을 보조하고 스토리지 또는 파일시스템을 공유하는 형태의 보조 컨테이너를 사용하는 패턴
  2. Adapter Container
    • 파드에서 실행 중인 애플리케이션의 출력을 특정 형태나 규격에 맞게 표준화하는 용도
  3. Ambassador Container
    • 파드 외부의 서비스에 대한 엑세스를 간소화하는 프록시 컨테이너 유형

Init Container

하나의 파드에 한개 이상의 포드가 정의되는 또다른 유형.

  • Init Container는 실제로 동작할 어플리케이션의 컨테이너가 생성되기 이전에 동작하고 사라질 컨테이너

    • 예)
      • 코드를 pull하고 역할만 하는 컨테이너
      • 데이터베이스를 초기 설정하는 컨테이너 (비슷한 예로 Airflow 예제를 보면 컨테이너 실행할 때 init container에서 postgres를 설정하는 부분이 있음)
  • 일반 컨테이너와의 차이점

    • 사전 정의한 작업이 완료되면 종료되어야 함.
    • 생명주기 옵션 사용을 사용할 수 없음.
    • 여러 개를 정의한 경우에는 순차적으로 시작되며, 정상 종료되었을 때 다음 Init Container 가 시작됨.
      • 구동이 실패한 경우 재시작하지만, restartPolicyNever로 명시되었을 때는 파드 자체의 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']

Reference