본문 바로가기

Container/Kubernetes

[K8S] namespace란

namespace

namespace는 k8s API 중 하나로, (물리적) 클러스터 하나를 여러 개의 논리 적인 단위로 나눠서 사용
- 쿠버네티스 클러스터 하나를 여러 팀이나 사용자가 함께 공유
- 리소스 충돌을 방지하고,다양한 팀과 프로젝트를 효율적으로 관리
- 용도에 따라 실행해야 하는 앱을 구분할 때 사용

 

Namespace의 주요 특징

  1. 리소스 분리:
    • 서로 다른 팀이나 애플리케이션에 속한 리소스를 격리.
    • 동일한 이름의 리소스도 서로 다른 Namespace에 존재할 수 있음.
  2. 접근 제어: 네트워크 정책 및 RBAC(Role-Based Access Control)를 사용하여 Namespace별 접근 권한 설정 가능
  3. 리소스 할당 제한: 특정 Namespace에 CPU, 메모리 등 리소스를 제한하여 과도한 사용 방지
  4. 스코프 제한: Namespace는 클러스터 범위에서 리소스를 격리하므로, 다른 Namespace에 영향을 미치지 않음.

# namespace 조회

default 기본 네임스페이스
kube-system 쿠버네티스 시스템에서 관리하는 리소스 배치하는 네임스페이스
(ex. 쿠버네티스 관리용 파드 / 설정 - kube-apiserver, kube-scheduler )
kube-public 클러스터 내/외부 모든 사용자가 읽을 수 있는 네임스페이스
(ex. 클러스터 사용량, ConfigMap)
kube-node-lease 각 노드의 임대 오프젝트들을 관리하는 네임스페이스
# 현재 시스템에 있는 namespace 확인
# 총 4개의 namespace는 default로 깔려있는 namespace 
[master ~]$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   2m14s
kube-node-lease   Active   2m14s
kube-public       Active   2m14s
kube-system       Active   2m14s # k8s 운영환경에서 필요로 하는 pod

# Default namespace가 base namesapce로 동작한다.
[master ~]$ kubectl get pod
No resources found in default namespace.
[master ~]$ kubectl get pod --namespace default
No resources found in default namespace.
[master ~]$ kubectl get pod -n default
No resources found in default namespace.

[master ~]$ cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
   - image: nginx:1.14
     name: nginx
     ports:
     - containerPort: 80
     - containerPort: 443
      
[master ~]$ kubectl create -f nginx.yaml 
pod/mypod created

[master ~]$ kubectl get pods -n default
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          45s

[master ~]$ kubectl get pods -n kube-system
NAME                            READY   STATUS    RESTARTS   AGE
coredns-5d78c9869d-2xnhr        1/1     Running   0          11m
coredns-5d78c9869d-5jrn8        1/1     Running   0          11m
etcd-node1                      1/1     Running   0          11m
kube-apiserver-node1            1/1     Running   0          11m
kube-controller-manager-node1   1/1     Running   0          11m
kube-proxy-dsgt8                1/1     Running   0          10m # 마스터 1, 워커노드 1
kube-proxy-lt4z9                1/1     Running   0          11m
kube-router-rhx2h               1/1     Running   0          10m
kube-router-t8xh6               1/1     Running   0          11m
kube-scheduler-node1            1/1     Running   0          11m

