본문 바로가기
K8s/K8S Flannel CNI & PAUSE

Pod & PAUSE 컨테이너

by 식사법 2024. 9. 8.

Pod & PAUSE 컨테이너

  • Pod 는 쿠버네티스에서 애플리케이션을 실행하는 가장 작은 배포 단위입니다. 파드는 1개 이상의 컨테이너로 구성된 컨테이너의 집합이며, 컨테이너 간에 네트워크와 스토리지 리소스를 공유합니다.

1. Pod 와 PAUSE 컨테이너의 역할

  1. Pod
    • 파드는 하나 이상의 컨테이너를 포함하고 있으며, 동일한 네트워크 네임스페이스와 스토리지 볼륨을 공유하여 서로 간에 쉽게 통신할 수 있습니다. 예를 들어, 파드 내의 여러 컨테이너는 동일한 IP 주소를 공유하며, 동일한 네트워크 인터페이스를 사용해 서로 통신할 수 있습니다.
    • 파드의 역할은 애플리케이션의 기본 실행 단위를 정의하는 것으로, 쿠버네티스는 각 파드를 관리하고 스케줄링합니다. 파드는 보통 하나의 컨테이너로 구성되지만, 더 복잡한 애플리케이션의 경우, 여러 컨테이너를 파드에 배치할 수 있습니다.
  2. PAUSE 컨테이너
    • PAUSE 컨테이너는 파드 내에서 컨테이너 간의 네임스페이스(Network, IPC, UTS 등)를 생성하고 공유하는 매우 중요한 역할을 수행합니다. 실제로 PAUSE 컨테이너는 파드 내에서 네임스페이스를 유지하는 역할을 하기 때문에, 파드 내의 컨테이너들이 네트워크와 같은 리소스를 공유할 수 있습니다.
    • PAUSE 컨테이너는 파드 내 컨테이너들이 공유하는 네트워크, IPC, UTS 네임스페이스를 생성하고 유지합니다. 이를 통해 파드 내 컨테이너들은 같은 네트워크 환경에서 실행되며, 서로 간의 통신을 쉽게 할 수 있게 됩니다.
    • 리소스 공유: 파드 내 모든 컨테이너는 PAUSE 컨테이너가 설정한 네임스페이스 안에서 동작합니다. 즉, 동일한 IP 주소, 동일한 파일 시스템, 동일한 프로세스 네임스페이스 등을 공유합니다.

2. Multi-Node Kubernetes Cluster (Control-plane, Worker Nodes) with kube-ops-view 실습 환경 구성

  • kind를 사용하여 다중 노드 Kubernetes 클러스터(컨트롤 플레인 및 워커 노드 1대)를 배포하고, kube-ops-view를 설치하여 클러스터 상태를 시각적으로 확인할 수 있는 환경을 구축하여, 파드 배포 및 네임스페이스 격리를 확인하는 실습을 진행합니다.Multi-

1. 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
  • kind를 사용하여 컨트롤 플레인과 워커 노드 1대를 가진 클러스터를 생성하고, 외부에서 접근할 수 있도록 포트를 매핑합니다.
  • 클러스터 내 특정 서비스는 30000, 30001 포트를 통해 외부에서 접근 가능합니다.

 

2. 필수 도구 설치 및 노드 상태 확인

  • 클러스터 내 노드(컨트롤 플레인 및 워커 노드)에 필수 도구들을 설치하고, 각 노드의 상태와 네트워크 정보를 확인합니다.
# 툴 설치
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'

# 확인
kubectl get nodes -o wide
docker ps
docker port myk8s-worker
docker exec -it myk8s-control-plane ip -br -c -4 addr
docker exec -it myk8s-worker  ip -br -c -4 addr

image.png

 

image.png

 

image.png

 

image.png

 

3. kube-ops-view 설치 및 설정

# 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

# 설치 확인
kubectl get deploy,pod,svc,ep -n kube-system -l app.kubernetes.io/instance=kube-ops-view

# kube-ops-view 접속 URL 확인 (1.5 , 2 배율) : macOS 사용자
echo -e "KUBE-OPS-VIEW URL = http://localhost:30000/#scale=1.5"
echo -e "KUBE-OPS-VIEW URL = http://localhost:30000/#scale=2"

# kube-ops-view 접속 URL 확인 (1.5 , 2 배율) : Windows 사용자
echo -e "KUBE-OPS-VIEW URL = http://192.168.50.10:30000/#scale=1.5"
echo -e "KUBE-OPS-VIEW URL = http://192.168.50.10:30000/#scale=2"

 

4. 워커 노드에서 시스템 상태 확인

docker exec -it myk8s-worker bash

# systemctl 확인
systemctl list-unit-files | grep 'enabled'

# kubelet 및 containerd 관련 설정 확인
pstree -aln

# 확인 : 파드내에 pause 컨테이너와 metrics-server 컨테이너, 네임스페이스 정보
pstree -aclnpsS
  • pstree를 통해 파드 내 컨테이너들의 상호 관계를 확인할 수 있습니다. pause 컨테이너가 네트워크와 네임스페이스를 관리하는 것을확인할 수 있습니다.

 

