Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.3] 🚀 POD 편 #3 | 다중 컨테이너 & 초기화 설정

ygtoken 2025. 3. 15. 13:23
728x90

 

쿠버네티스에서 하나의 Pod 내에 여러 개의 컨테이너를 실행하는 경우가 있습니다.

이번 글에서는 사이드카 컨테이너(Sidecar Pattern)와 초기화 컨테이너(InitContainer) 활용 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 다중 컨테이너(Sidecar 패턴) 적용

2️⃣ InitContainer를 활용한 Pod 초기화

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ 다중 컨테이너(Sidecar 패턴) 적용

 

📍 상황 설명

 

애플리케이션이 실행될 때 로그를 파일로 저장하지만,

이를 별도의 컨테이너에서 수집하여 중앙화된 로깅 시스템으로 전송해야 합니다.

Pod의 이름은 app-with-sidecar이어야 합니다.

main-app 컨테이너는 애플리케이션을 실행합니다.

log-collector 컨테이너는 로그 파일을 읽고 전송하는 역할을 합니다.

두 컨테이너는 공유 볼륨을 사용하여 같은 로그 파일을 읽을 수 있어야 합니다.

 


🛠️ 해결 방법

 

1. 단일 Pod 내부에 두 개의 컨테이너를 실행해야 합니다.

main-app 컨테이너는 애플리케이션 실행

log-collector 컨테이너는 로그 수집

2. 공유 볼륨을 사용하여 컨테이너 간 데이터를 주고받아야 합니다.

emptyDir 볼륨을 사용하여 두 컨테이너가 같은 로그 파일을 접근할 수 있도록 설정

 


✅ 정답 Manifest (Sidecar 패턴이 적용된 Pod)

apiVersion: v1
kind: Pod
metadata:
  name: app-with-sidecar  # Pod의 이름
spec:
  volumes:
  - name: shared-logs  # 공유할 볼륨 정의
    emptyDir: {}  # 임시 파일 시스템 볼륨

  containers:
  - name: main-app
    image: my-app:latest  # 메인 애플리케이션 컨테이너
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/app  # 로그를 저장할 경로

  - name: log-collector
    image: log-collector:latest  # 로그를 수집하는 컨테이너
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/app  # 같은 경로에서 로그를 읽음

 

 


📌 적용 후 예상 결과 값

 

1) Pod 생성 확인

kubectl get pods

 

💡 예상 출력 값

NAME              READY   STATUS    RESTARTS   AGE
app-with-sidecar  2/2     Running   0          5s

 

2) Pod 내부의 로그 파일 확인

kubectl exec -it app-with-sidecar -c log-collector -- ls /var/log/app

 

💡 예상 출력 값

app.log
error.log

 

 


2️⃣ InitContainer를 활용한 Pod 초기화

 

📍 상황 설명

 

애플리케이션이 실행되기 전에 데이터베이스 마이그레이션 작업을 수행해야 합니다.

마이그레이션이 끝난 후 메인 컨테이너가 실행되도록 설정해야 합니다.

Pod의 이름은 app-with-init이어야 합니다.

db-migrator 컨테이너가 초기 데이터베이스 마이그레이션을 수행해야 합니다.

main-app 컨테이너는 마이그레이션이 끝난 후 실행되어야 합니다.

 


🛠️ 해결 방법

 

1. InitContainer를 활용하여 메인 컨테이너보다 먼저 실행되도록 설정합니다.

db-migrator가 데이터베이스 마이그레이션을 수행

마이그레이션이 완료되면 main-app이 실행됨

2. InitContainer의 실행이 완료될 때까지 메인 컨테이너가 대기해야 합니다.

InitContainer는 main-app이 실행되기 전에 반드시 완료되어야 함

 


✅ 정답 Manifest (InitContainer가 적용된 Pod)

apiVersion: v1
kind: Pod
metadata:
  name: app-with-init  # Pod의 이름
spec:
  initContainers:
  - name: db-migrator
    image: db-migrator:latest  # 데이터베이스 마이그레이션 컨테이너
    command: ["sh", "-c", "echo Running DB migration; sleep 10"]

  containers:
  - name: main-app
    image: my-app:latest  # 메인 애플리케이션 컨테이너
    command: ["sh", "-c", "echo Starting main application; sleep infinity"]

 

 


📌 적용 후 예상 결과 값

 

1) Pod 생성 확인

kubectl get pods

 

💡 예상 출력 값

NAME           READY   STATUS     RESTARTS   AGE
app-with-init  0/1     Init:0/1   0          5s

 

2) InitContainer 실행 상태 확인

kubectl describe pod app-with-init | grep -A 5 "Init Containers"

 

💡 예상 출력 값

Init Containers:
  db-migrator:
    Image:         db-migrator:latest
    State:         Running
    Started:       3s ago

 

3) InitContainer 완료 후 메인 컨테이너 실행 확인

kubectl get pods

 

💡 예상 출력 값

NAME           READY   STATUS    RESTARTS   AGE
app-with-init  1/1     Running   0          15s
728x90