03. Label์„ ์ด์šฉํ•œ Pod ๊ตฌ์„ฑ

2021. 4. 4. 13:15ใ†๐ŸŽฏ OpenSource/K8S

โ€ป ๋ณธ ๊ฒŒ์‹œ๊ธ€์€ ๋„์„œ <์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ธ ์•ก์…˜>์„ ํ† ๋Œ€๋กœ ์ •๋ฆฌ/ํ•™์Šตํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

Pod์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ labeling์„ ํ†ตํ•ด ์—ฐ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ๋ผ๋ฆฌ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

pod๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ๊ทธ๋ฃน๋ณ„ pod๋“ค์— ์›ํ•˜๋Š” ์ž‘์—…์„ ์ผ๊ด„์ ์œผ๋กœ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

3.3.1 Label?

Label์€ pod, deployment ๋“ฑ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐ์งํ™” ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

  • ๋ฆฌ์†Œ์Šค์— ์„ค์ •ํ•˜๋Š” Key:value ์Œ
  • Label Selector๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” label์„ ๊ฐ€์ง„ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ํ›„์—๋„ label ์ถ”๊ฐ€/์ˆ˜์ • ๊ฐ€๋Šฅ

3.3.2 Pod ์ƒ์„ฑํ•  ๋•Œ label ์ง€์ •ํ•˜๊ธฐ

๋‘ ๊ฐœ์˜ label์„ pod์˜ yaml ํŒŒ์ผ์— ์ง€์ •ํ•˜๊ณ  ๋™์ž‘ ๋ฐฉ์‹์„ ์•Œ์•„ ๋ณด๋„๋ก ํ•œ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  labels:
    creation_method: manual
    env: prod
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

pod๋ฅผ ์กฐํšŒํ•  ๋•Œ --show-labels ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ label ์ •๋ณด๋ฅผ ํ™•์ธํ•œ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl get po --show-labels
NAME                                READY   STATUS    RESTARTS   AGE     LABELS
kubia-manual                        1/1     Running   0          46m     <none>
kubia-manual-v2                     1/1     Running   0          9m44s   creation_method=manual,env=prod

ํ™•์ธ ํ•˜๊ณ  ์‹ถ์€ label์„ ๊ฐœ๋ณ„์˜ ํ•„๋“œ๋กœ ์ง€์ •ํ•˜์—ฌ ํ™•์ธ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl get po -L creation_method,env
NAME                                READY   STATUS    RESTARTS   AGE    CREATION_METHOD   ENV
kubia-manual                        1/1     Running   0          48m
kubia-manual-v2                     1/1     Running   0          11m    manual            prod

์ด๋ฏธ ์ƒ์„ฑ๋œ pod์— label์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl label po kubia-manual creation_method=manual
pod/kubia-manual labeled

root@master001:~/k8s_in_action/03_pod# kubectl get po -L creation_method,env
NAME                                READY   STATUS    RESTARTS   AGE    CREATION_METHOD   ENV
kubia-manual                        1/1     Running   0          50m    manual
kubia-manual-v2                     1/1     Running   0          12m    manual            prod

์ด๋ฏธ ์žˆ๋Š” ๋ผ๋ฒจ ์ˆ˜์ •ํ•  ๋•Œ๋Š” --overwrite ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl label po kubia-manual-v2 env=debug --overwrite
pod/kubia-manual-v2 labeled

root@master001:~/k8s_in_action/03_pod# kubectl get po -L creation_method,env
NAME                                READY   STATUS    RESTARTS   AGE    CREATION_METHOD   ENV
kubia-manual                        1/1     Running   0          51m    manual
kubia-manual-v2                     1/1     Running   0          14m    manual            debug

 

 

