[kubenetes] 7-1. 네임스페이스

kubenetes
Author
chan2slo chan2slo
Date
2022-07-25 21:27
Views
1384

논리적으로 리소스를 구분하는 장벽…

네임스페이스는 기본적으로 3개 존재한다.
(책에는 3개라는데 kube-node-lease 이거하나더있네?)

root@Kube-master1:~# kubectl get ns
NAME              STATUS   AGE
default           Active   3d4h
kube-node-lease   Active   3d4h
kube-public       Active   3d4h
kube-system       Active   3d4h

defulat라는 이름의 네임스페이스에 생성된 포드를 확인하려면 아래와같은 명령어를 사용한다 (--namespace 또는 -n 옵션)
쿠버네티스의 리소스를 이용할때 --namespace 옵션을 사용하지않으면 기본적으로 default라는 네임스페이스로 생성된다.

root@Kube-master1:~# kubectl get pods --namespace default
^[[ANAME                                   READY   STATUS    RESTARTS   AGE
hostname-deployment-7dfd748479-fvg7n   1/1     Running   0          2d4h
hostname-deployment-7dfd748479-jqzmp   1/1     Running   0          2d4h
hostname-deployment-7dfd748479-v8lb2   1/1     Running   0          2d4h

root@Kube-master1:~# kubectl get pods -n default 
NAME                                   READY   STATUS    RESTARTS   AGE
hostname-deployment-7dfd748479-fvg7n   1/1     Running   0          2d4h
hostname-deployment-7dfd748479-jqzmp   1/1     Running   0          2d4h
hostname-deployment-7dfd748479-v8lb2   1/1     Running   0          2d4h

kube-system이라는 네임스페이스는 쿠버네티스 클러스터 구성에 필수적인 컴포넌트들과 설정값등이 존재하는 네임스페이스이다.

root@Kube-master1:~# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-7f6768fdfb-hxdwb   1/1     Running   0          3d4h
calico-node-4pvh5                          1/1     Running   0          3d4h
calico-node-7lxkn                          1/1     Running   0          3d4h
calico-node-qd7w9                          1/1     Running   0          3d4h
calico-node-w9gpm                          1/1     Running   0          3d4h
coredns-558bd4d5db-btldr                   1/1     Running   0          3d5h
coredns-558bd4d5db-mgjqt                   1/1     Running   0          3d5h
etcd-kube-master1                          1/1     Running   0          3d5h
kube-apiserver-kube-master1                1/1     Running   0          3d5h
kube-controller-manager-kube-master1       1/1     Running   0          3d5h
kube-proxy-9tfs5                           1/1     Running   0          3d4h
kube-proxy-bnnzv                           1/1     Running   0          3d4h
kube-proxy-js8sw                           1/1     Running   0          3d5h
kube-proxy-lxt6p                           1/1     Running   0          3d4h
kube-scheduler-kube-master1                1/1     Running   0          3d5h

물론 서비스, 레플리카셋을 비롯한 여러 리소스들도 각 네임스페이스에 별도로 존재한다.

root@Kube-master1:~# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10           53/UDP,53/TCP,9153/TCP   3d5h

네임스페이스는 쿠버네티스의 리소스를 논리적으로 묶을 수 있는 가상 클러스터처럼 사용할수 있다. 쿠버네티스 클러스터를 여러 명이 동시에 사용해야 한다면 사용자마다 네임스페이스를 별도로 생성해 사용하도록 설정할 수 있다. 또는 용도에 다라 네임스페이스를 여러 개 만듦으로써 특정 목적의 디플로이먼트, 서비스들은 특정 네임스페이스에만 존재하도록 만들 수도 있다. 대부분 모니터링, 로드밸런스 인그레이스 등의 특정목적을 위한 용도가 대부분이다.

네임스페이스와 라벨의 차이점
네임스페이스는 라벨보다 더욱 넓은 용도로 사용할 수 있다.
ResourceQuota라는 오브젝트를 이용해 특정 네임스페이스에서 생서되는 포드의 자원 사용량을 제한하거나, 애드미션 컨트롤러라는 기능을 이용해 특정 네임스페이스에 생성되는 포드에는 항상 사이드카 컨테이너를 붙이도록 설정할수도있다.
무엇보다도 쿠버네티스에서의 사용 목적에 따라 포드, 서비스 등의 리소스를 격리함으로써 편리하게 구분할 수 있다는 특징이 있다.

리눅스 네임스페이스와는 다른것이다.
리눅스 네임스페이스는 컨테이너의 격리된 공간을 생성하기 위해 리눅스 커널의 자체기능을 활용하는 것이며, 일반적으로 네트워크나 마운트, 프로세스 네임스페이스 등을 의미한다.

네임스페이스 사용하기

네임스페이스 생성

root@Kube-master1:~# cat production-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: production
root@Kube-master1:~# kubectl apply -f production-namespace.yaml 
namespace/production created

또는 아래와같이 생성 
root@Kube-master1:~# kubectl create namespace production
namespace/production created

root@Kube-master1:~# kubectl get ns
NAME              STATUS   AGE
default           Active   3d5h
kube-node-lease   Active   3d5h
kube-public       Active   3d5h
kube-system       Active   3d5h
production        Active   91s

특정 네임스페이스에 리소스를 생성하는 방법
yaml 파일을 아래와 같이만들어준다.

root@Kube-master1:~# cat hostname-deploy-svc-ns.yaml                 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment-ns
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name: my-webserver
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: hostname-svc-clusterip-ns
  namespace: production
spec:
  ports:
  - name : web-port
    port: 8080
    targetPort: 80
  selector:
    app: webserver
  type: ClusterIP

root@Kube-master1:~# kubectl apply -f hostname-deploy-svc-ns.yaml 
deployment.apps/hostname-deployment-ns created
service/hostname-svc-clusterip-ns created

root@Kube-master1:~# kubectl get pods,services -n production
NAME                                          READY   STATUS    RESTARTS   AGE
pod/hostname-deployment-ns-7dfd748479-2p9k8   1/1     Running   0          3m4s
pod/hostname-deployment-ns-7dfd748479-7x6tk   1/1     Running   0          3m4s
pod/hostname-deployment-ns-7dfd748479-9l2jw   1/1     Running   0          3m4s

NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/hostname-svc-clusterip-ns   ClusterIP   10.104.239.101           8080/TCP   3m4s

하나의 yaml파일에 ---를 명시해 여러개의 리소스를 정의할수있다.

아래와같이 모든 네임스페이스의 리소스를 확인할수도있다.

root@Kube-master1:~# kubectl get pods -A
root@Kube-master1:~# kubectl get pods --all-namespace
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-node-4pvh5                          1/1     Running   0          3d5h
kube-system   calico-node-7lxkn                          1/1     Running   0          3d5h
kube-system   calico-node-qd7w9                          1/1     Running   0          3d5h
kube-system   calico-node-w9gpm                          1/1     Running   0          3d5h
kube-system   coredns-558bd4d5db-btldr                   1/1     Running   0          3d5h
kube-system   coredns-558bd4d5db-mgjqt                   1/1     Running   0          3d5h
kube-system   etcd-kube-master1                          1/1     Running   0          3d5h
kube-system   kube-apiserver-kube-master1                1/1     Running   0          3d5h
kube-system   kube-controller-manager-kube-master1       1/1     Running   0          3d5h
kube-system   kube-proxy-9tfs5                           1/1     Running   0          3d5h
kube-system   kube-proxy-bnnzv                           1/1     Running   0          3d5h
kube-system   kube-proxy-js8sw                           1/1     Running   0          3d5h
kube-system   kube-proxy-lxt6p                           1/1     Running   0          3d5h
kube-system   kube-scheduler-kube-master1                1/1     Running   0          3d5h
production    hostname-deployment-ns-7dfd748479-2p9k8    1/1     Running   0          101s
production    hostname-deployment-ns-7dfd748479-7x6tk    1/1     Running   0          101s
production    hostname-deployment-ns-7dfd748479-9l2jw    1/1     Running   0          101s

같은 네임스페이스 내의 서비스에서는 서비스 이름만으로 접근할 수 있다.
그러나 다른네임스페이스에 존재하는 서비스에서는 서비스이름만으로는 접근할수없다.

아래와같이 테스트서버는 default이고 서비스는 production이라면 접근하지못한다.

root@Kube-master1:~# kubectl run -i --tty --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash
If you don't see a command prompt, try pressing enter.

root@debug:/# curl hostname-svc-clusterip-ns:8080 --silent| grep Hello
curl: (6) Could not resolve host: hostname-svc-clusterip-ns

아래와 같이 .production.svc 부분을 추가해준다면 접근할수있다.

root@debug:/# curl hostname-svc-clusterip-ns.production.svc:8080 --silent| grep Hello  
        

Hello, hostname-deployment-ns-7dfd748479-2p9k8

네임스페이스 삭제, 아래 삭제를 진행 할 경우, 해당 네임스페이스에 포함된
모든 리소스들이 같이 삭제된다.

root@Kube-master1:~# kubectl delete ns production
namespace "production" deleted

모든 리소스가 네임스페이스에 의해 구분되는것은 아님
쿠버네티스에서는 네임스페이스로 인해 부분되는 오브젝트들은 네임스페이스에 속한다라고 표현한다.
네임스페이스에 속하는 리소스들은 아래와같이 조회가능하다.

root@Kube-master1:~# kubectl api-resources --namespaced=true
NAME                        SHORTNAMES   APIVERSION                     NAMESPACED   KIND
bindings                                 v1                             true         Binding
configmaps                  cm           v1                             true         ConfigMap
endpoints                   ep           v1                             true         Endpoints
events                      ev           v1                             true         Event
limitranges                 limits       v1                             true         LimitRange
…

반대로 네임스페이스에 속하지않는 저수준 오브젝트들도 있다.
node가 대표적인 예
아래의 명령으로 네임스페이스에 속하지 않는 오브젝트를 확인할 수 있다.

root@Kube-master1:~# kubectl api-resources --namespaced=false
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
componentstatuses                 cs           v1                                     false        ComponentStatus
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumes                 pv           v1                                     false        PersistentVolume
…
Total Reply 0