[CKA] Kubernetes 동작 원리 및 namespace
이번 시간에는 쿠버네티스를 이루고있는 컴포넌트에 대해 알아보자!
아래 글에 상세하게 정리 해두어 아래 글을 참고하면 되며
위에 정리한거 이외에 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
끝!