3.4.1 Label Selector

  • Label Selector๋กœ ํŠน์ • ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜์—ฌ ์›ํ•˜๋Š” pod์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Label Selector๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค.
    • ํŠน์ • key ํฌํ•จ / ํฌํ•จํ•˜์ง€ ์•Š๋Š” label
      root@master001:~/k8s_in_action/03_pod# kubectl get po -l env
      NAME              READY   STATUS    RESTARTS   AGE
      kubia-manual-v2   1/1     Running   0          26m
       
       
      root@master001:~/k8s_in_action/03_pod# kubectl get po -l '!env'
      NAME                                READY   STATUS    RESTARTS   AGE
      kubia-manual                        1/1     Running   0          62m
      nginx-deployment-7d95987b64-4pk8v   1/1     Running   0          4d5h
      nginx-deployment-7d95987b64-kxr44   1/1     Running   0          4d5h
      nginx-deployment-7d95987b64-thfs6   1/1     Running   0          4d5h
    • ํŠน์ • key์™€ value ๊ฐ€์ง„ label
      root@master001:~/k8s_in_action/03_pod# kubectl get po -l creation_method=manual
      NAME              READY   STATUS    RESTARTS   AGE
      kubia-manual      1/1     Running   0          61m
      kubia-manual-v2   1/1     Running   0          23m
      
      root@master001:~/k8s_in_action/03_pod# kubectl get po -l env!=debug
      NAME                                READY   STATUS    RESTARTS   AGE
      kubia                               1/1     Running   0          17h
      kubia-manual                        1/1     Running   0          123m
      nginx-deployment-7d95987b64-4pk8v   1/1     Running   0          11d
      nginx-deployment-7d95987b64-kxr44   1/1     Running   0          11d
      nginx-deployment-7d95987b64-thfs6   1/1     Running   0          11d
      podtest                             2/2     Running   56         39h
    • ํŠน์ •ํ•œ key ๊ฐ€์ง€์ง€๋งŒ ๋‹ค๋ฅธ ๊ฐ’ ๊ฐ€์ง„ label
      root@master001:~/k8s_in_action/03_pod# kubectl get po -l 'env in (prod,debug)'
      NAME              READY   STATUS    RESTARTS   AGE
      kubia-manual-v2   1/1     Running   0          7d11h
      
      root@master001:~/k8s_in_action/03_pod# kubectl get po -l 'env notin (prod,debug)'
      NAME                                READY   STATUS    RESTARTS   AGE
      kubia                               1/1     Running   0          17h
      kubia-manual                        1/1     Running   0          128m
      nginx-deployment-7d95987b64-4pk8v   1/1     Running   0          11d
      nginx-deployment-7d95987b64-kxr44   1/1     Running   0          11d
      nginx-deployment-7d95987b64-thfs6   1/1     Running   0          11d
      podtest                             2/2     Running   56         39h

3.4.2 Label Selector์—์„œ ์—ฌ๋Ÿฌ ์กฐ๊ฑด ์‚ฌ์šฉํ•˜๊ธฐ

Label Selector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๋™์‹œ์— ๋งŒ์กฑํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl get po --show-labels -l app=my-nginx,pod-template-hash
NAME                                READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-7d95987b64-4pk8v   1/1     Running   0          11d   app=my-nginx,pod-template-hash=7d95987b64
nginx-deployment-7d95987b64-kxr44   1/1     Running   0          11d   app=my-nginx,pod-template-hash=7d95987b64
nginx-deployment-7d95987b64-thfs6   1/1     Running   0          11d   app=my-nginx,pod-template-hash=7d95987b64

 

 

3.5 Label, Selector ์‚ฌ์šฉํ•˜์—ฌ Pod ์Šค์ผ€์ค„๋ง ์ œํ•œํ•˜๊ธฐ

pod๋ฅผ ์Šค์ผ€์ค„๋งํ•  ๋•Œ ํŠน์ • ์กฐ๊ฑด์„ ๊ฐ–์ถ˜ node ์œ„์— ๋ฐฐํฌํ•˜๋„๋ก ์ œํ•œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.

kubernetes์˜ ํŠน์„ฑ์ƒ ๋ฐฐํฌํ•  node๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, label๋กœ ์ง€์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” node์— ์Šค์ผ€์ค„๋ง ํ•˜๋„๋ก ํ•œ๋‹ค. ์ด๋Š” node selector์™€ label selector๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3.5.1 label์„ ์‚ฌ์šฉํ•˜์—ฌ worker node ๋ถ„๋ฅ˜

label์€ pod ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ node, deployment, service ๋“ฑ ๋ชจ๋“  kubernetes ์˜ค๋ธŒ์ ํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

cluster์ค‘ node์˜ ๋ฆฌ์†Œ์Šค ์ŠคํŽ™์ด ๋‹ค๋ฅผ๋•Œ, ํŠน์ • pod๋ฅผ gpu node์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ์‹ค์Šต์„ ํ•ด ๋ณด๋„๋ก ํ•œ๋‹ค.

