Namespace: 리소스를 논리적으로 구분하는 장벽
쿠버네티스에서는 리소스를 논리적으로 구분하기 위해 네임스페이스라는 오브젝트를 제공한다. 간단히 생각해서 네임스페이스는 포드, 레플리카셋, 디플로이먼트, 서비스 등과 같은 리소스들이 묶여 있는 하나의 가상 공간 또는 그룹이라고 이해하면 된다.
예를 들어 모니터링을 위한 모든 리소스들은 monitoring 이라는 이름의 네임스페이스에서 생성할 수 있고, 테스트를 위한 리소스들은 testbed 라는 네임스페이스에서 생성할 수 있다.
또는, 여러 개발 조직이 하나의 쿠버네티스 클러스터를 공유해 사용해야 한다면 조직별로 네임스페이스를 사용하도록 구성할 수 있다. 이렇게 여러 개의 네임스페이스를 사용하면 마치 하나의 클러스터에서 여러 개의 가상 클러스터를 사용하는 것처럼 느껴질 것이다.
쿠버네티스를 설치하면 자동으로 default, kube-system 라는 네임스페이스가 생성되고 kubectl 명령어로 쿠버네티스 리소스를 사용할 때는 기본적으로 default 네임스페이스를 사용한다.
기본적으로 kube-system 네임스페이스는 쿠버네티스에 대한 충분한 이해 없이는 건드리지 않는 것이 좋다. 예상치 못하게 쿠버네티스 클러스터가 동작하지 않을 수도 있기 때문이다.
네임스페이스를 사용하는 경우는 대부분 모니터링, 로드 밸런싱 인그레스 등의 특정 목적을 위한 용도가 대부분이다. 각 네임스페이스의 리소스들은 논리적으로만 구분된 것일 뿐, 물리적으로 격리된 것이 아니기 때문에 서로 다른 네임스페이스에서 생성된 파드가 같은 노드에 존재할 수 있다.
Label vs NameSpace
네임스페이스와 라벨의 차이점이 궁금할 수 있다. 서비스와 파드를 매칭시키기 위해 사용하는 라벨 또한 리소스를 분류하고 구분하기 위한 방법 중 하나이기 때문이다.
네임스페이스는 라벨보다 더욱 넓은 용도로 사용될 수 있다. ResourceQuota 오브젝트를 이용해 특정 네임스페이스에서 생성되는 포드의 자원 사용량을 제한하거나, 애드미션 컨트롤러라는 기능을 이용해 특정 네임스페이스에 생성되는 파드에는 항상 사이드카 컨테이너를 붙이도록 설정할 수도 있다.
무엇보다 쿠버네티스의 사용 목적에 따라 파드, 서비스 등의 리소스를 격리함으로써 편리하게 구분할 수 있다는 특징도 있다.
네임스페이스에 종속되는 쿠버네티스 오브젝트와 독립적인 오브젝트
A라는 네임스페이스에서 파드를 만들면 A 네임스페이스에서만 보이고 B 네임스페이스에서는 보이지 않는다. 이런 경우를 쿠버네티스에서는 ‘오브젝트가 네임스페이스에 속한다'라고 표현한다.
대표적으로 네임스페이스 속하지 않는 쿠버네티스 오브젝트는 nodes이다. nodes는 쿠버네티스 클러스터에서 사용되는 저수준의 오브젝트이며, 네임스페이스에 의해 구분되지 않기 때문이다.
노드처럼 네임스페이스에 속하지 않는 오브젝트들은 보통 네임 스페이스에서 관리되지 않아야 하는 클러스터 전반에 걸쳐 사용되는 경우가 많다.