Fairy ' s

[K8s] Namespaces 본문

Study/K8s

[K8s] Namespaces

berafairy 2023. 8. 8. 20:07

 

 지금까지 Pod, Deployment, Service 같은 오브젝트들을 생성했는데, 우리는 지금까지 이것들을 하나의 NameSpace 안에서 만들었고, 항상 우리는 NameSpace라는 집 안에 있었다고 할 수 있다. 이러한 namespace들은 누가 무엇을 할 수 있는지 정의하고, 리소스를 사용량을 할당하는 고유한 정책을 가질 수 있다. 리소스 사용량을 할당하면 각 namespace가 허용 한도 이상의 리소스를 사용하지 않게 된다.

 쿠버네티스가 자동으로 생성하는 namespace는 세 가지가 있다. 첫 번째는 kube-system으로 클러스터가 시작될 때 생성된다. 두 번째는 kube-public 으로 이 곳은 모든 사용자가 자원을 사용할 수 있어야 한다.

 세 번째는 default namespace이다. namespace를 따로 설정하지 않으면 default namespace가 된다. 이 default namespace는 클러스터가 처음 설정될 때 쿠버네티스에 의해 자동 생성된다. 작은 환경에서는 default namespace에서 계속 작업을 할 수 있기 때문에 namespace에 대해 걱정할 필요가 없다. 그러나 클러스터를 확장하고 사용할 때와 마찬가지로 기업, 생산 목적으로 namespace 사용을 고려할 수 있다. 

 예를 들어 개발 및 프로덕션 환경 둘 다에서 동일한 클러스터를 사용하려는 경우 그들 사이에 리소스를 격리하려는 목적으로 각각에 대한 고유한 namespace를 만들 수 있다. 쿠버네티스는 파드와 서비스들을 네트워킹 솔루션이나 DNS 서비스 등 내부 목적으로 생성하는데, 이를 실수로 삭제하거나 수정하는 것을 방지하고 유저로부터 격리하기 위해 다른 namespace에 생성한다. 이를 통해 개발 환경에서 작업할 때 프로덕션 리소스를 실수로 수정하는 일이 없어진다. 

 우리는 같은 namespace 안에 있는 리소스들은 단순히 이름으로 참조할 수 있다. 웹 애플리케이션 파드는 단순히 호스트 이름을 통해 DB 서비스에 접근할 수 있으며, 필요한 경우 웹 애플리케이션 파드도 다른 namespace의 서비스에 접근할 수 있다. 이 경우 서비스 이름에 namespace 이름을 추가해야 한다.

 예를 들어 default namespace의 웹 파드의 경우, 개발 환경에서 DB에 연결하기 위해 ' servicename.namespace.svc.cluster.local ' 형식을 사용한다. 즉, ' dbservice.dev.svc.cluster.local ' 이 된다. 서비스가 생성될 때, DNS 항목은 이 형식으로 자동 추가된다. 서비스의 DNS 이름을 자세히 살펴보면 마지막 부분인 cluster.local 이 있는데, cluster.local default 도메인 이름이다. svc namespace 뒤에 오며, 서비스 하위 도메인이다. 가장 앞에는 서비스 자체의 이름이 온다. 

# namespaces 조회
$ kubectl get namespace 
$ kubectl get namespaces
$ kubectl get ns

$ kubectl get pods

 이 명령은 모든 파드를 조회하는 데 사용했었는데, 사실 default namespace에 있는 파드만 조회되는 것이다. 다른 namespace에 있는 파드를 조회하려면 namespace 옵션을 함께 사용하면 된다. Definition file을 이용해 파드를 새로 생성할 때도 마찬가지로 namespace 옵션을 함께 사용하면 된다.

# kube-system namespace의 파드 조회
$ kubectl get pods --namespace=kube-system
$ kubectl get pods -n=kube-system

# default namespace에 파드 생성
$ kubectl create -f pod.yaml

# dev namespace에 파드 생성
$ kubectl create -f pod.yaml --namespace=dev

 위와 같은 방식으로도 다른 namespace에 파드를 생성할 수 있지만, 옵션을 붙이지 않고 Definition file의 metadata 섹션 하위에 namespace 옵션을 붙여 항상 동일한 namespace에 생성되도록 보장할 수도 있다.

# pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  namespace: dev
  labels:
    app: myapp
    type: front-end
spec:
  containers:
  - name: nginx-container
    image: nginx

 

 이렇게 dev라는 namespace에 pod를 생성하는 yaml을 작성했는데, 이렇게 create를 하려고 하면 다음과 같은 오류가 발생한다.

Error from server (NotFound): error when creating ".\\pod.yaml": namespaces "dev" not found

 dev라는 namespace를 만들어주지 않았기 때문이다. namespace를 만드는 방법에는 두 가지가 있다. Definition file을 이용해 만드는 방법과, 단순히 커맨드를 이용하는 방법이다.

# 1. 커맨드 이용
$ kubectl create namespace dev


# 2. Definition file 이용
# namespace_dev.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: dev

 namespace를 이용할 수 있는 방법을 여러가지이다. 이전에 보았던 ' kubectl get pods --namespace=dev ' 같은 옵션으로도 default가 아닌 다른 namespace에 있는 리소스를 볼 수 있지만, ' kubectl config ' 커맨드를 이용해서 namespace를 전환할 수 있다. 이후 ' kubectl get <resource> ' 를 입력하면 namespace 옵션을 따로 입력해주지 않아도 dev 환경에 있는 리소스를 조회할 수 있다.

# 영구적으로 dev namespace로 전환
$ kubectl config set-context $(kubectl config current-context) --namespace=dev

# 이 경우 다른 namespace의 리소스를 조회하려면 --namespace 옵션을 입력해주어야 한다.
$ kubectl get pods --namespace=default

# 모든 네임스페이스에 존재하는 Pod 조회
$ kubectl get pods --all-namespaces
$ kubectl get pods -A

 config 커맨드는 먼저 현재 context를 식별하고, 원하는 namespace를 해당 context에 설정한다. context는 같은 관리 시스템에서 여러 클러스터와 여러 환경을 관리하기 위해 사용된다. 

 namespace에서 리소스를 제한하려면 리소스 할당량을 만들면 된다. 다음 yaml 파일은 할당량을 줄 namespace를 지정하고, 사양에 따라 10개의 파드, 10개의 CPU 유닛, 10GB의 메모리 등과 같이 할당량을 조절하였다.

# compute_quota.yaml

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

 

'Study > K8s' 카테고리의 다른 글

[K8s] kubectl apply command  (0) 2023.08.09
[K8s] Imperative vs Declarative  (0) 2023.08.08
[K8s] Services  (0) 2023.08.07
[K8s] kubectl command  (0) 2023.08.07
[K8s] Deployment  (0) 2023.08.06
Comments