1. 배경
쿠버네티스 파드는 한 개 이상의 컨테이너로 이루어져 있습니다. 메인 컨테이너 기동 전에 초기 설정을 도와주는 init-container, 로그/메트릭 수집 등 보조 역할을 하는 사이드카 컨테이너 등 한 개의 파드에 여러 개의 컨테이너가 있습니다. 이러한 여러 컨테이너는 서로 localhost로 통신이 가능합니다. 도커로 컨테이너를 여러 개 생성할 경우에는 localhost로 통신이 불가한데, 파드 내부에서는 어떻게 이러한 동작이 가능한지 확인합니다.
2. Pod 생성 및 확인
한 개의 파드에 두개의 노드 서버 컨테이너를 다른 포트를 설정해 생성합니다.
apiVersion: v1
kind: Pod
metadata:
name: multiple-web
spec:
containers:
- image: webratio/nodejs-http-server
name: web1
env:
- name: PORT
value: "1111"
- image: webratio/nodejs-http-server
name: web2
env:
- name: PORT
value: "2222"
이후 파드의 web1 컨테이너에 접속해, web2(포트:2222)로 접속하면 통신이 되는 것을 확인할 수 있습니다.
파드가 생성된 노드에서 컨테이너를 조회하면 다음과 같이 nodejs-http-server 이미지를 사용하는 컨테이너 두 개를 예상대로 확인할 수 있습니다.
이후 해당 각 컨테이너의 namespace를 조회하면 다음과 같습니다.
두 컨테이너의 네임스페이스 안에 동일한 프로세스(262843)을 공유하고 있는 것을 확인할 수 있습니다. 해당 프로세스를 확인하면 pause 컨테이너로 확인할 수 있습니다.
즉 pause 컨테이너를 통해 각 컨테이너는 네임스페이스를 공유할 수 있고, 동일한 네트워크 네임스페이스를 공유하기 때문에 Localhost로 컨테이너 간 통신이 가능합니다.
Pause Container?
Pause Container는 Init Process(PID 1 ) 의 역할을 Pod에서 대신합니다. Init 프로세스는 전통적인 리눅스 세스템에서 부팅 및 초기화를 담당하는 첫 번째 프로세스입니다. 가장 먼저 시작되어 이를 상속받아 프로세스가 생성되고(PID 네임스페이스 공유), 시그널 관리, 좀비 프로세스 수집 등 전체적인 프로세스 라이프사이클을 관리합니다. 이러한 Init 프로세스의 역할을 파드에서 Pause 컨테이너가 담당합니다. 또한 이러한 Init Process의 역할 중 하나로 파드 내의 컨테이너 간의 네임 스페이스를 공유합니다.
- UTS namespace: 컨테이너 간의 같은 호스트네임을 공유합니다.
- IPC Namespace: IPC(Inter-Process Communication) 네임스페이스를 공유하여 컨테이너간 동일한 IPC 자원(Message Queue, Shared Memory)을 프로세스 간에 공유합니다. 이를 통해 각 컨테이너의 프로세스 간에 데이터를 교환하거나 통신할 수 있습니다.
- Network Namespace: 네트워크 네임스페이스 공유를 통해 Interface, IP 주소, 라우팅 테이블 등의 공유를 통해 컨테이너 들이 동일한 네트워크에 속하게 되어 컨테이너 간의 통신이 용이합니다. 이를 통해 컨테이너 간의 localhost로 통신할 수 있게 됩니다.
'Kubernetes' 카테고리의 다른 글
서비스 메쉬란?(Linkerd vs Istio) (1) | 2024.04.11 |
---|---|
Kubernetes CSI Driver 란? (1) | 2024.01.21 |
Github Action/ Argo CD를 이용한 CI/CD 구성 (0) | 2024.01.14 |
ETCD MultiMaster Backup/Restore(CronJob 생성) (1) | 2023.11.14 |
Velero를 이용한 쿠버네티스 Backup (0) | 2023.10.12 |