새소식

Kubernetes

[Study 2주차] 쿠버네티스 Pause 컨테이너

  • -

CloudNet@ 팀의 가시다님께서 리딩하시는 KANS Study (Kubernetes Advanced Networking Study) 2주차 스터디 내용 정리

 

 

이 글에서는 쿠버네티스 파드가 배포될 때, 'Network / IPC / UTS 네임스페이스' 를 생성하고 공유하는 기능을 하는 Pause 컨테이너에 대해서 알아보겠습니다.

 

 

1. Pause 컨테이너

 

Pause 컨테이너는 파드가 가동될 때 다른 컨테이너를 위해 Network, Volume Mount 등의 상태를 세팅해주는 역할을 합니다.

 

 

Pause 컨테이너는 모든 컨테이너들의 부모 컨테이너 역할을 하며, 그 어떤 다른 컨테이너보다 먼저 생성되어 동작합니다.
가장 먼저 생성되어 Network / IPC / UTS 등의 네임스페이스를 생성한 후 다른 작업은 하지 않습니다.

 

 

1.1. Pause 컨테이너 역할

 

  1. Linux Namespace 생성 후 공유

Network, IPC, UTS 등의 네임스페이스를 파드 내 모든 컨테이너와 함께 공유합니다.

이를 통해서 파드 내부 컨테이너는 상호 통신이 가능하며 IP 를 함께 사용할 수 있습니다.

 

  1. 좀비 프로세스 제거

하나의 파드 내부에 여러개의 컨테이너가 가동될 경우 발생할 수 있는 좀비 프로세스 문제를 해결합니다.



 

1.2. Pause 컨테이너 확인

 

Pause 컨테이너는 외부에서는 확인할 수 있는 방법이 없습니다.
하지만, 노드 안에서 가동되고 있는 프로세스를 확인하면 Pause 컨테이너가 다른 컨테이너와 함께 동작하고 있는 것을 확인할 수 있습니다.

 

확인하기 위해서, kind 를 사용하여 멀티노드 클러스터를 생성해줍니다.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
kind create cluster --config kind-2node.yaml --name myk8s

 

kind 클러스터 배포 후 내부 프로세스 확인을 위해 node 에 유틸리티를 설치해줍니다.

docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree jq psmisc lsof wget bridge-utils tcpdump htop git nano -y'
docker exec -it myk8s-worker        sh -c 'apt update && apt install tree jq psmisc lsof wget bridge-utils tcpdump htop -y'

# 기타 컨테이너 배포
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=30000 --set env.TZ="Asia/Seoul" --namespace kube-system

 

이후 노드에 들어가서 프로세스를 확인해봅니다.

docker exec -it myk8s-worker bash

# Process Tree 구조 확인
pstree -aln

 

노드에 배포되어 있는 파드에 pause 컨테이너가 함께 배포되어 있는 것을 확인할 수 있습니다.



Pause 컨테이너 네임스페이스 상태 확인

 

실제로 Pause 컨테이너가 네임스페이스를 공유하고 있는 지 확인해보겠습니다.

 

# pstree 와 네임스페이스 정보 확인
pstree -aclnpsS

# 각 PID 별 네임스페이스 확인
lsns -p 1    # PID 1 (Root)
lsns -p 1239 # Pause 컨테이너 PID
lsns -p 1308 # kube-ops-view 컨테이너 PID

 



1.3. 컨테이너가 복수개인 파드의 동작 확인

 

이번에는 컨테이너가 1개가 아닌, 2개인 파드를 배포하고 내부 동작을 확인해보겠습니다.

 

apiVersion: v1
kind: Pod
metadata:
  name: myweb2
spec:
  containers:
  - name: myweb2-nginx
    image: nginx
    ports:
    - containerPort: 80
      protocol: TCP

  - name: myweb2-netshoot
    image: nicolaka/netshoot
    command: ["/bin/bash"]
    args: ["-c", "while true; do sleep 5; curl localhost; done"] # 포드가 종료되지 않도록 유지합니다

  terminationGracePeriodSeconds: 0

 

kubectl describe pod myweb2

 

 

컨테이너는 2개지만 IP 는 하나를 가집니다.
또한, Pause 컨테이너는 보이지 않습니다.

실제로 IP 를 공유하고 있는 지 확인해보겠습니다.

 

# Nginx Network 확인을 위한 도구 설치
kubectl exec myweb2 -c myweb2-nginx -- apt update
kubectl exec myweb2 -c myweb2-nginx -- apt install -y net-tools

# IP 확인
kubectl exec myweb2 -c myweb2-netshoot -- ifconfig
kubectl exec myweb2 -c myweb2-nginx -- ifconfig

 

 

Netshoot 파드 접근
kubectl exec myweb2 -c myweb2-netshoot -it -- zsh

curl localhost
ps -ef

 

 

Netshoot 파드에서 Nginx 에 대한 응답은 오지만, 실제로 프로세스가 동작하고 있지는 않습니다.
그 이유를 확인해보겠습니다.

 

# 파드가 동작하고 있는 노드로 접근
docker exec -it myk8s-worker bash

# Nginx 컨테이너 PID 확인
NGINXPID=$(ps -ef | grep 'nginx -g' | grep -v grep | awk '{print $2}')
echo $NGINXPID

# Netshoot 컨테이너 PID 확인
NETSHPID=$(ps -ef | grep 'curl' | grep -v grep | awk '{print $2}')
echo $NETSHPID

# 각 컨테이너의 네임스페이스 확인
lsns -p $NGINXPID
lsns -p $NETSHPID

 

 

실습이 완료되었다면 kind 클러스터를 삭제해줍니다.

kind delete cluster --name myk8s
Contents

포스팅 주소를 복사했습니다