04. Namespace를 이용한 리소스 그룹화

2021. 4. 4. 16:54🎯 OpenSource/K8S

쿠버네티스는 Namespace를 통해 여러 오브젝트를 분리할 수 있다. 

서로 다른 Namespace에서는 같은 이름의 리소스를 각각 사용할 수 있다.

 

3.7.1 Namespace의 필요성

  • 많은 구성요소를 좀 더 작은 개별 그룹으로 분리하여 관리할 수 있다.
  • multi-tenant 환경처럼 리소스 분리
  • production, dev, QA 등 용도에 맞게 리소스 분리
  • 여러 사용자가 하나의 클러스터를 나눠 사용하는 경우

서로 다른 namespace에서 리소스는 독립적이지만, node 같은 경우는 global 하게 동작한다.

 

3.7.2 다른 namespace와 pod 살펴보기

root@master001:~/k8s_in_action/03_pod# kubectl get namespace
NAME              STATUS   AGE
calico-system     Active   34d
default           Active   34d
kube-node-lease   Active   34d
kube-public       Active   34d
kube-system       Active   34d
tigera-operator   Active   34d

이는 현재 k8s cluster 내에 존재하는 namespace의 리스트이다.

지금까지 모든 실습은 default에서만 진행했다.

다른 namespace의 pod는 다음과 같이 조회한다.

kube-system namespace의 경우, 쿠버네티스의 시스템 자체와 관련된 리소스를  포함한다. 시스템적인 환경 설정은 되도록 변경하지 않는 것이 좋으며, 실수로 변경되는 것을 방지하기 위해 별도의 namespace로 관리된다.

root@master001:~# kubectl get po --namespace kube-system
NAME                                READY   STATUS    RESTARTS   AGE
coredns-74ff55c5b-rvkgk             1/1     Running   0          34d
coredns-74ff55c5b-wkx5w             1/1     Running   0          34d
etcd-master001                      1/1     Running   0          34d
kube-apiserver-master001            1/1     Running   0          34d
kube-controller-manager-master001   1/1     Running   0          34d
kube-proxy-7qqhq                    1/1     Running   0          34d
kube-proxy-892sm                    1/1     Running   0          34d
kube-proxy-fflc8                    1/1     Running   0          34d
kube-scheduler-master001            1/1     Running   0          34d

 

3.7.3 Namespace 생성하기

namespace 또한 쿠버네티스의 리소스로, yaml 파일을 이용해 생성할 수 있다.

root@master001:~# cat custom-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace

namespace 생성

root@master001:~# kubectl create -f custom-namespace.yaml
namespace/custom-namespace created

 

위와 같이 yaml 파일로 namaspace를 생성할 수 있지만, 좀 더 간단하게 명령어 한줄로 생성할 수도 있다.

root@master001:~# kubectl create namespace wglee-namespace
namespace wglee-namespace created

root@master001:~# kubectl get ns wglee-namespace
NAME              STATUS   AGE
wglee-namespace   Active   20s

 

3.7.4 다른 namespace의 오브젝트 관리

특정 namespace 안에 리소스를 만들때는 metadata 속성에 설정을 하거나, kubectl create를 할 때 namespace를 지정하는 방법이 있다.

다음과 같이 -n 옵션으로 namespace를 지정하여 pod를 생성할 수 있다.

다른 namespace에 있는 리소스에 접근 하기 위해서는 -n 옵션을 사용한다.

root@master001:~/k8s_in_action/03_pod# kubectl create -f kubia-manual.yaml -n wglee-namespace
pod/kubia-manual created

root@master001:~/k8s_in_action/03_pod# kubectl get pod -n wglee-namespace
NAME           READY   STATUS    RESTARTS   AGE
kubia-manual   1/1     Running   0          24s

 

3.7.5 namespace가 제공하는 격리란?

namespace를 사용하면 오브젝트를 별도 그룹으로 분리해 특정 namespace에 속한 리소스에 대해서만 작업할 수 있다.

하지만 이는 실행 중인 오브젝트에 대한 격리는 아니다.

예를 들어, 서로 다른 namespace에 있다고 그 안의 pod 끼리의 통신이 불가능한 것은 아니다.

이는 쿠버네티스 환경에서 사용하는 네트워킹 솔루션의 영향을 받는다.