공유 볼륨을 사용해 같은 Pod의 컨테이너 간 통신하기

공유 볼륨을 사용해 같은 Pod의 컨테이너 간 통신하기

이 페이지에서는 같은 Pod에서 실행되는 두 컨테이너가 Volume을 사용해 통신하는 방법을 보여드려요. 컨테이너 간에 프로세스 네임스페이스를 공유해 프로세스들이 통신하도록 허용하는 방법도 함께 볼 수 있어요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

버전을 확인하려면 kubectl version을 입력하세요.

두 컨테이너를 실행하는 Pod 만들기 (Creating a Pod that runs two Containers)

이 실습에서는 두 컨테이너를 실행하는 Pod를 만들어요. 두 컨테이너는 통신에 사용할 Volume을 공유해요. 다음은 이 Pod의 구성 파일이에요.

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

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

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]

pods/two-container-pod.yaml — 구성 파일에서 Pod가 shared-data라는 Volume을 가진다는 것을 볼 수 있어요.

구성 파일에 나열된 첫 번째 컨테이너는 nginx 서버를 실행해요. 공유 Volume의 마운트 경로는 /usr/share/nginx/html이에요. 두 번째 컨테이너는 debian 이미지 기반이고 마운트 경로가 /pod-data예요. 두 번째 컨테이너는 다음 명령을 실행한 뒤 종료돼요.

echo Hello from the debian container > /pod-data/index.html

두 번째 컨테이너가 nginx 서버의 루트 디렉터리에 index.html 파일을 쓴다는 점을 주목하세요.

Pod와 두 컨테이너를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/two-container-pod.yaml

Pod와 컨테이너에 대한 정보를 확인해요.

kubectl get pod two-containers --output=yaml

출력의 일부는 다음과 같아요.

apiVersion: v1
kind: Pod
metadata:
  ...
  name: two-containers
  namespace: default
  ...
spec:
  ...
  containerStatuses:

  - containerID: docker://c1d8abd1 ...
    image: debian
    ...
    lastState:
      terminated:
        ...
    name: debian-container
    ...

  - containerID: docker://96c1ff2c5bb ...
    image: nginx
    ...
    name: nginx-container
    ...
    state:
      running:
    ...

debian Container는 종료됐고, nginx Container는 여전히 실행 중인 것을 볼 수 있어요.

nginx Container에 셸을 띄워 보세요.

kubectl exec -it two-containers -c nginx-container -- /bin/bash

셸에서 nginx가 실행 중인지 확인해요.

root@two-containers:/# apt-get update
root@two-containers:/# apt-get install curl procps
root@two-containers:/# ps aux

출력은 다음과 비슷해요.

USER       PID  ...  STAT START   TIME COMMAND
root         1  ...  Ss   21:12   0:00 nginx: master process nginx -g daemon off;

debian Container가 nginx 루트 디렉터리에 index.html 파일을 만들었다는 것을 기억하세요. curl을 사용해 nginx 서버에 GET 요청을 보내 보죠.

root@two-containers:/# curl localhost

출력은 nginx가 debian 컨테이너가 쓴 웹 페이지를 서빙하고 있음을 보여줘요.


Hello from the debian container

논의 (Discussion)

Pod가 여러 컨테이너를 가질 수 있는 주된 이유는 주 애플리케이션을 돕는 헬퍼 애플리케이션을 지원하기 위해서예요. 헬퍼 애플리케이션의 전형적인 예는 데이터 풀러(data puller), 데이터 푸셔(data pusher), 프록시가 있어요. 헬퍼와 주 애플리케이션은 종종 서로 통신해야 해요. 대개는 이 실습에서 보여준 것처럼 공유 파일시스템을 통해, 또는 루프백 네트워크 인터페이스인 localhost를 통해 이루어져요. 이 패턴의 예는 Git 저장소에서 새 업데이트를 폴링하는 헬퍼 프로그램과 함께하는 웹 서버예요.

이 실습의 Volume은 Pod가 살아 있는 동안 컨테이너들이 통신할 수 있는 방법을 제공해요. Pod가 삭제되고 다시 생성되면 공유 Volume에 저장된 데이터는 손실돼요.

다음 단계 (What's next)

  • 복합 컨테이너(composite containers) 패턴에 대해 자세히 배우기
  • 모듈식 아키텍처를 위한 복합 컨테이너에 대해 배우기
  • 스토리지에 Volume을 사용하도록 Pod 구성하기 보기
  • Pod에서 컨테이너 간에 프로세스 네임스페이스를 공유하도록 Pod 구성하기 보기
  • Volume 보기
  • Pod 보기

더 알아보기 (Learn more)