Namespace

  • Namespace 는 쿠버네티스 내 존재하는 가상의 공간
  • 클러스터 내에서 오브젝트들과 리소스 그룹을 “논리적"으로 분리함. (물리적 분리가 아님)
  • 작은 규모의 클러스터에서는 그냥 default에서 작업하면 되지만, 엔터프라이즈나 프로덕션 환경에서는 Namespace를 사용하는 것이 좋음

적용 예시

  • 사용자에 따라 Namespace 접근 권한을 다르게 부여할 수 있음.
  • Namespace마다 다른 정책을 부여할 수 있음.
  • Namespace 별로 리소스 할당량(resource quota)을 지정/정의할 수 있음

Namespace의 유형

Default Namespace

  • Cluster가 처음 생성될 때 K8s가 default로 생성함
  • 프로덕션 클러스터의 경우 Default Namespace를 사용하지 않고, 다른 Namespace를 만드는 것이 권장됨.

kube-system

  • 쿠버네티스가 네트워킹 DNS서비스 등 내부적인 용도로 생성함
  • 사용자가 사용, 편집, 삭제 등을 하지 못 하도록 격리함

kube-public

  • 유저에게 제공되는 리소스들이 위치한 Namespace

사용 예시

다른 Namespace에 위치한 Pod 접근하기

  • 다른 Namespace 의 자원에 접근하려고 하면, 해당 Namespace를 명시해야 함
    • ex)
      • msql.connect("db-service") - 동일 Namespace 내
      • msql.connect("db-service.dev.svc.cluster.local") - 다른 Namespace에 위치한 자원
    • DNS 형식
      • {SERVICE}.{NAMESPACE}.{sub domain of SERVICE}.{default domain for CLUSTER}

Namespace 내 Pod 조회하기

# Namespace 이름으로 필터링
kubectl get pods --namespace=kube-system 

특정 Namespace 내부에 Pod 생성하기

kubectl create -f pod-definition.yml --namespace=dev  
# 또는 yaml file 내부에 metadata 아래 namespace 를 명시해도 됨

Namespace 생성하기

apiVersion: v1
kind: Namespace
metadata:
	name: dev

kubectl create -f namespace-dev.yaml

OR

kubectl create namespace dev

특정 Namespace를 기본으로 설정하기

kubectl config set-context $(kubectl config current-context) --namespace=dev

리소스 할당 정의하기

apiVersion: v1
kind: ResourceQuota
metadata:
	name: compute-quota
	namespace: dev
spec:
	hard:
		pods: "10"
		requests.cpu: "4"
		requests.memory: 5Gi
		limits.cpu: "10"
		limits.memory: 10Gi

kubectl create -f compute-quota.yaml

Reference