Ssoon

[2주차] Pause Container 란 ? 본문

쿠버네티스 네트워크 스터디 3기

[2주차] Pause Container 란 ?

구구달스 2024. 9. 4. 00:47
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

  • Kubernetes에서 Pod를 생성할 때 가장 먼저 생성되는 컨테이너입니다.
  • 이 컨테이너는 실제로는 거의 아무 작업도 하지 않으며, 그저 "pause" 상태로 대기합니다.
  • pause라는 이름은 이 컨테이너가 아주 가벼운 컨테이너로, 단순히 잠시 멈춰 있는 상태를 의미합니다.

 컨테이너를 격리하는 데 사용되는 네임스페이스

  • ipc (Inter-Process Communication) 네임스페이스
    • 프로세스 간 통신을 격리하는 기능을 제공합니다.
    • 시스템의 다른 부분과 독립적으로 프로세스 간 통신을 관리할 수 있습니다.
  • pid (Process ID) 네임스페이스
    • 프로세스 ID(PID)를 격리하는 기능을 제공합니다.
    • 시스템의 다른 부분과 독립적으로 프로세스 ID를 관리할 수 있습니다.
  • uts  (Unix Time-sharing System) 네임스페이스
    • 시스템의 호스트네임과 도메인 네임을 격리하는 역할을 합니다.
    • 각 프로세스가 독립적인 호스트네임과 도메인 네임을 가질 수 있습니다.     
  • net  (Network 네임스페이스)
    • 네트워크 자원을 격리하는 기능입니다.
    • 각 프로세스가 독립적인 네트워크 환경을 가질 수 있습니다.
  • mnt  (Mount 네임스페이스)
    • 파일 시스템의 마운트 정보를 격리하는 기능입니다.
    • 각 프로세스가 서로 다른 마운트 정보를 볼 수 있게 되어, 독립적인 파일 시스템 환경을 제공합니다.
  • user 네임스페이스
    • 사용자와 그룹 ID를 격리하는 기능입니다.
    • 프로세스가 서로 다른 사용자 ID와 그룹 ID를 가질 수 있게 되어, 보안과 권한 관리를 보다 유연하게 할 수 있습니다.
  • cgroup (Control Group) 네임스페이스
    • 리소스 사용량(메모리, CPU 등)을 관리하고 격리합니다.
    • 각 컨테이너는 독립적인 cgroup을 가지며, 컨테이너의 리소스 사용량을 제한하고 모니터링할 수 있습니다.

Pause 컨테이너의 역할

  • Network 네임스페이스 공유
    • Pause 컨테이너는 Pod 내의 모든 컨테이너가 동일한 네트워크 네임스페이스를 공유하도록 합니다. 
    • Pod 내의 모든 컨테이너가 동일한 IP 주소를 사용하고, 서로 간에 네트워크 통신을 쉽게 할 수 있습니다.
  • IPC 네임스페이스 공유
    • IPC 네임스페이스를 공유함으로써, Pod 내의 컨테이너들이 세마포어, 메시지 큐, 공유 메모리 등을 통해 서로 통신할 수 있습니다.
  • UTS (Unix Time-sharing System) 네임스페이스 공유
    • Pause 컨테이너의 UTS 네임스페이스를 Pod 내의 다른 컨테이너들과 공유함으로써 모든 컨테이너가 동일한 호스트 이름을 가지게 됩니다.
  • PID 네임스페이스 공유
    • 선택적으로 공유할 수 있습니다.
    • Pod 내의 컨테이너들이 동일한 프로세스 ID 공간을 공유하게 되어, 프로세스 간의 상호작용이 가능해집니다
    • Pod의 Init 프로세스 역할을 수행하며, 좀비 프로세스를 정리합니다.
      • Init 프로세스는 Linux 및 Unix 시스템에서 가장 먼저 실행되는 프로세스입니다. 이 프로세스는 시스템이 부팅될 때 커널에 의해 시작되며, 모든 다른 프로세스의 부모 역할을 합니다. Init 프로세스의 PID는 항상 1입니다
      • 좀비 프로세스는 Linux 및 Unix 시스템에서 발생할 수 있는 특별한 상태의 프로세스입니다. 좀비 프로세스는 실제로 작업을 수행하지 않지만, 시스템 자원에서는 여전히 존재하는 프로세스를 의미합니다.
    • 해당 기능을 사용하지 않으면, 각 Container 는 고유한 Init Process 를 가집니다.

