내 잡다한 노트

[K8S] Multi container pods design patterns 본문

DevOps/쿠버네티스

[K8S] Multi container pods design patterns

peanutwalnut 2024. 11. 17. 18:11

Kubernetes에서 Multi-Container Pods는 여러 컨테이너를 하나의 Pod에 배치하여 서로 긴밀하게 협력하는 애플리케이션 아키텍처를 구현하는 데 사용됩니다. 이러한 디자인은 컨테이너 간의 데이터 공유, 통신, 라이프사이클 관리를 단순화합니다. Multi-Container Pods는 특정 디자인 패턴에 따라 구성되며, 이를 통해 애플리케이션의 다양한 요구사항을 충족할 수 있습니다.

 

1. Sidecar Pattern

설명

  • Sidecar는 주 컨테이너(Main Application Container)를 지원하기 위해 함께 동작하는 보조 컨테이너입니다.
  • 주로 주 컨테이너의 기능을 확장하거나 개선하는 역할을 수행합니다.
  • Sidecar 컨테이너는 주 컨테이너와 동일한 네트워크와 스토리지를 공유하여 밀접하게 협력합니다.

사용 사례

  1. 로깅 및 모니터링:
    • 주 컨테이너의 로그 데이터를 수집하고 외부 시스템으로 전달.
  2. 프록시 및 네트워크 관리:
    • 주 컨테이너로 들어오는 트래픽을 라우팅하거나 필터링.
  3. 데이터 동기화:
    • 주 컨테이너에서 생성된 데이터를 외부 저장소로 백업.

예제

apiVersion: v1
kind: Pod
metadata:
  name: sidecar-pod
spec:
  containers:
  - name: main-app
    image: nginx
  - name: sidecar-logger
    image: fluentd
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  volumes:
  - name: log-volume
    emptyDir: {}

 

2. Ambassador Pattern

설명

  • Ambassador 컨테이너는 주 컨테이너의 네트워크 요청을 외부 서비스로 프록시하거나 변환합니다.
  • 이를 통해 주 컨테이너는 외부 서비스에 대한 복잡한 설정이나 인증 과정을 몰라도 됩니다.

사용 사례

  1. 외부 API와의 통합:
    • 외부 서비스와의 통신을 위한 공통 네트워크 설정 처리.
  2. 프록시 설정:
    • 주 컨테이너가 직접 처리하기 어려운 네트워크 요청을 관리.

예제

apiVersion: v1
kind: Pod
metadata:
  name: ambassador-pod
spec:
  containers:
  - name: main-app
    image: my-app
    ports:
    - containerPort: 8080
  - name: ambassador
    image: envoyproxy/envoy
    ports:
    - containerPort: 9090

 

 

3. Adapter Pattern

설명

  • Adapter 컨테이너는 주 컨테이너에서 생성된 데이터를 변환하거나 보강하여 다른 시스템과 호환되도록 만듭니다.
  • 데이터 포맷 변환, 데이터 보강, 로그 처리 등을 담당합니다.

사용 사례

  1. 로그 형식 변환:
    • 주 컨테이너의 로그를 다른 시스템이 이해할 수 있는 형식으로 변환.
  2. 데이터 포맷 변환:
    • JSON 데이터를 CSV로 변환하는 등 데이터 호환성을 보장.

 

apiVersion: v1
kind: Pod
metadata:
  name: adapter-pod
spec:
  containers:
  - name: main-app
    image: my-app
  - name: adapter
    image: data-transformer
    volumeMounts:
    - name: data-volume
      mountPath: /data
  volumes:
  - name: data-volume
    emptyDir: {}

 

4. Init Containers

설명

  • Init Containers는 애플리케이션 컨테이너가 시작되기 전에 실행되어 초기 설정을 수행합니다.
  • Pod 내 애플리케이션 컨테이너와 분리되어 있으며, 순차적으로 실행됩니다.

사용 사례

  1. 환경 준비:
    • 주 컨테이너 실행 전에 필요한 설정, 파일 다운로드, 데이터 준비.
  2. 의존성 처리:
    • 주 컨테이너 실행 전에 다른 서비스가 준비되었는지 확인.

apiVersion: v1
kind: Pod
metadata:
  name: init-container-pod
spec:
  initContainers:
  - name: init-service
    image: busybox
    command: ["sh", "-c", "echo Initializing..."]
  containers:
  - name: main-app
    image: nginx

 

 

5. Sidekick Pattern

설명

  • Sidekick는 주 컨테이너와 유사한 기능을 수행하거나 데이터를 보완하는 컨테이너입니다.
  • Sidecar와 유사하지만, 주로 주 컨테이너와 대등한 관계로 동작합니다.

사용 사례

  1. 데이터 보조 작업:
    • 주 컨테이너에서 생성된 데이터를 처리하거나 보완.
  2. 백업 및 복원:
    • 주 컨테이너의 데이터를 정기적으로 백업.

apiVersion: v1
kind: Pod
metadata:
  name: sidekick-pod
spec:
  containers:
  - name: main-app
    image: nginx
  - name: sidekick-backup
    image: backup-agent
    volumeMounts:
    - name: shared-data
      mountPath: /data
  volumes:
  - name: shared-data
    emptyDir: {}

 

멀티 컨테이너 Pods의 특징

  1. 공유 리소스:
    • 네트워크: 같은 네트워크 네임스페이스를 공유하여 localhost로 통신 가능.
    • 스토리지: 같은 스토리지 볼륨을 사용하여 데이터를 공유.
  2. 단일 라이프사이클:
    • Pod 내 모든 컨테이너가 함께 생성되고 함께 삭제됨.
  3. 역할 분리:
    • 주 컨테이너와 보조 컨테이너 간에 역할을 분리하여 각각의 책임을 명확히 정의.