쿠버네티스에서 하나의 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
'Kubernetes > Kubernetes Best Practices' 카테고리의 다른 글
[Scenario Playbook Ep.6] 🚀 Deployment 편 #1 | 배포 전략 및 롤링 업데이트 (0) | 2025.03.15 |
---|---|
[Scenario Playbook Ep.5] 🚀 POD 편 #5 | Pod 스케줄링 & 실행 전략 (0) | 2025.03.15 |
[Scenario Playbook Ep.4] 🚀 POD 편 #4 | 스토리지 & 데이터 유지 (0) | 2025.03.15 |
[Scenario Playbook Ep.2] 🚀 POD 편 #2 | 리소스 제한 & 특정 노드 실행 (0) | 2025.03.15 |
[Scenario Playbook Ep.1] 🚀 POD 편 #1 | 기본 실행 & 환경 변수 설정 (0) | 2025.03.15 |