작동 방식

  • Pod 생성 시
    • Kubernetes가 Pod를 생성할 때, 가장 먼저 Pause Container가 생성됩니다.
  • 네트워크 네임스페이스 생성
    • 이 Pause Container는 네트워크 네임스페이스를 설정하고, 다른 모든 애플리케이션 컨테이너가 이 네트워크 네임스페이스를 공유하게 됩니다.
  • 애플리케이션 컨테이너 실행
    • 이후, Pod 내에서 실행되는 다른 모든 애플리케이션 컨테이너들은 이 Pause Container의 네트워크 네임스페이스를 사용하게 되어 동일한 IP와 네트워크 환경을 공유하게 됩니다.

 

  • Pause 바이너리 실행:
    • Pause 컨테이너는 "Pause"라는 바이너리을 실행합니다. 이 프로그램은 pause()라는 시스템 호출을 사용합니다.
      • Binary : 실행 가능한 형식의 데이터 파일 ( ex. EXE , ELF )
      • Signal : 비동기적인 이벤트를 발생시키는 소프트웨어 인터럽트로 특정 프로세스의 동작을 멈추거나, 다른 동작을 하게 하는 신호이다
  • 대기 상태:
    • pause() 시스템 호출은 프로그램이 특정 신호(Signal)를 받을 때까지 아무 작업도 하지 않고 대기 상태에 있게 만듭니다.

왜 필요한가?

  • Pod의 네트워크 일관성 유지
    • Pause Container는 네트워크 네임스페이스와 IP 주소를 관리하며, Pod 내의 모든 컨테이너가 동일한 네트워크 환경을 유지할 수 있게 해줍니다.
    • 만약 Pod 내에서 어떤 컨테이너가 재시작되어도 Pause Container는 그대로 유지되어 네트워크 설정이 그대로 유지됩니다.
  • 컨테이너 재시작의 유연성
    • 특정 애플리케이션 컨테이너가 재시작되더라도, Pause Container가 네트워크 설정을 유지하기 때문에 IP 주소나 네트워크 환경이 변하지 않습니다. 이는 Pod의 네트워크 안정성을 높입니다.

✅ 실습

🧿 Pod 배포 및 격리 확인

  • 확인 : kubelet에 --container-runtime-endpoint=unix:///run/containerd/containerd.sock
    • Kubernetes의 kubelet이 컨테이너 런타임과 통신하는 방법을 설정하는 옵션입니다. 이 설정은 kubelet이 컨테이너를 관리하고 실행하는 데 사용하는 컨테이너 런타임과의 통신 경로를 정의합니다. 
    • kubelet이 컨테이너 런타임과 안정적이고 빠르게 상호작용할 수 있도록 도와줍니다.

  • 파드내에 pause 컨테이너와 metrics-server 컨테이너, 네임스페이스 정보를 확인합니다.

  • 네임스페이스 정보를 확인합니다.
  • lsns : Linux 시스템에서 네임스페이스(namespace)의 상태를 확인
    • lsns -p 1 : PID 1인 프로세스의 네임스페이스 정보
    • lsns -p $$ : 현재 사용 중인 쉘 프로세스의 네임스페이스 정보

  • pause 컨테이너는 호스트 네임스페이스 와 다른 5개의 네임스페이스 를 가짐 : 
    • mnt pid 네임스페이스는 pause 컨테이너가 독립적으로 사용하며, 파드 내의 다른 컨테이너와 공유되지 않습니다.
    • net, uts, ipc 네임스페이스는 pause 컨테이너가 먼저 생성하고 설정하며, 파드 내의 다른 컨테이너들이 이 네임스페이스를 공유합니다.

  • app 컨테이너(metrics-server)는 호스트 네임스페이스 와 다른 6개의 네임스페이스 를 가짐 :
    • 독립적으로 사용: mnt, pid, cgroup 네임스페이스
    • 공유 사용: net, uts, ipc 네임스페이스 (이 네임스페이스들은 pause 컨테이너가 생성하고 설정함)

 