5. 신규 파드를 배포 후 Pause 컨테이너와 애플리케이션 컨테이너의 네임스페이스 격리 확인

# [터미널2] kubectl 명령 실행 및 확인

# Pod 생성 : YAML 파일에 컨테이너가 사용할 포트(TCP 80)을 설정
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

# [터미널1] myk8s-worker bash 진입 후 실행 및 확인
docker exec -it myk8s-worker bash
----------------------------------
crictl ps
pstree -aln
pstree -aclnpsS # 파드내에 pause 컨테이너와 app 컨테이너, 네임스페이스 정보

# 네임스페이스 확인 : lsns - List system namespaces
lsns -p 1
lsns -p $$
lsns -p <pstree -aclnpsS에서 출력된 pause 컨테이너 PID> 
lsns -p $(pgrep nginx) # app 컨테이너(metrics-server)

----------------------------------

# [터미널2] kubectl 명령 실행 및 확인
kubectl delete pod myweb
  • lsns 명령어를 통해 각 컨테이너가 어떤 네임스페이스를 사용하는지 확인할 수 있습니다.

3. Multi-Container Pod: myweb2 파드에 대한 실습 및 네임스페이스 공유 확인

  • myweb2라는 파드를 생성하여 2개의 컨테이너가 포함된 파드가 어떻게 동작하는지 확인하고, 컨테이너 간의 네임스페이스 공유를 확인합니다.

1. myweb2 파드 생성

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
  • myweb2-nginx → Nginx 웹 서버를 제공하는 컨테이너입니다.
  • myweb2-netshoot → 계속해서 localhost로 curl 요청을 보내는 컨테이너입니다.
# [터미널1] 파드 생성
kubectl apply -f https://raw.githubusercontent.com/gasida/NDKS/main/3/myweb2.yaml

# 확인
# pod 정보 READY 에 2/2 를 확인 : pod 내 모든 컨테이너가 정상이여야지 status 가 Running 가 됨
kubectl get pod -owide

# Pod 상세 정보에 컨테이너 2개 정보가 보인다
kubectl describe pod myweb2
  • kubectl get pod 결과에서 READY 상태가 2/2로 표시되는 것을 확인할 수 있습니다. 이는 파드 내 두 개의 컨테이너가 정상적으로 실행 중임을 의미합니다

 

2. 네임스페이스 공유 확인

docker exec -it myk8s-worker bash

# 각각의 컨테이너 PID 저장
NGINXPID=$(ps -ef | grep 'nginx -g' | grep -v grep | awk '{print $2}')
NETSHPID=$(ps -ef | grep 'curl' | grep -v grep | awk '{print $2}')

# Nginx 컨테이너 네임스페이스 정보 확인
lsns -p $NGINXPID

# Netshoot 컨테이너 네임스페이스 정보 확인
lsns -p $NETSHPID

  • net, ipc, uts 네임스페이스가 두 컨테이너에서 동일하게 pause 컨테이너를 통해 관리되는 것을 확인할 수 있습니다.
  • 반면, mnt와 pid는 각각의 컨테이너마다 별도로 관리됩니다.

3. pause 컨테이너 네임스페이스 확인

PAUSEPID=<pause 컨테이너 PID>
lsns -p $PAUSEPID
  • net, ipc, uts 네임스페이스는 pause 컨테이너에서 생성되며, 두 애플리케이션 컨테이너가 이 네임스페이스를 공유합니다.

4. 네트워크 네임스페이스 IP 확인

nsenter -t $PAUSEPID -n ip -c addr
nsenter -t $NGINXPID -n ip -c addr
nsenter -t $NETSHPID -n ip -c addr

  • 이를 통해 각 컨테이너의 네트워크 인터페이스가 동일한 것을 확인할 수 있습니다.

5. 컨테이너와 파드 정보 비교

crictl ps
crictl inspect <myweb2-nginx 컨테이너 ID> | jq
crictl inspect <myweb2-netshoot 컨테이너 ID> | jq

crictl ps
crictl inspect dff3fcb2dbc9f| jq
crictl inspect 51d94f347c137 | jq
  • nginx
