본문 바로가기
스터디 이야기/Kubernetes Advanced Networking Study

[KANS] Pod - pause container

by lakescript 2024. 9. 5.
더보기

이 스터디는 CloudNet@에서 진행하는 KANS 스터디를 참여하면서 공부하는 내용을 기록하는 블로그 포스팅입니다.

CloudNet@에서 제공해주는 자료들을 바탕으로 작성되었습니다.

 

Pod

pod란?

https://kubernetes.io/docs/concepts/workloads/pods/

 

Pods

Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run t

kubernetes.io

Pod는 Kubernetes에서 배포되는 애플리케이션의 기본 단위이며, 1개 이상의 컨테이너로 구성될 수 있습니다.

 

Pod의 특징

생명주기

Pod 는 1개 이상의 컨테이너(sidecar 패턴등)를 가질 수 있으며, Pod 내에 실행되는 컨테이너들은 반드시 동일한 노드에 할당되고 동일한 생명 주기를 갖습니다. 즉, Pod 삭제 시 Pod 내 모든 컨테이너가 삭제됩니다.

 

Pod IP

Pod는 Node의 IP와는 별개로 Cluster 내에서 접근 가능한 IP를 할당 받으며, CNI를 통해 다른 Node에 위치한 Pod 도 NAT 없이 Pod IP로 접근 가능합니다. 

 

IP 공유

Pod 내에 있는 컨테이너들은 서로의 IP를 공유하며, Container끼리는 localhost를 통해 서로 접근가능한데 port를 이용하여 구분합니다. 이때, pause container가 nerwork ns를 만들어주고, 내부의 container들은 해당 network ns를 공유합니다.

 

Volume 공유

Pod 안의 Container들은 모두 동일한 volume과 연결이 가능하여 파일 시스템을 기반으로 서로 파일을 주고받을 수 있습니다.

 

PodSandbox

Pod는 resource 제약이 있는 격리된 환경의 애플리케이션 container 그룹으로 구성되며 이 환경을 CRI에서 PodSandBox라고 하며, Pod를 시작하기 전에 kubelet은 RuntimeService.RunPodSandox를 호출하여 환경을 만들게 됩니다

 

Probe

kubelet은 RPC를 통해 container의 수명주기를 관리하고, Container 수명주기 hook과 probe 확인을 실행하며 Pod의 재시작 정책을 수행합니다.

 

실습

cluster 설치

Control Plane, Worker node 1대씩 클러스터 배포

cat <<EOT> kind-2node.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
EOT

 

kind create cluster --config kind-2node.yaml --name myk8s

 

실습에 유용한 tool 설치

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'

 

 

Cluster 및 Control Plane, Worker Node 배포 확인

kubectl cluster-info

 

kubectl get nodes -o wide

 

Pod 배포 및 격리 확인

test pod 배포

kubectl run nginx --image=nginx --restart=Never

 

worker node 접속

docker exec -it myk8s-worker bash

 

유닛 파일(Unit files) 확인

systemctl list-unit-files | grep 'enabled         enabled'

위의 명령어를 통해 systemd에서 사용 가능한 유닛 파일(Unit files) 목록을 확인합니다.

유닛 파일(Unit files)이란?
systemd는 유닛 파일을 통해 시스템의 서비스와 자원을 관리합니다. 유닛 파일은 특정 서비스나 시스템 리소스의 동작 방식을 정의한 파일입니다. 예를 들어, 서비스가 어떻게 시작되고, 재시작 정책은 어떻게 설정되며, 어떤 의존성을 가지는지 등을 기술합니다.

containerd와 kubelet을 확인하실 수 있습니다.

 

프로세스 트리 출력

pstree -aln

위 명령어를 통해 시스템의 프로세스를 명령어와 인수를 포함해 긴 출력 형식으로 PID 순서대로 표시합니다.

pause라는 container가 보여지는것을 확인하실 수 있습니다.

 

파드내에 pause 컨테이너를 통해 공유받은 네임스페이스 정보 확인

pstree -aclnpsS

 

조금 더 자세한 정보를 확인하기 위해 위의 명령어의 옵션을 더 추가하여 실행 중인 프로세스들의 전체 명령어와 인수, PID, 부모-자식 관계, 메모리 사용 순위 등을 포함하여 매우 상세한 프로세스 트리를 출력해보고 그 중 test pod의 값만 확인해보겠습니다.

pause,1237,ipc,mnt,net,pid,uts

 

즉, 위의 결과는 pause라는 이름의 컨테이너(프로세스 ID 1237)가 IPC, 마운트, 네트워크, 프로세스 ID, UTS 네임스페이스를 관리하고 있다는 의미입니다.

네임스페이스 확인

lsns -p 1

먼저 host(workernode)의 namespace를 살펴보겠습니다.

 

 

lsns -p 1237

test pod의 namespace를 살펴보겠습니다.

pause로부터 IPC, 마운트, 네트워크, 프로세스 ID, UTS 네임스페이스를 공유 받았다는 것을 확인할 수 있습니다.

 

container 상세를 통한 네임스페이스 확인

crictl ps

먼저 crictl ps 명령어를 통해 현재 실행중인 nginx container의 id를 확인합니다.

 

crictl inspect ecb6638ec4dd9 | jq

inspect 명령어를 통해 해당 container의 namespace를 살펴보겠습니다.

 

network namespace, ipc namespace, uts namespace 각각 /proc/1237의 ns를 공유받고 있습니다. 여기서 1237 process는 바로 pause container입니다. 

 

 

 

즉, Pause Container는 Pod가 생성될 때 가장 먼저 실행되며, 해당 Pod에 대한 네임스페이스(NET, MNT, UTS, 네트워크, PID 등)를 설정 및 유지하는 역할을 합니다. 이후 Pod 내의 다른 애플리케이션 컨테이너들은 이 네임스페이스를 공유하여 실행됩니다.