기본적으로 Cluster의 각 오브젝트는 해당 유형의 리소스에 대해 고유한 이름을 가지며, 이를 컨트롤러 매니저에서 관리하기 위해 UID를 부여한다. 하지만 이는 동일한 Namespace에서만 유일하면 된다. 다시말하면 동일한 리소스가 A Namespace / B Namespace에 존재할 수 있다. 왜냐하면 이것은 서로 다른 UID를 가지기 때문이다. 그렇다면 Namespace란 무엇일까?
Namespace란?
Namespace란 동일한 Cluster에서 다시 한번 논리적으로 가상 Cluster의 개념으로 분리하기위한 리소스이다.
즉, A Namesapce와 B Namespace는 모두 동일한 물리 Cluster에 존재하나, 서로 논리적으로 분리되어 있다.
일반적으로 다른 Namespace에 존재하는 리소스에 영향을 주지 않기 위해 Namespace를 쓰는 경우가 많다.
기본적으로 k8s를 실행하면 kube-system, kube-public, default 와 같이 3개의 Namespace가 기본적으로 생성되면 context를 변경하지 않으면 default Namespace에서 모든 작업이 이뤄진다.
1. kube-system : k8s 시스템에서 생성한 오브젝트를 관리하기 위한 Namespace
2. kube-public : 모든 사용자가 읽기 권한으로 접근할 수 있으며, 주로 공개적으로 확인되어 읽을 수 있는 리소스를 할당
3. default : 다른 Namespace가 없는 오브젝트를 위한 기본 Namespace
Namespace로 논리적으로 분리함으로써 얻을 수 있는 장점은 아래와 같다.
1. 사용자별로 Namespace 접근 권한을 다르게 설정할 수 있다.
2. Namespace별로 리소스 할당량을 지정할 수 있다.(using ResourceQuota 사용)
3. Namepsace 별로 리소스(pod, Service...)를 나눠서 관리할 수 있다.
다만, 반대로 아래의 단점이 있다.
1. 물리적인 Cluster 분리가 아니므로 Cluster에 장애가 발생하면 모든 Namespace가 타격을 받는다.
2. 리소스를 생성할 때 반드시 Namespace 지정이 필요하다.
- 반드시는 아니지만, 지정하지 않으면 default Namespace에서 리소스가 생성된다.
Namespace 생성방법
생성은 yaml 파일로 매우 간단하게 생성할 수 있다.
apiVersion: v1
kind: Namespace
metadata:
name: test
또는 아래 명령어를 통해서도 만들 수 있다.
kubectl create namespace test2
다른 Namespace 접근 방법
기본적으로 Namespace는 논리적으로 분리된 환경을 뜻하나, 접근을 못하는것은 아니다.(기본적으로는 못하지만)
A Namespace에서 B Namespace로 접근하는 방법은 1. FQDN과 2.Domain Search 방법이 있다.
FQDN 방법의 접근
Full Qualified Domain Name. 즉 전체 도메인 이름을 직접 기재하여 접근하는 방식을 뜻한다. 모든 경로를 직접 적기 때문에 에러 발생 가능성이 낮은편이나, 입력하는 입장에서 조금 불편하다..ㅎㅎ
Domain Search 방법의 접근
FQDN과 다르게 절대 경로를 전부 적지 않고, 부분적으로 기재하는 방식이며 나머지 부분은 Search 기능을 통해 자동으로 입력해준다. 흡사 크롬의 자동 완성 기능과 비슷하다고 볼 수 있다.
아래는 FQDN, Domain Search 방법의 접근 예시이다.
1은 FQDN, 즉 절대경로를 모두 기재하여 접근하는 방식이다.
2~4는 Domain Search 방식이다. 보시는것처럼 1.에 비해서 cluster.local 또는 + svc 부분이 적다. 가령 default에만 서비스가 존재한다면 3과 같이 입력하면 나머진 Domain Search가 나머지 정보를 자동 완성해준다.
하지만, 동일한 서비스가 A Namespace, B Namespace에 각각 존재한다면 내가 어떤 Namespace의 서비스에 접근할 지 알아야하기 떄문에 2 또는 3과 같이 Namespace를 정확하게 입력해줘야 한다. 같은 서비스명을 가졌더라도 Namespace만 잘 입력하면 각각 접근하는것은 문제가 안된다.
또한 4와 같이 Namespace를 입력하지 않는 경우에는 default Namespace의 서비스에만 접근이 가능하다. 나머지 Namespace에 대해서는 Search를 하지 못한다.
개별 서비스에 대해 혹시나 있을지 모르는 장애 상황을 방지하고 용도를 분리하기 위해서 가장 좋은 방법은 별도의 물리적인 Cluster를 사용하는 것이다. 하지만 모든 용도를 Cluster로 분리할 수 없기에 동일 Cluster에서 Namespace에서 논리적으로 분리하는 방법으로 각 서비스에 대한 영향을 최소화하는것 같다.
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] Kubernetes Node Taint & Tolerations의 개념정리 (0) | 2022.10.09 |
---|---|
[k8s] 명령형 접근방법과 선언형 접근방법의 차이 (0) | 2022.10.02 |
[k8s] Service 개념 및 Type 정리 (0) | 2022.09.18 |
[k8s] Pod, Replicaset, Deployment의 관계정리 (0) | 2022.09.18 |
[k8s] kubernetes ReplicaSet/ReplicationController 기본개념 (0) | 2022.08.26 |