LabHub

CKAD — 쿠버네티스 애플리케이션 개발자 · 애플리케이션 설계와 빌드 · 실습

멀티 컨테이너 파드 — init, 사이드카, 앰배서더, 어댑터

LabHub 에서 이어서 보기

목표

한 파드 안에 여러 컨테이너를 놓아야 하는 이유를 패턴별로 구분하고, init 컨테이너·네이티브 사이드카·앰배서더·어댑터를 매니페스트로 직접 작성할 수 있게 된다.

왜 중요한가

파드 안에 컨테이너를 두 개 두는 결정은 공짜가 아니다. 두 컨테이너는 함께 스케줄되고, 함께 재시작되고, 함께 삭제된다. 그래서 "같은 노드에 있어야 하는가"와 "생명주기가 같아야 하는가"를 둘 다 만족할 때만 한 파드에 넣는다. 로그 수집기는 앱이 쓴 파일을 읽어야 하므로 같은 노드여야 하고, 앱이 사라지면 읽을 게 없으므로 생명주기도 같다. 반면 캐시 서버는 여러 앱이 공유하므로 별도 파드다.

init 컨테이너와 사이드카를 가르는 기준은 끝나는가이다. 끝나야 하는 일(마이그레이션, 설정 준비, 선행 서비스 대기)은 init 이고, 끝나면 안 되는 일(로그 전송, 프록시)은 사이드카다. 예전에는 사이드카를 containers 에 넣을 수밖에 없어서 시작 순서가 보장되지 않았고 Job 이 끝나지 않는 문제가 있었다. 지금은 initContainers 에 넣고 restartPolicy: Always 를 주면 "먼저 시작하고, 계속 살아 있고, 메인이 끝나면 같이 끝나는" 컨테이너가 된다.

앰배서더와 어댑터는 방향이 다르다. 앰배서더는 나가는 트래픽을, 어댑터는 나가는 데이터 형식을 대신 처리한다. 둘 다 앱 코드를 건드리지 않고 환경 차이를 흡수하는 것이 목적이다.

단계

1. 네임스페이스 ckad-multi 를 만든다.
2. 파드 app-init 을 만든다. init 컨테이너 prep(이미지 busybox:1.36, command: ["/bin/sh","-c","echo ready > /work/state"])과 메인 컨테이너 app(이미지 nginx:1.27)이 emptyDir 볼륨 workdir 를 둘 다 /work 에 마운트한다.
3. 파드 ordered-init 을 만든다. init 컨테이너를 순서대로 wait-config, migrate 두 개 두고(둘 다 busybox:1.36, command["/bin/sh","-c","true"]), 메인 컨테이너 appnginx:1.27.
4. 파드 log-shipper 를 만든다. 네이티브 사이드카 loggerinitContainers 에 넣고 restartPolicy: Always 를 준다(이미지 busybox:1.36, command: ["/bin/sh","-c","tail -F /var/log/nginx/access.log"]). 메인 컨테이너 webnginx:1.27. emptyDir 볼륨 varlog 를 두 컨테이너 모두 /var/log/nginx 에 마운트한다.
5. 파드 ambassador-pod 를 만든다. 메인 컨테이너 app(busybox:1.36, command: ["/bin/sh","-c","sleep 3600"])에 환경변수 REDIS_ADDR=localhost:6379 를 주고, 두 번째 컨테이너 proxy(nginx:1.27)에 containerPort: 6379, name: redis-proxy 를 지정한다.
6. 파드 adapter-pod 를 만든다. 메인 컨테이너 app(busybox:1.36, command: ["/bin/sh","-c","sleep 3600"])과 어댑터 컨테이너 metrics-adapter(nginx:1.27)가 emptyDir 볼륨 applog둘 다 /var/log/app 에 마운트한다. 어댑터에는 containerPort: 9113, name: metrics 를 지정한다.
7. 파드 graceful 을 만든다. 네이티브 사이드카 drainer(initContainers 안, restartPolicy: Always, busybox:1.36, command: ["/bin/sh","-c","sleep 3600"])와 메인 컨테이너 web(nginx:1.27)을 두고, 파드의 terminationGracePeriodSeconds45 로 설정한다. 메인 컨테이너 web 에는 preStop 훅으로 exec 명령 ["/bin/sh","-c","sleep 10"] 을 건다.

참고

단계 7개

  1. 실습 네임스페이스 만들기
  2. init 컨테이너와 공유 emptyDir
  3. init 컨테이너 두 개의 실행 순서
  4. 네이티브 사이드카 (restartPolicy: Always)
  5. 앰배서더 패턴 — 바깥으로 나가는 길을 대신 뚫기
  6. 어댑터 패턴 — 출력 형식을 바깥에 맞추기
  7. 종료 시간 예산과 preStop (종합)