[Kubernetes] Multi Container Pods


서론

쿠버네티스에서 multi container 파드를 구성할 때 두 가지 패턴(종류)가 있다.

하나는 Sidecar container와 co-located container이다.

두 컨테이너는 같은 파드 안에 존재하지만 역할과 생명주기 동작방식에서 차이가 있다.

이 두 종류에 대해서 알아보자

Sidecar Containers

메인 컨테이너 옆에서 함께 실행되는 보조 컨테이너이다.

이 컨테이너의 목적은 메인 컨테이너의 기능을 변경하지 않고 보완하거나 확장하는 것이다.

주로 로깅, 모니터링, 데이터 동기화 등에 사용된다.

설정 방법은 다음과 같다.

If an init container is created with its restartPolicy set to Always, it will start and remain running during the entire life of the Pod

만약 initContainersrestartPolicy가 없다면 일반 initContainer로 간주되어 제일 먼저 컨테이너가 실행되어 성공적으로 끝나면 더 이상 재시작하지 않고 종료됨으로 이를 유념해야한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: alpine:latest
          command: ['sh', '-c', 'while true; do echo "logging" >> /opt/logs.txt; sleep 1; done']
          volumeMounts:
            - name: data
              mountPath: /opt
      initContainers: # Sidecar Container 선언
        - name: logshipper
          image: alpine:latest
          restartPolicy: Always # Sidecar Container 설정 핵심
          command: ['sh', '-c', 'tail -F /opt/logs.txt']
          volumeMounts:
            - name: data
              mountPath: /opt
      volumes:
        - name: data
          emptyDir: {}

https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

Co-located Containers

하나의 파드 내에서 공통된 목적을 위해 협력하는 여러 컨테이너를 의미한다.

이는 Kubernetes v1.29 이전까지 sidecar container로 통칭되던 패턴과 구별하기 위해 새롭게 명명된 용어이다.

sidecar container와 달리, 모두가 메인 컨테이너이다.

각 컨테이너가 애플리케이션의 주요 기능을 일부씩 맡아서 서로 협력한다.

그래서 어느 하나가 보조가 아니라, 모두가 애플리케이션 기능의 일부를 책임진다.

또한 Sidecar와 달리 시작 순서가 상관없으며 각자 독립적으로 시작하거나 종료된다.

예를들어 이미지 전처리 어플리케이션이라면 하나의 컨테너는 이미지 사이즈를 변경하고 또 다른 컨테이너는 이미지에 필터를 추가하는 역할을 한다.