🧿 신규 파드를 배포하고 확인

  • 파드내에 pause 컨테이너와 app 컨테이너, 네임스페이스 정보를 확인합니다.

  • lsns -p 1 : PID 1인 프로세스의 네임스페이스 정보
  • lsns -p $$ : 현재 사용 중인 쉘 프로세스의 네임스페이스 정보
    • 현재 쉘이 init 프로세스와 동일한 네임스페이스를 공유하고 있다는 의미이며, 이는 쉘이 기본 시스템 네임스페이스에서 실행 중

  • app 컨테이너(nginx)는 호스트 네임스페이스 와 다른 6개의 네임스페이스 를 가짐 :
    • 독립적으로 사용: mnt, pid, cgroup 네임스페이스
    • 공유 사용: net, uts, ipc 네임스페이스 (이 네임스페이스들은 pause 컨테이너가 생성하고 설정함)

 

🧿 myweb2 파드에 2개의 컨테이너가 동작

  • myweb2.yaml
    • container 1 : myweb2-nginx 
    • container 2 : myweb2-netshoot

  • 파드 생성 후 Pod 정보를 확인합니다.

  • Pod 상세 정보에서 컨테이너 2개의 정보를 확인합니다

  • 파드의 컨테이너 IP 확인하면 2개의 컨테이너 IP가 동일한것을 확인 할 수 있습니다.

 

  • myweb2-netshoot 컨테이너 zsh 접속 합니다.
    • curl localhost가 작동하는 이유
      • 같은 Pod 내의 컨테이너들이 동일한 네트워크 네임스페이스를 공유하기 때문에, myweb2-netshoot에서 localhost를 통해 myweb2-nginx의 Nginx 서버에 접속할 수 있기 때문입니다.
    • ps -ef 명령어에서 Nginx 프로세스가 보이지 않는 이유
      • 각 컨테이너가 독립적인 프로세스 네임스페이스를 가지기 때문입니다. myweb2-netshoot 컨테이너에서는 myweb2-nginx 컨테이너의 프로세스를 볼 수 없습니다

  • POD 와 POD ID가 같음을 확인합니다.

  • 컨테이너 프로세스 정보 확인
    • 같은 부모 프로세스
      • PID: 2794는 myweb2-netshoot 컨테이너에서 실행 중인 Bash 프로세스입니다. 이 프로세스가 Nginx와 curl 명령어를 실행하는 Bash 스크립트를 모두 시작했기 때문에 두 프로세스의 PPID(부모 프로세스 ID)가 동일하게 나타납니다.
    • 컨테이너 내 실행
      • Nginx 프로세스와 curl 명령어는 모두 myweb2-netshoot 컨테이너 내부에서 실행되고 있으며, 이 컨테이너 내에서 PID: 2794인 Bash 프로세스가 이들의 부모 프로세스입니다.
    • PID: 2794 myweb2-netshoot 컨테이너 내에서 실행 중인 Bash 프로세스이며, 이 프로세스가 Nginx와 curl 명령어를 실행하고 제어하고 있습니다.

  • 현재 시스템에서 실행 중인 Nginx 프로세스의 PID(프로세스 ID)만을 추출하여 출력합니다.
  • 현재 시스템에서 실행 중인 curl 명령어와 관련된 프로세스의 PID(프로세스 ID)만을 추출하여 출력합니다

  • 한 파드 내의 각 컨테이너의 네임스페이스 정보 확인
  1. time, user 네임스페이스는 호스트와 동일함:
    • time과 user 네임스페이스는 호스트(실제 서버)와 동일하게 사용되고, 별도로 격리되지 않습니다. 즉, 모든 컨테이너가 호스트와 같은 시간 설정 및 사용자 정보를 공유합니다.
  2. mnt, pid 네임스페이스는 컨테이너별로 격리됨:
    • mnt, pid 네임스페이스는 각각의 컨테이너에서 독립적으로 작동합니다.
    • mnt 네임스페이스는 파일 시스템(디렉토리 구조)을 격리하고, pid 네임스페이스는 프로세스 ID를 격리하여 각 컨테이너가 독립적인 프로세스를 가질 수 있게 합니다.
  3. ipc, uts, net 네임스페이스는 파드 내의 컨테이너 간 공유:
    • ipc, uts, net 네임스페이스는 같은 파드(Pod) 내의 모든 컨테이너가 공유합니다.
    • ipc 네임스페이스는 컨테이너 간에 프로세스 간 통신(예: signal, socket, pipe 등)을 공유할 수 있게 하고, net 네임스페이스는 네트워크 설정(IP 주소, 포트 등)을 공유합니다. uts 네임스페이스는 호스트 이름과 도메인 이름을 공유합니다.
  4. Pause 컨테이너의 역할:
    • Pause 컨테이너는 IPC, Network, UTS 네임스페이스를 생성하고 유지합니다.
    • 파드 내의 다른 컨테이너들은 이 Pause 컨테이너가 생성한 네임스페이스를 공유해서 사용합니다.
  5. 컨테이너 비정상 종료에 대한 보호:
    • 유저가 실행한 특정 컨테이너가 비정상적으로 종료될 경우, 그 컨테이너와 네임스페이스를 공유하는 다른 컨테이너들에도 영향을 줄 수 있습니다.
    • Pause 컨테이너를 통해 네임스페이스를 관리함으로써 이러한 영향을 줄이고, 전체 시스템의 안정성을 높입니다.
  • pause 정보 확인

  • cgroup 가 호스트와 같은 이유
    • cgroup(Control Groups) 네임스페이스는 리소스(예: CPU, 메모리, I/O 등)를 제한하고 모니터링하는 데 사용됩니다.
    • 이 네임스페이스가 호스트와 동일하다는 것은, 파드 내의 모든 컨테이너가 호스트와 동일한 cgroup을 사용하며, 리소스 할당 및 제한이 호스트 전체 수준에서 이루어지고 있음을 의미합니다.
    • Kubernetes에서 cgroup 네임스페이스는 일반적으로 파드 내의 컨테이너들이 동일한 리소스 제한을 공유하도록 설정됩니다. 하지만, 호스트 수준에서 관리되는 것이므로 pause 컨테이너와 다른 애플리케이션 컨테이너들이 동일한 cgroup을 공유할 수 있습니다.
  • mnt와 pid 가 애플리케이션 컨테이너와 다른 이유
    • mnt(마운트) 네임스페이스:
      • mnt 네임스페이스는 파일 시스템과 관련된 정보를 격리하는 데 사용됩니다.
      • pause 컨테이너와 애플리케이션 컨테이너가 서로 다른 mnt 네임스페이스를 사용한다는 것은, 이들 컨테이너들이 각기 다른 파일 시스템 구조를 가지고 있다는 의미입니다. 각 컨테이너가 독립적인 파일 시스템을 가지며, 다른 컨테이너와는 공유하지 않습니다.
      • 이는 컨테이너의 독립성을 유지하고, 각 컨테이너가 자신만의 환경을 가지게 하기 위한 것입니다.
    • pid(프로세스 ID) 네임스페이스:
      • pid 네임스페이스는 프로세스 ID(PID)와 관련된 정보를 격리하는 데 사용됩니다.
      • pause 컨테이너와 애플리케이션 컨테이너가 서로 다른 pid 네임스페이스를 사용하는 것은, 이들 컨테이너들이 서로 독립적인 프로세스 트리를 가지고 있다는 것을 의미합니다.
      • 즉, pause 컨테이너와 애플리케이션 컨테이너의 프로세스들이 서로 간섭 없이 독립적으로 동작하며, 하나의 컨테이너가 비정상 종료되어도 다른 컨테이너의 프로세스에 영향을 미치지 않도록 하기 위함입니다.
  • 개별 컨테이너의 각각의 IP가 동일 한 것을 확인 할 수 있습니다.

  • PAUSE 의 NET 네임스페이스 PID 확인 및 IP 정보 확인
    • IP 주소:
      • 모든 컨테이너에서 동일한 IP 주소(10.244.1.6/24)를 사용하고 있습니다. 이는 Kubernetes 클러스터에서 컨테이너들이 동일한 네트워크 네임스페이스를 공유하고 있음을 나타냅니다. 네트워크 네임스페이스가 공유되면, 파드 내의 모든 컨테이너가 동일한 IP 주소와 네트워크 설정을 가지게 됩니다.
    • MAC 주소:
      • 동일한 MAC 주소(9e:35:b6:1a:4f:a7)가 사용되고 있습니다. 이는 네트워크 네임스페이스가 공유되므로, 모든 컨테이너가 동일한 가상 네트워크 인터페이스를 사용하는 것을 의미합니다.

  • 2개의 네임스페이스 비교 , 아래 2814프로세스의 정제는?
    • 2814 프로세스는 파드 내에서 pause 컨테이너가 사용하는 프로세스 ID를 가리키며, 이 컨테이너가 파드 내의 네임스페이스를 생성하고 유지하고 있음을 나타냅니다. 모든 컨테이너가 동일한 네임스페이스를 공유할 수 있도록 하는 역할을 합니다.

 

 

 

 

 

 

 

 

 

Comments