Pause Container

Uk·2024년 9월 7일
0

Intro

CloudNet@ - KANS 3기 2주차 스터디

Pod

쿠버네티스에서 관리되는 가장 작은 단위를 Pod 라고 합니다.
Pod는 1개 이상의 컨테이너로 구성된 컨테이너의 집합입니다.

Pod가 생성될 때 가장 먼저 생성 되는 컨테이너가 있는데 이게 바로 Pause Container 입니다.

  • Pod 내 모든 컨테이너들의 부모 역할로서 다음 네임스페이스를 공유합니다.
    • Network
    • IPC
    • UTS

이 말은 즉슨, 같은 파드 내에서 확인 해봤을 때 다른 컨테이너의 네트워크 환경을 볼 수 있고 pid나 mnt의 경우 확인해볼 수 없다는 것입니다!

실습을 통해 알아보도록 하겠습니다.

실습

실습 환경 구축 - kind / kube-ops-view

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

# 툴 설치
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'

# kube-ops-view
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

위와 같이 클러스터 및 ops-view 실행

kube-ops-view 접속 URL 확인

echo -e "KUBE-OPS-VIEW URL = http://localhost:30000/#scale=2"

Pod 격리 확인

# [터미널1] myk8s-worker bash 진입 후 실행 및 확인
docker exec -it myk8s-worker bash
systemctl list-unit-files | grep 'enabled         enabled'

# 확인 : kubelet에 --container-runtime-endpoint=unix:///run/containerd/containerd.sock
pstree -aln

# 확인 : 파드내에 pause 컨테이너와 metrics-server 컨테이너, 네임스페이스 정보
pstree -aclnpsS

lsns -p 1
lsns -p {pause container pid}
lsns -p {kube-ops-view pid}

time, user의 경우 기존 host 와 동일한 네임스페이스

app 컨테이너의 net / uts / ipc 경우 Pause 컨테이너가 부모!

mnt / pid / cgroup 은 앱 컨테이너 자체에서 생성하여 사용

  • 신규 파드 배포 후 확인
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: myweb
spec:
  containers:
  - image: nginx:alpine
    name: myweb-container
    ports:
    - containerPort: 80
      protocol: TCP
  terminationGracePeriodSeconds: 0
EOF
docker exec -it myk8s-worker bash

crictl ps
pstree -aln
pstree -aclnpsS # 파드내에 pause 컨테이너와 app 컨테이너, 네임스페이스 정보

lsns -p 1
lsns -p $$
lsns -p *<pstree -aclnpsS에서 출력된 pause 컨테이너 PID>* 
lsns -p $(pgrep nginx) # app 컨테이너(metrics-server)

확인 이후 kubectl delete pod myweb

  • myweb2.yaml
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
# 파드의 각각 컨테이너 IP 확인 >> IP가 같다
kubectl exec myweb2 -c myweb2-netshoot -- ip addr
kubectl exec myweb2 -c myweb2-nginx -- apt update
kubectl exec myweb2 -c myweb2-nginx -- apt install -y net-tools
kubectl exec myweb2 -c myweb2-nginx -- ifconfig

eth0 ip를 보면 pod ip와 동일함.

⇒ pause 컨테이너가 net 네임 스페이스를 만들고 두 컨테이너가 같이 쓰므로 동일하다.

# myweb2-netshoot 컨테이너 zsh 진입
kubectl exec myweb2 -c myweb2-netshoot -it -- zsh

ss -tnlp

myweb2-netshoot 컨테이너를 들어갔을 때 tcp 80 listen 상태

ps -ef 하더라도 nginx 프로세스 정보는 보이지 않음.

0개의 댓글