공유 볼륨을 사용해 같은 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 보기