Dev / App

K8s Network - Pause Container

K8s Network

4 min read
K8s Network - Pause Container

Pause Container

Pod에는 하나의 Container를 사용하는 것이 권장이지만, 때에 따라 여러 Container를 혼재하여 사용하는 것도 가능하며, Container는 리눅스의 여러 격리 기술로 발전해왔습니다.

이때, 하나의 Pod내의 Container끼리도 리소스들이 격리되는 것이 정상이지만, 모든 Container가 같은 네임스페이스를 공유하는 커널단 리소스가 존재합니다.

IPC 네임스페이스와, Network 네임스페이스가 이에 속합니다.

Network Namespace

Pause Container는 Network 네임스페이스를 생성하며, Container 생성 시, default로 자동 생성됩니다.

실습

Pod 생성

하나의 Pod에 nginx, busybox 컨테이너를 생성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: pause
spec:
  containers:
  - name: web
    image: nginx:1.21-alpine
  - name: tools
    image: busybox
    command: ["sh", "-c", "sleep 3600"]
kubectl apply -f <file.yaml>

"READY" 항목에 N/2 라고 되어있으면 정상적으로 두 개의 컨테이너 설정이 된 것입니다.

kubectl exec -it pause -c tools – sh #busybox 컨테이너에서 nginx에 접근

wget -qO- localhost - nginx의 기본 페이지 HTML이 출력되면, 두 컨테이너가 동일한 network 네임스페이스를 공유하고 있다는 결정적 증거입니다.

어떤 점이 결정적 증거라는 것일까요?

현재 컨테이너의 구조는 아래와 같습니다.

  1. tools 컨테이너는 nginx 프로세스가 없음
  2. 그런데, tools에서 localhost:80으로 접속했을 때, nginx의 html이 응답으로 옮
  3. 다른 컨테이너에서 열린 포트가 tools에서도 보인 것! == 같은 Network 네임스페이스에서 공유된 것!

하나의 Pod, 하나의 IP, 하나의 Netns

Kubernetes는 Pod을 "네트워크 관점에서 하나의 호스트"로 취급합니다.

그래서 Pod 내 모든 컨테이너는 pause 컨테이너가 만든 network namespace (netns) 를 공유합니다.
그 안에서 nginx가 포트를 열면 busybox도 그 namespace 안에서 접근할 수 있는 것입니다.

Pause Container 검증

그럼 정말로 Pause Container라는 것이 작동했는지 확인해보려고 합니다.

Network 네임스페이스 검증

Pause Container로 인하여, Pod 내부의 두 컨테이너가 동일한 Network 네임스페이스를 가지고 있는지 확인합니다.

  1. 각 컨테이너 PID 식별
sudo crictl ps -a | grep tools #tools Container ID 확인
sudo crictl inspect 95069ea802725 | grep pid #PID 확인
  1. Nginx 컨테이너도 동일하게 PID 확인
  2. 각 컨테이너 Network 네임스페이스 확인

--> 4026으로 시작하는 네임스페이스 확인됨

컨테이너의 포트가 중복된다면?

하나만 생성되거나, 둘 다 정상적으로 생성되지 않습니다.

Share This Post

Check out these related posts

개발팀의 애자일 도입 이야기2

개발팀의 애자일 도입 이야기 1

Lambda@Edge 고급 로깅 제어 기능