더보기
{
  "status": {
    "id": "dff3fcb2dbc9f584e72710954aa96af1a2e4cf17ccda3df2b1d53f2765381f2e",
    "metadata": {
      "attempt": 0,
      "name": "myweb2-nginx"
    },
    "state": "CONTAINER_RUNNING",
    "createdAt": "2024-09-05T13:35:22.135238209Z",
    "startedAt": "2024-09-05T13:35:22.216892334Z",
    "finishedAt": "0001-01-01T00:00:00Z",
    "exitCode": 0,
    "image": {
      "annotations": {},
      "image": "docker.io/library/nginx:latest",
      "runtimeHandler": "",
      "userSpecifiedImage": ""
    },
    "imageRef": "docker.io/library/nginx@sha256:01b9ff8541cd3f5503a081844cbcaa1faac6a74fb41328061ea1917d0b513533",
    "reason": "",
    "message": "",
    "labels": {
      "io.kubernetes.container.name": "myweb2-nginx",
      "io.kubernetes.pod.name": "myweb2",
      "io.kubernetes.pod.namespace": "default",
      "io.kubernetes.pod.uid": "150a18bc-138d-4a68-a9f0-09f9fbcbd6f3"
    },
    "annotations": {
      "io.kubernetes.container.hash": "705d8a90",
      "io.kubernetes.container.ports": "[{\"containerPort\":80,\"protocol\":\"TCP\"}]",
      "io.kubernetes.container.restartCount": "0",
      "io.kubernetes.container.terminationMessagePath": "/dev/termination-log",
      "io.kubernetes.container.terminationMessagePolicy": "File",
      "io.kubernetes.pod.terminationGracePeriod": "0"
    },
    "mounts": [
      {
        "containerPath": "/var/run/secrets/kubernetes.io/serviceaccount",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/volumes/kubernetes.io~projected/kube-api-access-r5qrc",
        "propagation": "PROPAGATION_PRIVATE",
        "readonly": true,
        "recursiveReadOnly": false,
        "selinuxRelabel": false,
        "uidMappings": []
      },
      {
        "containerPath": "/etc/hosts",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/etc-hosts",
        "propagation": "PROPAGATION_PRIVATE",
        "readonly": false,
        "recursiveReadOnly": false,
        "selinuxRelabel": false,
        "uidMappings": []
      },
      {
        "containerPath": "/dev/termination-log",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/containers/myweb2-nginx/8640e38d",
        "propagation": "PROPAGATION_PRIVATE",
        "readonly": false,
        "recursiveReadOnly": false,
        "selinuxRelabel": false,
        "uidMappings": []
      }
    ],
    "logPath": "/var/log/pods/default_myweb2_150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/myweb2-nginx/0.log",
    "resources": {
      "linux": {
        "cpuPeriod": "100000",
        "cpuQuota": "0",
        "cpuShares": "2",
        "cpusetCpus": "",
        "cpusetMems": "",
        "hugepageLimits": [],
        "memoryLimitInBytes": "0",
        "memorySwapLimitInBytes": "0",
        "oomScoreAdj": "1000",
        "unified": {
          "memory.oom.group": "1",
          "memory.swap.max": "0"
        }
      },
      "windows": null
    },
    "imageId": ""
  },
  "info": {
    "sandboxID": "9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc",
    "pid": 1757,
    "removing": false,
    "snapshotKey": "dff3fcb2dbc9f584e72710954aa96af1a2e4cf17ccda3df2b1d53f2765381f2e",
    "snapshotter": "overlayfs",
    "runtimeType": "io.containerd.runc.v2",
    "runtimeOptions": {
      "systemd_cgroup": true
    },
    "config": {
      "metadata": {
        "name": "myweb2-nginx"
      },
      "image": {
        "image": "sha256:a9dfdba8b719078c5705fdecd6f8315765cc79e473111aa9451551ddc340b2bc"
      },
      "envs": [
        {
          "key": "KUBERNETES_PORT_443_TCP",
          "value": "tcp://10.96.0.1:443"
        },
        {
          "key": "KUBERNETES_PORT_443_TCP_PROTO",
          "value": "tcp"
        },
        {
          "key": "KUBERNETES_PORT_443_TCP_PORT",
          "value": "443"
        },
        {
          "key": "KUBERNETES_PORT_443_TCP_ADDR",
          "value": "10.96.0.1"
        },
        {
          "key": "KUBERNETES_SERVICE_HOST",
          "value": "10.96.0.1"
        },
        {
          "key": "KUBERNETES_SERVICE_PORT",
          "value": "443"
        },
        {
          "key": "KUBERNETES_SERVICE_PORT_HTTPS",
          "value": "443"
        },
        {
          "key": "KUBERNETES_PORT",
          "value": "tcp://10.96.0.1:443"
        }
      ],
      "mounts": [
        {
          "container_path": "/var/run/secrets/kubernetes.io/serviceaccount",
          "host_path": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/volumes/kubernetes.io~projected/kube-api-access-r5qrc",
          "readonly": true
        },
        {
          "container_path": "/etc/hosts",
          "host_path": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/etc-hosts"
        },
        {
          "container_path": "/dev/termination-log",
          "host_path": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/containers/myweb2-nginx/8640e38d"
        }
      ],
      "labels": {
        "io.kubernetes.container.name": "myweb2-nginx",
        "io.kubernetes.pod.name": "myweb2",
        "io.kubernetes.pod.namespace": "default",
        "io.kubernetes.pod.uid": "150a18bc-138d-4a68-a9f0-09f9fbcbd6f3"
      },
      "annotations": {
        "io.kubernetes.container.hash": "705d8a90",
        "io.kubernetes.container.ports": "[{\"containerPort\":80,\"protocol\":\"TCP\"}]",
        "io.kubernetes.container.restartCount": "0",
        "io.kubernetes.container.terminationMessagePath": "/dev/termination-log",
        "io.kubernetes.container.terminationMessagePolicy": "File",
        "io.kubernetes.pod.terminationGracePeriod": "0"
      },
      "log_path": "myweb2-nginx/0.log",
      "linux": {
        "resources": {
          "cpu_period": 100000,
          "cpu_shares": 2,
          "oom_score_adj": 1000,
          "hugepage_limits": [
            {
              "page_size": "2MB"
            },
            {
              "page_size": "32MB"
            },
            {
              "page_size": "64KB"
            },
            {
              "page_size": "1GB"
            }
          ],
          "unified": {
            "memory.oom.group": "1",
            "memory.swap.max": "0"
          }
        },
        "security_context": {
          "namespace_options": {
            "pid": 1
          },
          "run_as_user": {},
          "masked_paths": [
            "/proc/asound",
            "/proc/acpi",
            "/proc/kcore",
            "/proc/keys",
            "/proc/latency_stats",
            "/proc/timer_list",
            "/proc/timer_stats",
            "/proc/sched_debug",
            "/proc/scsi",
            "/sys/firmware",
            "/sys/devices/virtual/powercap"
          ],
          "readonly_paths": [
            "/proc/bus",
            "/proc/fs",
            "/proc/irq",
            "/proc/sys",
            "/proc/sysrq-trigger"
          ],
          "seccomp": {
            "profile_type": 1
          }
        }
      }
    },
    "runtimeSpec": {
      "ociVersion": "1.1.0",
      "process": {
        "user": {
          "uid": 0,
          "gid": 0,
          "additionalGids": [
            0
          ]
        },
        "args": [
          "/docker-entrypoint.sh",
          "nginx",
          "-g",
          "daemon off;"
        ],
        "env": [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
          "HOSTNAME=myweb2",
          "NGINX_VERSION=1.27.1",
          "NJS_VERSION=0.8.5",
          "NJS_RELEASE=1~bookworm",
          "PKG_RELEASE=1~bookworm",
          "DYNPKG_RELEASE=2~bookworm",
          "KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443",
          "KUBERNETES_PORT_443_TCP_PROTO=tcp",
          "KUBERNETES_PORT_443_TCP_PORT=443",
          "KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1",
          "KUBERNETES_SERVICE_HOST=10.96.0.1",
          "KUBERNETES_SERVICE_PORT=443",
          "KUBERNETES_SERVICE_PORT_HTTPS=443",
          "KUBERNETES_PORT=tcp://10.96.0.1:443"
        ],
        "cwd": "/",
        "capabilities": {
          "bounding": [
            "CAP_CHOWN",
            "CAP_DAC_OVERRIDE",
            "CAP_FSETID",
            "CAP_FOWNER",
            "CAP_MKNOD",
            "CAP_NET_RAW",
            "CAP_SETGID",
            "CAP_SETUID",
            "CAP_SETFCAP",
            "CAP_SETPCAP",
            "CAP_NET_BIND_SERVICE",
            "CAP_SYS_CHROOT",
            "CAP_KILL",
            "CAP_AUDIT_WRITE"
          ],
          "effective": [
            "CAP_CHOWN",
            "CAP_DAC_OVERRIDE",
            "CAP_FSETID",
            "CAP_FOWNER",
            "CAP_MKNOD",
            "CAP_NET_RAW",
            "CAP_SETGID",
            "CAP_SETUID",
            "CAP_SETFCAP",
            "CAP_SETPCAP",
            "CAP_NET_BIND_SERVICE",
            "CAP_SYS_CHROOT",
            "CAP_KILL",
            "CAP_AUDIT_WRITE"
          ],
          "permitted": [
            "CAP_CHOWN",
            "CAP_DAC_OVERRIDE",
            "CAP_FSETID",
            "CAP_FOWNER",
            "CAP_MKNOD",
            "CAP_NET_RAW",
            "CAP_SETGID",
            "CAP_SETUID",
            "CAP_SETFCAP",
            "CAP_SETPCAP",
            "CAP_NET_BIND_SERVICE",
            "CAP_SYS_CHROOT",
            "CAP_KILL",
            "CAP_AUDIT_WRITE"
          ]
        },
        "oomScoreAdj": 1000
      },
      "root": {
        "path": "rootfs"
      },
      "mounts": [
        {
          "destination": "/proc",
          "type": "proc",
          "source": "proc",
          "options": [
            "nosuid",
            "noexec",
            "nodev"
          ]
        },
        {
          "destination": "/dev",
          "type": "tmpfs",
          "source": "tmpfs",
          "options": [
            "nosuid",
            "strictatime",
            "mode=755",
            "size=65536k"
          ]
        },
        {
          "destination": "/dev/pts",
          "type": "devpts",
          "source": "devpts",
          "options": [
            "nosuid",
            "noexec",
            "newinstance",
            "ptmxmode=0666",
            "mode=0620",
            "gid=5"
          ]
        },
        {
          "destination": "/dev/mqueue",
          "type": "mqueue",
          "source": "mqueue",
          "options": [
            "nosuid",
            "noexec",
            "nodev"
          ]
        },
        {
          "destination": "/sys",
          "type": "sysfs",
          "source": "sysfs",
          "options": [
            "nosuid",
            "noexec",
            "nodev",
            "ro"
          ]
        },
        {
          "destination": "/sys/fs/cgroup",
          "type": "cgroup",
          "source": "cgroup",
          "options": [
            "nosuid",
            "noexec",
            "nodev",
            "relatime",
            "ro"
          ]
        },
        {
          "destination": "/etc/hosts",
          "type": "bind",
          "source": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/etc-hosts",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/dev/termination-log",
          "type": "bind",
          "source": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/containers/myweb2-nginx/8640e38d",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/etc/hostname",
          "type": "bind",
          "source": "/var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc/hostname",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/etc/resolv.conf",
          "type": "bind",
          "source": "/var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc/resolv.conf",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/dev/shm",
          "type": "bind",
          "source": "/run/containerd/io.containerd.grpc.v1.cri/sandboxes/9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc/shm",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/var/run/secrets/kubernetes.io/serviceaccount",
          "type": "bind",
          "source": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/volumes/kubernetes.io~projected/kube-api-access-r5qrc",
          "options": [
            "rbind",
            "rprivate",
            "ro"
          ]
        }
      ],
      "hooks": {
        "createContainer": [
          {
            "path": "/kind/bin/mount-product-files.sh"
          }
        ]
      },
      "annotations": {
        "io.kubernetes.cri.container-name": "myweb2-nginx",
        "io.kubernetes.cri.container-type": "container",
        "io.kubernetes.cri.image-name": "docker.io/library/nginx:latest",
        "io.kubernetes.cri.sandbox-id": "9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc",
        "io.kubernetes.cri.sandbox-name": "myweb2",
        "io.kubernetes.cri.sandbox-namespace": "default",
        "io.kubernetes.cri.sandbox-uid": "150a18bc-138d-4a68-a9f0-09f9fbcbd6f3"
      },
      "linux": {
        "resources": {
          "devices": [
            {
              "allow": false,
              "access": "rwm"
            }
          ],
          "memory": {},
          "cpu": {
            "shares": 2,
            "period": 100000
          },
          "unified": {
            "memory.oom.group": "1",
            "memory.swap.max": "0"
          }
        },
        "cgroupsPath": "kubelet-kubepods-besteffort-pod150a18bc_138d_4a68_a9f0_09f9fbcbd6f3.slice:cri-containerd:dff3fcb2dbc9f584e72710954aa96af1a2e4cf17ccda3df2b1d53f2765381f2e",
        "namespaces": [
          {
            "type": "pid"
          },
          {
            "type": "ipc",
            "path": "/proc/1695/ns/ipc"
          },
          {
            "type": "uts",
            "path": "/proc/1695/ns/uts"
          },
          {
            "type": "mount"
          },
          {
            "type": "network",
            "path": "/proc/1695/ns/net"
          },
          {
            "type": "cgroup"
          }
        ],
        "maskedPaths": [
          "/proc/asound",
          "/proc/acpi",
          "/proc/kcore",
          "/proc/keys",
          "/proc/latency_stats",
          "/proc/timer_list",
          "/proc/timer_stats",
          "/proc/sched_debug",
          "/proc/scsi",
          "/sys/firmware",
          "/sys/devices/virtual/powercap"
        ],
        "readonlyPaths": [
          "/proc/bus",
          "/proc/fs",
          "/proc/irq",
          "/proc/sys",
          "/proc/sysrq-trigger"
        ]
      }
    }
  }
}
  • netshoot
