CloudNet@ - KANS 3기 2주차 스터디
쿠버네티스에서 관리되는 가장 작은 단위를 Pod 라고 합니다.
Pod는 1개 이상의 컨테이너로 구성된 컨테이너의 집합입니다.
Pod가 생성될 때 가장 먼저 생성 되는 컨테이너가 있는데 이게 바로 Pause Container 입니다.
이 말은 즉슨, 같은 파드 내에서 확인 해봤을 때 다른 컨테이너의 네트워크 환경을 볼 수 있고 pid나 mnt의 경우 확인해볼 수 없다는 것입니다!
실습을 통해 알아보도록 하겠습니다.
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"
# [터미널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
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 프로세스 정보는 보이지 않음.