본문 바로가기
IT 개발/클라우드

[쿠버네티스] 멀티 컨테이너 Pod 구성 가이드

by 이것 저것 모든것 2025. 2. 8.
728x90

1. 멀티 컨테이너 Pod 개요

멀티 컨테이너 Pod는 긴밀하게 결합된 여러 컨테이너를 하나의 Pod 내에서 실행하는 패턴입니다. 이 패턴은 다음과 같은 상황에서 유용합니다:

  • 로그 수집기와 애플리케이션 서버
  • 프록시와 웹 서버
  • 데이터 동기화가 필요한 컨테이너들

2. 주요 패턴

2.1 사이드카 패턴

apiVersion: v1
kind: Pod
metadata:
  name: sidecar-pod
spec:
  containers:
  - name: main-app
    image: nginx
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/nginx

  - name: log-collector
    image: busybox
    command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/nginx

  volumes:
  - name: shared-logs
    emptyDir: {}

2.2 앰배서더 패턴

apiVersion: v1
kind: Pod
metadata:
  name: ambassador-pod
spec:
  containers:
  - name: main-app
    image: my-app
    env:
    - name: REDIS_HOST
      value: localhost

  - name: redis-proxy
    image: redis-proxy
    ports:
    - containerPort: 6379

2.3 어댑터 패턴

apiVersion: v1
kind: Pod
metadata:
  name: adapter-pod
spec:
  containers:
  - name: main-app
    image: app
    ports:
    - containerPort: 8080

  - name: adapter
    image: metrics-adapter
    ports:
    - containerPort: 9090

3. 컨테이너 간 통신 방법

3.1 공유 볼륨

volumes:
- name: shared-data
  emptyDir: {}

volumeMounts:
- name: shared-data
  mountPath: /data

3.2 localhost 네트워킹

같은 Pod 내의 컨테이너들은 localhost를 통해 통신 가능:

env:
- name: SERVICE_URL
  value: "http://localhost:9090"

4. 리소스 관리

각 컨테이너별로 리소스 제한을 설정해야 합니다:

spec:
  containers:
  - name: app
    resources:
      limits:
        memory: "256Mi"
        cpu: "500m"
      requests:
        memory: "128Mi"
        cpu: "250m"

  - name: sidecar
    resources:
      limits:
        memory: "64Mi"
        cpu: "250m"
      requests:
        memory: "32Mi"
        cpu: "125m"
728x90

5. 라이프사이클 관리

5.1 초기화 컨테이너

spec:
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']

  containers:
  - name: main-app
    image: myapp

5.2 종료 처리

spec:
  containers:
  - name: main-app
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit"]

6. 모니터링과 로깅

6.1 사이드카를 이용한 로그 수집

spec:
  containers:
  - name: app
    volumeMounts:
    - name: logs
      mountPath: /var/log

  - name: log-collector
    image: fluentd
    volumeMounts:
    - name: logs
      mountPath: /var/log

7. 실전 예시: 웹 애플리케이션과 캐시

apiVersion: v1
kind: Pod
metadata:
  name: web-cache-pod
spec:
  containers:
  - name: webapp
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: cache-volume
      mountPath: /cache

  - name: cache-proxy
    image: redis
    ports:
    - containerPort: 6379
    volumeMounts:
    - name: cache-volume
      mountPath: /data

  volumes:
  - name: cache-volume
    emptyDir: {}

8. 베스트 프랙티스

  1. Pod 내 컨테이너 수 최소화
  2. 적절한 리소스 제한 설정
  3. 헬스 체크 구현
  4. 로깅 전략 수립
  5. 보안 컨텍스트 설정

9. 문제 해결

  1. 컨테이너 로그 확인
kubectl logs pod-name -c container-name
  1. 컨테이너 진입
kubectl exec -it pod-name -c container-name -- /bin/sh
  1. Pod 상태 확인
kubectl describe pod pod-name
728x90