ETC

[CKA] Kubernetes 동작 원리 및 namespace

코린이s 2023. 8. 12. 11:28
728x90

이번 시간에는 쿠버네티스를 이루고있는 컴포넌트에 대해 알아보자!

아래 글에 상세하게 정리 해두어 아래 글을 참고하면 되며

https://co-de.tistory.com/182

 

[kubernetes] 쿠버네티스란?

앞서 실습한 내용으로 도커를 이용하여 CD 구현하면 되지만 만약 배포 서버가 1000대라면..! 물론 구현할 수 있지만 편리하게 할 수 있는게 있다면! 그리고 운영 서버를 받고 사용해보니 많은 리소

co-de.tistory.com

위에 정리한거 이외에 Add-on(=애드온=보강프로그램)으로 마스터 노드에 coreDNS ,마스터노드&워커노드에 CNI 가 있다.

컴포넌트 설명
coreDNS 클러스터 DNS 기능 (사용하면서 알아보자)
CNI(Container Network Interface) Pod간 통신을 정상적으로 하기위해 필요한 인터페이스로 워커 노드가 여러개 있다면 내부의 파드IP가 서로 동일할 수 있어 그런 현상을 방지해준다.

추가로 유용한 Add-on은 대시보드, 로그 수집 (ELK=ElasrticSerch, Logstash, Kibana) 등 설치하여 사용할 수 있다.

이제 namespace에 대해 알아보자!

물리적 클러스터가 하나인데 하나의 클러스터를 논리적으로 나눠 사용할 수 있는 기능을 namespace 라고 한다.

--namespace 옵션을 주어 사용가능하며 생성의 경우 CLI 또는 yaml 파일로 생성 할 수 있다.

이제 실습을 진행하며 아래 사이트에서 진행하도록 해보자!

https://labs.play-with-k8s.com/

우선 위 사이트에서 클러스터를 구성하고 아래와 같이 네임스페이스를 확인하면 기본 네임스페이스 default, 클러스터 관리를 위한 네임스페이스 4개가 나온다.

[node1 ~]$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   47s
kube-node-lease   Active   47s
kube-public       Active   47s
kube-system       Active   47s

파드를 조회해보자!

[node1 ~]$ kubectl get pod
No resources found in default namespace.

아무것도 조회되지 않으며 default 네임스페이스에는 실행한 파드가 없기에 당연히 나오지 않는다.

--all-namespaces 로 조회하면 클러스터 관리를 위한 kube 로 시작하는 네임스페이스에 설치된 파드들도 볼 수 있다.

[node1 ~]$ kubectl get pod --all-namespaces
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
kube-system   coredns-5d78c9869d-27k6n        1/1     Running   0          14m
kube-system   coredns-5d78c9869d-d2qlq        1/1     Running   0          14m
kube-system   etcd-node1                      1/1     Running   0          14m
kube-system   kube-apiserver-node1            1/1     Running   0          14m
kube-system   kube-controller-manager-node1   1/1     Running   0          14m
kube-system   kube-proxy-7lvcx                1/1     Running   0          14m
kube-system   kube-proxy-rdckv                1/1     Running   0          14m
kube-system   kube-router-6dn8b               1/1     Running   0          14m
kube-system   kube-router-t9lsq               1/1     Running   0          14m
kube-system   kube-scheduler-node1            1/1     Running   0          14m

이제 네임스페이스를 생성해보자!

우선 실습을 위해 nginx yaml 파일을 생성한다.

[node1 ~]$ kubectl run my-nginx --image=nginx --dry-run=client -o yaml > nginx.yaml
[node1 ~]$ ll
total 8
-rw------- 1 root root 3416 Nov 13  2020 anaconda-ks.cfg
-rw-r--r-- 1 root root  241 Aug 12 02:59 nginx.yaml

필요없는 부분은 삭제 하고 해당 파일로 저장한뒤

$ vi nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx
    name: my-nginx
:wq!

nginx 컨테이너를 실행해보자!

[node1 ~]$ kubectl create -f nginx.yaml 
pod/my-nginx created
[node1 ~]$ kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          3s

default 네임스페이스로 조회해도 동일하게 나오는것을 보아 default 네임스페이스에 파드가 뜬것을 볼 수 있다.

[node1 ~]$ kubectl get pod --namespace default
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          25s

이제 네임스페이스 corin 을 생성하며 정상적으로 네임스페이스가 조회된다.

[node1 ~]$ kubectl create namespace corin
namespace/corin created
[node1 ~]$ kubectl get namespace
NAME              STATUS   AGE
corin             Active   10s
default           Active   24m
kube-node-lease   Active   24m
kube-public       Active   24m
kube-system       Active   24m

만약 네임스페이스 생성하는것을 yaml 파일로 실행하고 싶다면 아래와 같이 dry-run 으로 yaml 파일을 쉽게 만들 수 있다.

[node1 ~]$kubectl create namespace niroc --dry-run=client -o yaml > create_ns.yaml
[node1 ~]$ cat create_ns.yaml 
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: niroc
spec: {}
status: {}

여기서 필요 없는 부분은 제거하고 저장한 뒤

[node1 ~]$ vi create_ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: niroc
:wq!

해당 파일로 네임스페이스를 생성하면 아래와 같이 정상적으로 생성 된것을 볼 수 있다.