더보기
{
  "status": {
    "id": "51d94f347c1373736bf84dbe7cf05074cf2ae1f58431041a607621d04fe228a3",
    "metadata": {
      "attempt": 0,
      "name": "myweb2-netshoot"
    },
    "state": "CONTAINER_RUNNING",
    "createdAt": "2024-09-05T13:35:42.042022344Z",
    "startedAt": "2024-09-05T13:35:42.113837552Z",
    "finishedAt": "0001-01-01T00:00:00Z",
    "exitCode": 0,
    "image": {
      "annotations": {},
      "image": "docker.io/nicolaka/netshoot:latest",
      "runtimeHandler": "",
      "userSpecifiedImage": ""
    },
    "imageRef": "docker.io/nicolaka/netshoot@sha256:a20c2531bf35436ed3766cd6cfe89d352b050ccc4d7005ce6400adf97503da1b",
    "reason": "",
    "message": "",
    "labels": {
      "io.kubernetes.container.name": "myweb2-netshoot",
      "io.kubernetes.pod.name": "myweb2",
      "io.kubernetes.pod.namespace": "default",
      "io.kubernetes.pod.uid": "150a18bc-138d-4a68-a9f0-09f9fbcbd6f3"
    },
    "annotations": {
      "io.kubernetes.container.hash": "60cc9929",
      "io.kubernetes.container.restartCount": "0",
      "io.kubernetes.container.terminationMessagePath": "/dev/termination-log",
      "io.kubernetes.container.terminationMessagePolicy": "File",
      "io.kubernetes.pod.terminationGracePeriod": "0"
    },
    "mounts": [
      {
        "containerPath": "/var/run/secrets/kubernetes.io/serviceaccount",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/volumes/kubernetes.io~projected/kube-api-access-r5qrc",
        "propagation": "PROPAGATION_PRIVATE",
        "readonly": true,
        "recursiveReadOnly": false,
        "selinuxRelabel": false,
        "uidMappings": []
      },
      {
        "containerPath": "/etc/hosts",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/etc-hosts",
        "propagation": "PROPAGATION_PRIVATE",
        "readonly": false,
        "recursiveReadOnly": false,
        "selinuxRelabel": false,
        "uidMappings": []
      },
      {
        "containerPath": "/dev/termination-log",
        "gidMappings": [],
        "hostPath": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/containers/myweb2-netshoot/59267ec4",
        "propagation": "PROPAGATION_PRIVATE",
        "readonly": false,
        "recursiveReadOnly": false,
        "selinuxRelabel": false,
        "uidMappings": []
      }
    ],
    "logPath": "/var/log/pods/default_myweb2_150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/myweb2-netshoot/0.log",
    "resources": {
      "linux": {
        "cpuPeriod": "100000",
        "cpuQuota": "0",
        "cpuShares": "2",
        "cpusetCpus": "",
        "cpusetMems": "",
        "hugepageLimits": [],
        "memoryLimitInBytes": "0",
        "memorySwapLimitInBytes": "0",
        "oomScoreAdj": "1000",
        "unified": {
          "memory.oom.group": "1",
          "memory.swap.max": "0"
        }
      },
      "windows": null
    },
    "imageId": ""
  },
  "info": {
    "sandboxID": "9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc",
    "pid": 1890,
    "removing": false,
    "snapshotKey": "51d94f347c1373736bf84dbe7cf05074cf2ae1f58431041a607621d04fe228a3",
    "snapshotter": "overlayfs",
    "runtimeType": "io.containerd.runc.v2",
    "runtimeOptions": {
      "systemd_cgroup": true
    },
    "config": {
      "metadata": {
        "name": "myweb2-netshoot"
      },
      "image": {
        "image": "sha256:e286c635d1232a8b27513f3027b5dab9cdbfbe72d531fad1bb89a69ab4dc37fe"
      },
      "command": [
        "/bin/bash"
      ],
      "args": [
        "-c",
        "while true; do sleep 5; curl localhost; done"
      ],
      "envs": [
        {
          "key": "KUBERNETES_PORT_443_TCP_PROTO",
          "value": "tcp"
        },
        {
          "key": "KUBERNETES_PORT_443_TCP_PORT",
          "value": "443"
        },
        {
          "key": "KUBERNETES_PORT_443_TCP_ADDR",
          "value": "10.96.0.1"
        },
        {
          "key": "KUBERNETES_SERVICE_HOST",
          "value": "10.96.0.1"
        },
        {
          "key": "KUBERNETES_SERVICE_PORT",
          "value": "443"
        },
        {
          "key": "KUBERNETES_SERVICE_PORT_HTTPS",
          "value": "443"
        },
        {
          "key": "KUBERNETES_PORT",
          "value": "tcp://10.96.0.1:443"
        },
        {
          "key": "KUBERNETES_PORT_443_TCP",
          "value": "tcp://10.96.0.1:443"
        }
      ],
      "mounts": [
        {
          "container_path": "/var/run/secrets/kubernetes.io/serviceaccount",
          "host_path": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/volumes/kubernetes.io~projected/kube-api-access-r5qrc",
          "readonly": true
        },
        {
          "container_path": "/etc/hosts",
          "host_path": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/etc-hosts"
        },
        {
          "container_path": "/dev/termination-log",
          "host_path": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/containers/myweb2-netshoot/59267ec4"
        }
      ],
      "labels": {
        "io.kubernetes.container.name": "myweb2-netshoot",
        "io.kubernetes.pod.name": "myweb2",
        "io.kubernetes.pod.namespace": "default",
        "io.kubernetes.pod.uid": "150a18bc-138d-4a68-a9f0-09f9fbcbd6f3"
      },
      "annotations": {
        "io.kubernetes.container.hash": "60cc9929",
        "io.kubernetes.container.restartCount": "0",
        "io.kubernetes.container.terminationMessagePath": "/dev/termination-log",
        "io.kubernetes.container.terminationMessagePolicy": "File",
        "io.kubernetes.pod.terminationGracePeriod": "0"
      },
      "log_path": "myweb2-netshoot/0.log",
      "linux": {
        "resources": {
          "cpu_period": 100000,
          "cpu_shares": 2,
          "oom_score_adj": 1000,
          "hugepage_limits": [
            {
              "page_size": "2MB"
            },
            {
              "page_size": "32MB"
            },
            {
              "page_size": "64KB"
            },
            {
              "page_size": "1GB"
            }
          ],
          "unified": {
            "memory.oom.group": "1",
            "memory.swap.max": "0"
          }
        },
        "security_context": {
          "namespace_options": {
            "pid": 1
          },
          "run_as_username": "root",
          "masked_paths": [
            "/proc/asound",
            "/proc/acpi",
            "/proc/kcore",
            "/proc/keys",
            "/proc/latency_stats",
            "/proc/timer_list",
            "/proc/timer_stats",
            "/proc/sched_debug",
            "/proc/scsi",
            "/sys/firmware",
            "/sys/devices/virtual/powercap"
          ],
          "readonly_paths": [
            "/proc/bus",
            "/proc/fs",
            "/proc/irq",
            "/proc/sys",
            "/proc/sysrq-trigger"
          ],
          "seccomp": {
            "profile_type": 1
          }
        }
      }
    },
    "runtimeSpec": {
      "ociVersion": "1.1.0",
      "process": {
        "user": {
          "uid": 0,
          "gid": 0,
          "additionalGids": [
            0,
            1,
            2,
            3,
            4,
            6,
            10,
            11,
            20,
            26,
            27
          ]
        },
        "args": [
          "/bin/bash",
          "-c",
          "while true; do sleep 5; curl localhost; done"
        ],
        "env": [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
          "HOSTNAME=netshoot",
          "KUBERNETES_PORT_443_TCP_PROTO=tcp",
          "KUBERNETES_PORT_443_TCP_PORT=443",
          "KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1",
          "KUBERNETES_SERVICE_HOST=10.96.0.1",
          "KUBERNETES_SERVICE_PORT=443",
          "KUBERNETES_SERVICE_PORT_HTTPS=443",
          "KUBERNETES_PORT=tcp://10.96.0.1:443",
          "KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443"
        ],
        "cwd": "/root",
        "capabilities": {
          "bounding": [
            "CAP_CHOWN",
            "CAP_DAC_OVERRIDE",
            "CAP_FSETID",
            "CAP_FOWNER",
            "CAP_MKNOD",
            "CAP_NET_RAW",
            "CAP_SETGID",
            "CAP_SETUID",
            "CAP_SETFCAP",
            "CAP_SETPCAP",
            "CAP_NET_BIND_SERVICE",
            "CAP_SYS_CHROOT",
            "CAP_KILL",
            "CAP_AUDIT_WRITE"
          ],
          "effective": [
            "CAP_CHOWN",
            "CAP_DAC_OVERRIDE",
            "CAP_FSETID",
            "CAP_FOWNER",
            "CAP_MKNOD",
            "CAP_NET_RAW",
            "CAP_SETGID",
            "CAP_SETUID",
            "CAP_SETFCAP",
            "CAP_SETPCAP",
            "CAP_NET_BIND_SERVICE",
            "CAP_SYS_CHROOT",
            "CAP_KILL",
            "CAP_AUDIT_WRITE"
          ],
          "permitted": [
            "CAP_CHOWN",
            "CAP_DAC_OVERRIDE",
            "CAP_FSETID",
            "CAP_FOWNER",
            "CAP_MKNOD",
            "CAP_NET_RAW",
            "CAP_SETGID",
            "CAP_SETUID",
            "CAP_SETFCAP",
            "CAP_SETPCAP",
            "CAP_NET_BIND_SERVICE",
            "CAP_SYS_CHROOT",
            "CAP_KILL",
            "CAP_AUDIT_WRITE"
          ]
        },
        "oomScoreAdj": 1000
      },
      "root": {
        "path": "rootfs"
      },
      "mounts": [
        {
          "destination": "/proc",
          "type": "proc",
          "source": "proc",
          "options": [
            "nosuid",
            "noexec",
            "nodev"
          ]
        },
        {
          "destination": "/dev",
          "type": "tmpfs",
          "source": "tmpfs",
          "options": [
            "nosuid",
            "strictatime",
            "mode=755",
            "size=65536k"
          ]
        },
        {
          "destination": "/dev/pts",
          "type": "devpts",
          "source": "devpts",
          "options": [
            "nosuid",
            "noexec",
            "newinstance",
            "ptmxmode=0666",
            "mode=0620",
            "gid=5"
          ]
        },
        {
          "destination": "/dev/mqueue",
          "type": "mqueue",
          "source": "mqueue",
          "options": [
            "nosuid",
            "noexec",
            "nodev"
          ]
        },
        {
          "destination": "/sys",
          "type": "sysfs",
          "source": "sysfs",
          "options": [
            "nosuid",
            "noexec",
            "nodev",
            "ro"
          ]
        },
        {
          "destination": "/sys/fs/cgroup",
          "type": "cgroup",
          "source": "cgroup",
          "options": [
            "nosuid",
            "noexec",
            "nodev",
            "relatime",
            "ro"
          ]
        },
        {
          "destination": "/etc/hosts",
          "type": "bind",
          "source": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/etc-hosts",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/dev/termination-log",
          "type": "bind",
          "source": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/containers/myweb2-netshoot/59267ec4",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/etc/hostname",
          "type": "bind",
          "source": "/var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc/hostname",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/etc/resolv.conf",
          "type": "bind",
          "source": "/var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc/resolv.conf",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/dev/shm",
          "type": "bind",
          "source": "/run/containerd/io.containerd.grpc.v1.cri/sandboxes/9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc/shm",
          "options": [
            "rbind",
            "rprivate",
            "rw"
          ]
        },
        {
          "destination": "/var/run/secrets/kubernetes.io/serviceaccount",
          "type": "bind",
          "source": "/var/lib/kubelet/pods/150a18bc-138d-4a68-a9f0-09f9fbcbd6f3/volumes/kubernetes.io~projected/kube-api-access-r5qrc",
          "options": [
            "rbind",
            "rprivate",
            "ro"
          ]
        }
      ],
      "hooks": {
        "createContainer": [
          {
            "path": "/kind/bin/mount-product-files.sh"
          }
        ]
      },
      "annotations": {
        "io.kubernetes.cri.container-name": "myweb2-netshoot",
        "io.kubernetes.cri.container-type": "container",
        "io.kubernetes.cri.image-name": "docker.io/nicolaka/netshoot:latest",
        "io.kubernetes.cri.sandbox-id": "9ccff0d4c0a38e769d7f48a552deca4f87df41c31e6cfa641c58688108a2a8bc",
        "io.kubernetes.cri.sandbox-name": "myweb2",
        "io.kubernetes.cri.sandbox-namespace": "default",
        "io.kubernetes.cri.sandbox-uid": "150a18bc-138d-4a68-a9f0-09f9fbcbd6f3"
      },
      "linux": {
        "resources": {
          "devices": [
            {
              "allow": false,
              "access": "rwm"
            }
          ],
          "memory": {},
          "cpu": {
            "shares": 2,
            "period": 100000
          },
          "unified": {
            "memory.oom.group": "1",
            "memory.swap.max": "0"
          }
        },
        "cgroupsPath": "kubelet-kubepods-besteffort-pod150a18bc_138d_4a68_a9f0_09f9fbcbd6f3.slice:cri-containerd:51d94f347c1373736bf84dbe7cf05074cf2ae1f58431041a607621d04fe228a3",
        "namespaces": [
          {
            "type": "pid"
          },
          {
            "type": "ipc",
            "path": "/proc/1695/ns/ipc"
          },
          {
            "type": "uts",
            "path": "/proc/1695/ns/uts"
          },
          {
            "type": "mount"
          },
          {
            "type": "network",
            "path": "/proc/1695/ns/net"
          },
          {
            "type": "cgroup"
          }
        ],
        "maskedPaths": [
          "/proc/asound",
          "/proc/acpi",
          "/proc/kcore",
          "/proc/keys",
          "/proc/latency_stats",
          "/proc/timer_list",
          "/proc/timer_stats",
          "/proc/sched_debug",
          "/proc/scsi",
          "/sys/firmware",
          "/sys/devices/virtual/powercap"
        ],
        "readonlyPaths": [
          "/proc/bus",
          "/proc/fs",
          "/proc/irq",
          "/proc/sys",
          "/proc/sysrq-trigger"
        ]
      }
    }
  }
}

