공부/Kubernetes

컨테이너와 파드의 리눅스 네임스페이스

토고미 2021. 3. 21. 21:45

책을 읽다가 문득 궁금증이 생겼다.

 

컨테이너는 linux namespace와 cgroups를 이용해 다른 프로세스들과 격리되어 실행 된다.

그렇다면 쿠버네티스 파드는 어떻게 되는 걸까?

 

파드 안에는 여러 개의 컨테이너가 들어갈 수 있는데, 그 컨테이너들끼리 격리 돼있다면 사실상 파드의 의미가 없을 것이고, 격리가 돼있지 않다면 컨테이너의 의미가 없지 않나?

이런 생각이 들었다.

 

구글링을 해서 답을 알아낸 결과를 정리하고자 한다.

 

먼저, 컨테이너에서의 리눅스 네임스페이스는 아래 그림과 같은 구조이다.

 

컨테이너의 리눅스 네임스페이스

 

리눅스 네임스페이스에는 총 6가지 종류가 있다. (그림에는 5가지만 표시)

 

1.  IPC namespace (InterProcess Communication)

  - 말 그대로 프로세스간 통신을 가능케 해주는 네임스페이스

 

2. Network namespace

  - IP, 라우팅 테이블 등, 네트워크 규격을 독자적으로 가질 수 있는 네임스페이스

 

3. UTS namespace (그림상에서 Hostname)

  - 독자적으로 호스트명, 도메인명을 가질 수 있는 네임스페이스

 

4. PID namespace

  - 독자적인 PID를 가질 수 있는 네임스페이스

 

5. Mount namespace

  - 격리된 파일시스템을 가질 수 있는 네임스페이스

 

6. UID namespace (그림상에 없음)

  - UID, GID를 독자적으로 가질 수 있는 네임스페이스

 

여기서 중요한 점은 리눅스 네임스페이스가 하나의 단일 개체가 아니라,

여러 개의 네임스페이스 기술이 모인 덩어리라는 것이다.

즉, 취사선택 할 수 있다는 것이다.

 

나는 리눅스 네임스페이스라는 기술이 하나의 개채인 것으로 착각하고 있었다.

 

그렇다면 파드의 경우에는 어떻게 되는 걸까?

그 답은 아래와 같다.

 

 

파드의 리눅스 네임스페이스

 

네임스페이스의 일부만 공유하는 것이다.

 

파드 안의 컨테이너들은 기본적으로  네트워크와 IPC 네임스페이스를 공유한다.

PID는 기본적으로 분리되어 있지만, 파드 spec에 shareProcessNamespace 옵션을 통해 공유 하도록 설정할 수도 있다.

마찬가지로 볼륨 마운트를 통해 마운트 네임스페이스 또한 일부 공유하도록 만들 수 있다.

 

결론적으로, 컨테이너들의 네임스페이스를 일부 공유시켜 묶어준 것이 파드이다!

 

 

 

 

참고 사이트

- www.ianlewis.org/en/what-are-kubernetes-pods-anyway

- galid1.tistory.com/442

- stackoverflow.com/questions/62727781/does-kubernetes-pod-have-namespace-and-cgroup-associated-with-it