[node1 ~]$ kubectl create -f create_ns.yaml
namespace/niroc created
[node1 ~]$ kubectl get ns
NAME              STATUS   AGE
corin             Active   5m3s
default           Active   29m
kube-node-lease   Active   29m
kube-public       Active   29m
kube-system       Active   29m
niroc             Active   9s

이제 nginx 파드를 -n 옵션을 통해 corin 네임스페이스에 띄워보면 정상적으로 나온다.

[node1 ~]$kubectl create -f nginx.yaml -n corin
pod/my-nginx created
[node1 ~]$ kubectl get pod -n corin
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          15s

옵션이 아닌 nginx yaml 파일에 namespace를 지정해서 파드를 띄울수도 있으며 아래와 같이 yaml 파일 수정한뒤 띄우면 정상적으로 원하는 niroc 네임스페이스에 띄워진것을 볼 수 있다.

[node1 ~]$ vi nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: my-nginx
  name: my-nginx
  namespace: niroc
spec:
  containers:
  - image: nginx
    name: my-nginx
:wq!
[node1 ~]$ kubectl get pod -n niroc
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          12s

이제 기본 네임스페이스를 수정 하는 방법을 알아보자!

이를 위해 쿠버네티스 config 를 수정해서 사용해야 하는데 아래와 같이 우선 config 를 보면 context 단위로 움직이는것을 볼 수 있으며 현재 컨텍스트(current-context)의 경우 kubernetes-admin@kubernetes 인것을 알 수 있다.

[node1 ~]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.0.13: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

위에 cluster, user는 같은 클러스터 유저를 사용하고 namespace 만 추가로 지정해서 corin@kubernetes context 를 생성한다.

[node1 ~]$ kubectl config set-context corin@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=corin
Context "corin@kubernetes" created.

 

config를 확인해보면 정상적으로 cotext가 생성 된 것을 볼 수 있다.

[node1 ~]$ kubectl config viewapiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.0.13:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: corin
    user: kubernetes-admin
  name: corin@kubernetes
- 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

현재 context 를 확인하면 기본으로 생성된 context 이며

[node1 ~]$ kubectl config current-context
kubernetes-admin@kubernetes

생성한 context 로 변경 하고 현재 context를 확인하면 정상적으로 변경 된것을 볼 수 있다.  

[node1 ~]$ kubectl config use-context corin@kubernetes
Switched to context "corin@kubernetes".
[node1 ~]$ kubectl config current-context
corin@kubernetes

이제 정상적으로 기본 네임스페이스가 corin 인지 확인을 위해 현재 떠있는 파드를 -n 옵션 없이(설정된 기본 네임스페이스에서) 제거하고 corin 네임스페이스에 떠있는 파드를 조회하면 제거 된것을 볼 수 있다.

[node1 ~]$ kubectl get pod        
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          13m
[node1 ~]$ kubectl delete pod my-nginx
pod "my-nginx" deleted
[node1 ~]$ kubectl get pod -n corin
No resources found in corin namespace.

이를 통해 기본 네임스페이스가 corin 으로 잘 설정 됐구나~ 를 알 수 있다.

이제 사용한 네임스페이스는 아래와 같이 제거하면 된다!

[node1 ~]$ kubectl delete namespace corin
namespace "corin" deleted
[node1 ~]$ kubectl delete namespace niroc
namespace "niroc" deleted

만약 네임스페이스를 제거하면 안에 파드는 어떻게될까?

해당 테스트를 위해 미리 제거할 네임스페이스에 파드를 띄워보고 제거해보았으며

[node1 ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
corin         my-nginx                        1/1     Running   0          11s
default       my-nginx                        1/1     Running   0          32m
kube-system   coredns-5d78c9869d-27k6n        1/1     Running   0          55m
kube-system   coredns-5d78c9869d-d2qlq        1/1     Running   0          55m
kube-system   etcd-node1                      1/1     Running   0          55m
kube-system   kube-apiserver-node1            1/1     Running   0          55m
kube-system   kube-controller-manager-node1   1/1     Running   0          55m
kube-system   kube-proxy-7lvcx                1/1     Running   0          55m
kube-system   kube-proxy-rdckv                1/1     Running   0          55m
kube-system   kube-router-6dn8b               1/1     Running   0          55m
kube-system   kube-router-t9lsq               1/1     Running   0          55m
kube-system   kube-scheduler-node1            1/1     Running   0          55m
niroc         my-nginx                        1/1     Running   0          23s
[node1 ~]$ kubectl delete namespace corin
namespace "corin" deleted

네임스페이스를 제거하면 안에 파드도 같이 제거 되는것을 볼 수 있다.

[node1 ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
default       my-nginx                        1/1     Running   0          33m
kube-system   coredns-5d78c9869d-27k6n        1/1     Running   0          55m
kube-system   coredns-5d78c9869d-d2qlq        1/1     Running   0          55m
kube-system   etcd-node1                      1/1     Running   0          55m
kube-system   kube-apiserver-node1            1/1     Running   0          55m
kube-system   kube-controller-manager-node1   1/1     Running   0          55m
kube-system   kube-proxy-7lvcx                1/1     Running   0          55m
kube-system   kube-proxy-rdckv                1/1     Running   0          55m
kube-system   kube-router-6dn8b               1/1     Running   0          55m
kube-system   kube-router-t9lsq               1/1     Running   0          55m
kube-system   kube-scheduler-node1            1/1     Running   0          55m
niroc         my-nginx                        1/1     Running   0          54s

끝!

728x90