worker1์ด gpu ์„œ๋ฒ„๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , labeling์„ ํ•œ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl label node worker001 gpu=true
node/worker001 labeled
 
 
root@master001:~/k8s_in_action/03_pod# kubectl get no -L gpu
NAME        STATUS   ROLES                  AGE   VERSION   GPU
master001   Ready    control-plane,master   26d   v1.20.4
worker001   Ready    <none>                 26d   v1.20.4   true
worker002   Ready    <none>                 26d   v1.20.4

 

 

3.5.2 ํŠน์ • node์— pod ์Šค์ผ€์ค„๋ง

gpu ๋ผ๋ฒจ์„ ๊ฐ€์ง„ ํŠน์ • node์— ์Šค์ผ€์ค„๋ง ๋˜๋„๋ก yaml ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.

nodeSelector๋Š” gpu=true ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ node์— ํ•ด๋‹น pod๋ฅผ ๋ฐฐํฌํ•˜๋„๋ก ํ•œ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeSelector:
    gpu: "true"
  containers:
  - image: luksa/kubia
    name: kubia

 

root@master001:~/k8s_in_action/03_pod# kubectl get pod kubia-gpu -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
kubia-gpu   1/1     Running   0          21s   172.30.65.92   worker001   <none>           <none>

 

3.5.3 ํ•˜๋‚˜์˜ ํŠน์ • node์— ์Šค์ผ€์ค„๋ง

k8s cluster์˜ ๋ชจ๋“  ๋…ธ๋“œ์—๋Š” hostname์— ๋Œ€ํ•œ label์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ nodeSelector ํ•ญ๋ชฉ์— ํŠน์ • hostname์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜,
ํ•ด๋‹น node๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ด๋ฉด ์Šค์ผ€์ค„๋ง์ด ์•„์˜ˆ ๋˜์ง€ ์•Š๋Š”๋‹ค. ํŠน์ • hostname์œผ๋กœ ์ œํ•œํ•˜๋Š”๊ฑด ์ง€์–‘ํ•˜๋„๋ก ํ•œ๋‹ค.

kubectl describe ๋ช…๋ น์–ด๋กœ ๋‹ค์Œ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Name:               worker001
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    gpu=true
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=worker001
                    kubernetes.io/os=linux

 

3.6 Pod์— Annotaion ๋‹ฌ๊ธฐ

Annotaion?

  • key-value ์Œ
  • label๊ณผ ๋‹ฌ๋ฆฌ annotaion์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ทธ๋ฃนํ™” ํ•  ์ˆ˜ ์—†๋‹ค.
  • object์— ๋ฒ„์ „์ •๋ณด, ๋‹ด๋‹น๊ฐœ๋ฐœ์ž ์ •๋ณด ๋“ฑ์˜ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๋„๋ก ํ•œ๋‹ค
  • label ๋ณด๋‹ค ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ ์„ ์ˆ˜ ์žˆ๋‹ค

 

3.6.1 ์˜ค๋ธŒ์ ํŠธ์˜ annotation ์กฐํšŒ

kubectl describe๋ฅผ ํ†ตํ•ด object์— annotaion์ด ์–ด๋–ค์‹์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š”์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl describe node worker001
...
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4Address: 172.16.110.20/24
                    projectcalico.org/IPv4VXLANTunnelAddr: 172.30.65.64
                    volumes.kubernetes.io/controller-managed-attach-detach: true

์˜ค๋ธŒ์ ํŠธ์˜ yaml ๋ช…์„ธ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 172.30.254.27/32
    cni.projectcalico.org/podIPs: 172.30.254.27/32
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"kubia-manual","namespace":"default"},"spec":{"containers":[{"image":"luksa/kubia","name":"kubia","ports":[{"containerPort":8080,"protocol":"TCP"}]}]}}

 

3.6.2 Annotation ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •

pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์„ฑ ํ›„์—๋„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl annotate pod kubia-manual wglee/annotation="WonGyeong Lee"
pod/kubia-manual annotated

์ถ”๊ฐ€ํ•œ annotation์„ ํ™•์ธํ•œ๋‹ค.

root@master001:~/k8s_in_action/03_pod# kubectl describe pod kubia-manual | vi -
Annotations:  cni.projectcalico.org/podIP: 172.30.254.27/32
              cni.projectcalico.org/podIPs: 172.30.254.27/32
              wglee/annotation: WonGyeong Lee