# 전체 조회
[master ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
default       mypod                           1/1     Running   0          3m30s
kube-system   coredns-5d78c9869d-2xnhr        1/1     Running   0          13m
kube-system   coredns-5d78c9869d-5jrn8        1/1     Running   0          13m
kube-system   etcd-node1                      1/1     Running   0          13m
kube-system   kube-apiserver-node1            1/1     Running   0          13m
kube-system   kube-controller-manager-node1   1/1     Running   0          13m
kube-system   kube-proxy-dsgt8                1/1     Running   0          12m
kube-system   kube-proxy-lt4z9                1/1     Running   0          13m
kube-system   kube-router-rhx2h               1/1     Running   0          12m
kube-system   kube-router-t8xh6               1/1     Running   0          13m
kube-system   kube-scheduler-node1            1/1     Running   0          13m
# root@master:~# kubectl get pods -A 로 조회해도 동일한 결과 나온다.

 

서로 같은 namespace에 있다면 name으로 서로 access가 가능하다. (DNS역할)

controlplane ~ ➜  kubectl get svc -n marketing 
NAME           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
blue-service   NodePort   10.43.88.253    <none>        8080:30082/TCP   10m
db-service     NodePort   10.43.100.230   <none>        6379:32270/TCP   10m

controlplane ~ ➜  kubectl get svc -n dev
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
db-service   ClusterIP   10.43.62.119   <none>        6379/TCP   13m

# 같은 pod 이름이지만 다른 namespace상에 있음
# -> db-service.dev.svc.cluster.local 로 접근

 

# namespace 만들기

# CLI로 blue namespace 생성
[master ~]$ kubectl create namespace blue
namespace/blue created

# yaml로 orange namespace 생성
## --dry-run : 실제로 실행하지 않고 실행 가능 여부만 확인
## -o yaml: 실행 결과를 yaml 파일로 출력

[master ~]$ kubectl create namespace orange --dry-run -o yaml
W0213 08:37:28.132628    5282 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: orange
spec: {}
status: {}

[master ~]$ kubectl create namespace orange --dry-run -o yaml > orange-ns.yaml
W0213 08:38:17.381045    5393 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.

# namespace 만드는데 필요한 내용만 넣기
[master ~]$ cat orange-ns.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: orange
  
[master ~]$ kubectl create -f orange-ns.yaml 
namespace/orange created

# 만든 namespace 확인
[master ~]$ kubectl get namespaces
NAME              STATUS   AGE
blue              Active   6m21s
default           Active   21m
kube-node-lease   Active   21m
kube-public       Active   21m
kube-system       Active   21m
orange            Active   16s

# namespace 지정해서 Pod 만들기
[master ~]$ kubectl create -f nginx.yaml -n blue
pod/mypod created

# yaml파일에 namespace 고정시키기
[master ~]$ cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: orange
spec:
  containers:
   - image: nginx:1.14
     name: nginx
     ports:
     - containerPort: 80
     - containerPort: 443
[master ~]$ kubectl create -f nginx.yaml 
pod/mypod created

# blue에서 실행중인 pod 확인하기
[master ~]$ kubectl get pods -n blue
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          4m50s
# 명령어
$ kubectl create deployment my-app --image=nginx -n my-namespace

# YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: nginx
          image: nginx

# 사용할 namespace switch

👉 기본으로 사용하는 namespace를 default가 아닌 다른 이름의 namespace로 스위치

방법

1) namespace를 포함한 config context 등록

  • $ kubectl config --help
  • $ kubectl config set-context NAME --cluster=kubernetes ...
  • $ kubectl config view

2) 등록된 namespace로 context 변경

  • $ kubectl config use-context NAME
# 현재 클러스터의 config 확인하기
[node1 ~]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.0.18: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
    
# set-context       Set a context entry in kubeconfig
[node1 ~]$ kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=blue
Context "blue@kubernetes" created.

2개의 context 생성 확인

 

# 현재 context 확인
root@master:~# kubectl config current-context
kubernetes-admin@kubernetes

root@master:~# kubectl config get-contexts kubernetes-admin@kubernetes
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin
# NAMESPACE가 비어있는 건 default NAMESPACE라는 것이다.

# switch
[master ~]$ kubectl config use-context blue@kubernetes 
Switched to context "blue@kubernetes".
[master ~]$ kubectl config current-context 
blue@kubernetes

[master ~]$ kubectl get pods 
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          26m
[master ~]$ kubectl get pods -n default
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          51m
[master ~]$ kubectl delete pods mypod -n default 
pod "mypod" deleted
[master ~]$ kubectl get pods -n default
No resources found in default namespace.

# ns 안써도 blue로 불러 오는 것 확인
[master ~]$ kubectl get pods           
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          34m

# 다시 원복시키기
[master ~]$ kubectl config use-context kubernetes-admin@kubernetes 
Switched to context "kubernetes-admin@kubernetes".
[master ~]$ kubectl get pods 
No resources found in default namespace.

namespace 삭제하기

blue namespace에는 Pod, service 등의 API가 있는데, namespace가 가장 큰 단위의 API이기 때문에

namespace를 삭제하면 전부 삭제가 된다.

[master ~]$ kubectl delete namespaces blue
namespace "blue" deleted

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Liveness Probe (Self-healing) Pod  (1) 2024.02.16
[K8S] YAML 템플릿 및 Pod  (0) 2024.02.13
[K8S] 쿠버네티스 개념 및 Architecture  (0) 2024.02.09
[K8S] kubectl command  (0) 2024.02.06
Kubernetes 환경 구성  (0) 2024.02.03