brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Feb 20. 2023

3. 오라클 클라우드 - 쿠버네티스 -라벨,셀렉터

pod에 라벨 붙여 사용해보자

워커 노드에 라벨 붙여, 라벨 지정 노드에 파드를 생성해보자 -  nodeSelector 



<1> Pod에 라벨 지정, 사용, 삭제

<2 node에 라벨을 지정하고,  pod 생성시 해당 라벨과 일치하는 node에 pod를 만든다.



<1> Pod에 라벨 지정, 사용, 삭제


1

노드 확인

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get nodes

NAME          STATUS   ROLES   AGE     VERSION

10.0.10.141   Ready    node    5d22h   v1.25.4

10.0.10.80    Ready    node    5d22h   v1.25.4


2

파드 확인

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pods 

No resources found in default namespace.


3

라벨 지정된  파드 생성해보기


파일 생성하기

topasvga@cloudshell:~ (ap-seoul-1)$ cat << EOF > labels.yaml

> apiVersion: v1

> kind: Pod

> metadata:

>   name: myweb1

>   labels:

>     environment: production

>     app: nginx

> spec:

>   containers:

>   - image: nginx

>     name: myweb1

>     ports:

>     - containerPort: 80

>       protocol: TCP

> ---

> apiVersion: v1

> kind: Pod

> metadata:

>   name: myweb2

>   labels:

>     environment: dev

>     app: nginx

> spec:

>   containers:

>   - image: nginx

>     name: myweb2

>     ports:

>     - containerPort: 80

>       protocol: TCP

> EOF





4

파드 만들기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl apply -f labels.yaml

pod/myweb1 created

pod/myweb2 created


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pods

NAME     READY   STATUS    RESTARTS   AGE

myweb1   1/1     Running   0          28s

myweb2   1/1     Running   0          28s



5

파드의 라벨 보기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod --show-labels

NAME     READY   STATUS    RESTARTS   AGE   LABELS

myweb1   1/1     Running   0          51s   app=nginx,environment=production

myweb2   1/1     Running   0          51s   app=nginx,environment=dev



6

app=nginx  label pod 보기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod -l app=nginx

NAME     READY   STATUS    RESTARTS   AGE

myweb1   1/1     Running   0          74s

myweb2   1/1     Running   0          74s



7

porduction 라벨 pod 보기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod -l environment=production

NAME     READY   STATUS    RESTARTS   AGE

myweb1   1/1     Running   0          88s


8

라벨 environment=production 파드만 지우기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl delete pod -l environment=production

pod "myweb1" deleted


9

라벨 모두 보기

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod --show-labels

NAME     READY   STATUS    RESTARTS   AGE    LABELS

myweb2   1/1     Running   0          112s   app=nginx,environment=dev


10

app으로 시작하는 라벨만 지우기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl label pod myweb2 app-

pod/myweb2 unlabeled



11

라벨 보기

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod --show-labels

NAME     READY   STATUS    RESTARTS   AGE     LABELS

myweb2   1/1     Running   0          2m17s   environment=dev



12

파드 모두 지우기

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl delete pod --all

pod "myweb2" deleted


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod

No resources found in default namespace.



13

화면 정리

clear




<2 node에 라벨을 지정하고,  pod 생성시 해당 라벨과 일치하는 node에 pod를 만든다.


1

예를 들어 gpu서버를 특정 work node에 배치할때 사용한다.



2

node에도 라벨이 있다.

node의 라벨을 보자


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get node --show-labels

NAME          STATUS   ROLES   AGE     VERSION   LABELS

10.0.10.141   Ready    node    5d23h   v1.25.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=VM.Standard.E3.Flex,beta.kubernetes.io/os=linux,displayName=oke-c2lqg34zlva-n5pdjpab7qa-snhapqbwwhq-1,failure-domain.beta.kubernetes.io/region=ap-seoul-1,failure-domain.beta.kubernetes.io/zone=AP-SEOUL-1-AD-1,hostname=oke-c2lqg34zlva-


10.0.10.80    Ready    node    5d23h   v1.25.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=VM.Standard.E3.Flex,beta.kubernetes.io/os=linux,displayName=oke-c2lqg34zlva-n5pdjpab7qa-snhapqbwwhq-0,failure-domain.beta.kubernetes.io/region=ap-seoul-1,failure-domain.beta.kubernetes.io/zone=AP-SEOUL-1-AD-1,hostname=oke-c2lqg34zlva-n5pdjpab7qa-snhapqbwwhq-



2

노드 141에  gpu=ndivia 라벨을 붙인다.

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl label node 10.0.10.141 gpu=ndivia

node/10.0.10.141 labeled


80에도 붙인다.

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl label node 10.0.10.80 gpu=ndivia

node/10.0.10.80 labeled



3

확인

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get nodes -l gpu=ndivia

NAME          STATUS   ROLES   AGE     VERSION

10.0.10.141   Ready    node    5d23h   v1.25.4

10.0.10.80    Ready    node    5d23h   v1.25.4


4

141에 gpu 라벨  지운다.

 gpu- 하면 gpu 라벨이 지워진다.

topasvga@cloudshell:~ (ap-seoul-1)$ kubectl label nodes 10.0.10.141 gpu-

node/10.0.10.141 unlabeled



5

gpu 라벨 붙은 노드를 확인한다.

80이다.


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get nodes -l gpu=ndivia

NAME         STATUS   ROLES   AGE     VERSION

10.0.10.80   Ready    node    5d23h   v1.25.4



6

nodeSelector: 로  노드  라벨이  gpu: ndivia 인곳에 파드를 생성한다.


topasvga@cloudshell:~ (ap-seoul-1)$ cat << EOF > labels-node.yaml

> apiVersion: v1

> kind: Pod

> metadata:

>   name: myweb

> spec:

>   containers:

>   - image: nginx

>     name: myweb

>     ports:

>     - containerPort: 80

>       protocol: TCP

>   nodeSelector:

>     gpu: ndivia

> EOF



7

파드 만들기


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl apply -f labels-node.yaml

pod/myweb created


8

노드 80에 만들어 졌는지 확인하자.


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod -o wide

NAME    READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES

myweb   1/1     Running   0          5s    10.244.0.16   10.0.10.80   <none>           <none>


9

파드 이름을 바꾸어서 몇개 더 만들어 보자


topasvga@cloudshell:~ (ap-seoul-1)$ cat labels-node.yaml | sed "s/name: myweb/name: myweb2/g" | kubectl apply -f -

pod/myweb2 created



topasvga@cloudshell:~ (ap-seoul-1)$ cat labels-node.yaml | sed "s/name: myweb/name: myweb3/g" | kubectl apply -f -

pod/myweb3 created


topasvga@cloudshell:~ (ap-seoul-1)$ cat labels-node.yaml | sed "s/name: myweb/name: myweb4/g" | kubectl apply -f -

pod/myweb4 created



10

확인하자.

모두 노드 80에 만들어 졌다.


topasvga@cloudshell:~ (ap-seoul-1)$ kubectl get pod -o wide

NAME     READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES

myweb    1/1     Running   0          80s   10.244.0.16   10.0.10.80   <none>           <none>

myweb2   1/1     Running   0          28s   10.244.0.17   10.0.10.80   <none>           <none>

myweb3   1/1     Running   0          23s   10.244.0.18   10.0.10.80   <none>           <none>

myweb4   1/1     Running   0          16s   10.244.0.19   10.0.10.80   <none>           <none>

topasvga@cloudshell:~ (ap-seoul-1)$ 



11

삭제

kubectl delete pod --all



감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari