서버인프라/kubernetes

[제 7강] NameSapace

techwold ted 2022. 12. 29. 08:48

NameSpace

Kubernetes에서 네임스페이스는 단일 클러스터 내의 리소스 그룹을 격리하는 메커니즘을 제공합니다. 리소스 이름은 네임스페이스 내에서 고유해야 하지만 네임스페이스 간에는 고유하지 않습니다. 네임스페이스 기반 범위 지정은 네임스페이스 개체(예: 배포, 서비스 등)에만 적용되며 클러스터 전체 개체(예: 스토리지 클래스, 노드, 영구 볼륨 등)에는 적용되지 않습니다.

 

초기 네임스페이스

Kubernetes starts with four initial namespaces:

default
Kubernetes는 네임스페이스를 먼저 만들지 않고 새 클러스터를 사용할 수 있도록 이 네임스페이스를 포함합니다.

kube-node-lease
이 네임스페이스에는 각 노드와 연결된 리스 개체가 있습니다. 노드 임대를 사용하면 제어부에서 노드 장애를 감지할 수 있도록 큐블릿이 하트비트를 전송할 수 있습니다.

kube-public
이 네임스페이스는 인증되지 않은 클라이언트를 포함한 모든 클라이언트에서 읽을 수 있습니다. 이 네임스페이스는 일부 리소스가 전체 클러스터에서 공개적으로 표시되고 읽을 수 있어야 하는 경우 대부분 클러스터 사용을 위해 예약되어 있습니다. 이 네임스페이스의 공용 부분은 규칙일 뿐 요구 사항은 아닙니다.

kube-system

Kubernetes 시스템에서 만든 개체의 네임스페이스입니다.
 

 

NameSpace 확인

kubectl get namespaces
NAME              STATUS   AGE
default           Active   17d
kube-node-lease   Active   17d
kube-public       Active   17d
kube-system       Active   17d

 

NameSpace 생성

kubectl create namespace green
namespace/green created

위와 같이 namespace생성 하는 방법도 있고, 우리가 이전 시간에 많이 사용하였던 --dry-run을 활용하여 yaml 파일을 만들어서 생성하는 방법이 있습니다.

kubectl create namespace red --dry-run -o yaml > namespace_red.yaml
kubectl create -f namespace_red.yaml
namespace/red created

 

NameSpace 를 다시 확인해 보면 green, red 가 생성 된 것을 확인 하실 수 있습니다.

 

이제 해당 생성한 네임스페이스에 pod를 생성해 보겠습니다.

root@master:~/yaml# kubectl run red-nginx --image=nginx -n=red
pod/red-nginx created
root@master:~/yaml# kubectl run green-nginx --image=nginx -n=green
pod/green-nginx created

저는 네이스페이스 red와 green에 하나씩 nginx이미지를 활용하여 pod를 생성했습니다. 잘 생성 되었는지 확인 해보겠습니다.

kubectl get pods
No resources found in default namespace.

다들 이렇게 나오시나요? kubectl get pods 하면 지금 현제 default로 namespace가 설정 되어 있기 때문인데 이 얘기는 아래와 같습니다.

kubectl get pods --namespace=default
No resources found in default namespace.
root@master:~/yaml# kubectl get pods --namespace=green
NAME          READY   STATUS    RESTARTS   AGE
green-nginx   1/1     Running   0          5m
root@master:~/yaml# kubectl get pods --namespace=red
NAME        READY   STATUS    RESTARTS   AGE
red-nginx   1/1     Running   0          5m27s

namespace에 대해 지정해 주면 다음과 같이 우리가 방금 설정하였던 nginx들을 확인 할 수 있습니다.

우선 현재 config view를 확인해 보시면 namespace에 대한 사항이 없습니다. 하지만 맨 처음 얘기들였던 봐와 같이 default 라는 네임스페이스에 pod들이 생성 되었습니다. 기본 네임스페이스에서 우리는 red를 기본 네이스페이스로 변경해 보도록 하겠습니다. 변화 과정을 잘 살펴 보세요

kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.0.1.180:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: DATA+OMITTED
    client-key-data: DATA+OMITTED

기본 네임스페이스 변경

kubectl config set-context --current --namespace=red
kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.0.1.180:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: red
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: DATA+OMITTED
    client-key-data: DATA+OMITTED
 kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
red-nginx   1/1     Running   0          14m

위의 일련의 과정이 이해가 가시나요 우리는 현제 red라는 명칭의 네임스페이스를 default 네임스페이스로 변경 하였고, 위에서는 --namespce라는 것을 주고 해당 네이스페이스에 pod를 생성하였지만 현재는 아래와같이 생성해 주면 red 라는 네이스페이스에 pod가 그냥 생성되어 버립니다.

kubectl run red2-nginx --image=nginx

그럼 default 네임스페이에 생성하려면 다시 다음과 같이 해야 겠죠?

kubectl run default-nginx --image=nginx --namespace=default
pod/default-nginx created

이해가 가셨나요 그럼 이제 다시 default 네임스페이를 기본 네이스페이로 돌리고, red와 green 네임스페이스를 삭제하겠습니다. 여기서 우리가 삭제하면서 하나 배울 수 있는 것은 네임스페이스를 삭제하면 해당 네임스페이스 안에 있던 pod들이 다 삭제되어 버립니다. 주의해서 작업해야 합니다.

kubectl delete namespaces red

 

https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/

 

Namespaces

In Kubernetes, namespaces provides a mechanism for isolating groups of resources within a single cluster. Names of resources need to be unique within a namespace, but not across namespaces. Namespace-based scoping is applicable only for namespaced objects

kubernetes.io

쿠버네티스 네임스페이스에대한 자세한 사항은 위에서 확인 하실 수 있습니다.