6. 정리

  • 네트워크, IPC, UTS 네임스페이스는 pause 컨테이너가 생성하고 유지하며, 이를 통해 파드 내의 모든 컨테이너가 동일한 네트워크와 IPC 리소스를 사용할 수 있다는 것을 확인했습니다.
  • mnt, pid, cgroup 네임스페이스는 각 컨테이너마다 독립적으로 관리되었습니다. 즉, 파일 시스템(mnt)과 프로세스(pid)는 각 컨테이너가 개별적으로 관리하게 되며, 다른 컨테이너와 공유되지 않았습니다.
  • 실습 과정에서 pause 컨테이너는 파드 내에서 네트워크, IPC, UTS 네임스페이스를 생성 및 유지하는 중요한 역할을 한다는 것을 확인했습니다. pause 컨테이너는 파드 내의 모든 컨테이너가 공유할 수 있는 네임스페이스를 생성하여, 파드 내의 컨테이너들이 서로 통신할 수 있는 환경을 제공합니다.
  • pause 컨테이너는 파드 내의 네임스페이스 관리의 핵심이라는 점을 확인했습니다. pause 컨테이너가 없으면, 각각의 컨테이너가 독립적인 네트워크 환경을 가지게 되어 서로 통신할 수 없게 됩니다.
  • pause 컨테이너 덕분에 파드 내의 애플리케이션 컨테이너들이 네트워크 자원, IPC, UTS 리소스를 공유할 수 있으며, 이를 통해 효율적인 자원 관리가 가능합니다.

'K8s > K8S Flannel CNI & PAUSE' 카테고리의 다른 글

Flannel CNI  (0) 2024.09.08
Kind 소개 및 설치  (0) 2024.09.08