Lable의 역할

작성자 김아름 수정일 2022-10-12 08:47

#label, #kubernetes, #쿠버네티스, #라벨, #node label

들어가며

  • pod의 수가 증가함에 따라, pod를 관리할 때 pod를 그룹화하면 그룹별 pod들에 원하는 작업을 일괄적으로 적용시킬 수 있습니다.



Label이란?

  • label은 pod와 같은 오브젝트에 첨부된 key-value 로 구성됩니다.
  • label은 오브젝트의 특성을 식별하는 데 사용됩니다.
  • node를 포함하여 pod, deployment, service 등 모든 리소스에 할당할 수 있습니다.
  • 중요한 것은, label이 label selector와 함께 사용된다는 것입니다.

label selector는 특정 label로 tag된 pod의 부분 집합을 선택하여 원하는 작업을 수행합니다.
label selector는 특정 값과 label을 갖는지 여부에 따라 리소스를 필터링하는 기준이 됩니다.


Label을 작성하는 방법은 아래와 같습니다.


"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}


pod에 label을 구성하는 방법을 알아보겠습니다.

  1. yaml로 작성하기
    apiVersion: v1
    kind: Pod
    metadata:
      name: label-demo
      labels:
        environment: production
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
    kubectl get po --show-labels | grep label-demo
    NAME                               READY             STATUS         RESTARTS        AGE      LABELS
    label-demo                      1/1                    Running        0                    27s        app=nginx,environment=production

  2. cli로 작성하기

    kubectl label pod <pod name> <key>=<value>
    
    kubectl get po --show-labels | grep demo
    NAME                               READY             STATUS         RESTARTS        AGE      LABELS
    label-demo                      1/1                    Running        0                    27s        app=nginx,environment=production
    label-demo2                    1/1                    Running        0                    27s        <none>

    현재 label-demo2 pod에는 label이 구성되어 있지 않습니다.
    kubectl label pod label-demo2 name=test
    pod/label-demo2 labeled
    
    kubectl get po --show-labels | grep demo
    NAME                               READY             STATUS         RESTARTS        AGE      LABELS
    label-demo                      1/1                    Running        0                    27s        app=nginx,environment=production
    label-demo2                    1/1                    Running        0                    27s        name=test


    key는 name, value는 test 라는 label이 생성된 것을 확인할 수 있습니다.



pod label의 key, value값을 재정의 하는 방법은 아래와 같습니다.

kubectl label pod <pod name> <key>=<new value> --overwrite

kubectl label pod label-demo2 name=test2 --overwrite
pod/label-demo2 labeled
kubectl get po --show-labels | grep demo
NAME                               READY             STATUS         RESTARTS        AGE      LABELS
label-demo2                    1/1                    Running        0                    27s        name=test2


pod의 label을 삭제하는 방법은 아래와 같습니다.

kubectl label pod <pod name> <key>-

kubectl label pod label-demo app-
pod/label-demo labeled
kubectl get po --show-labels | grep demo
NAME                               READY             STATUS         RESTARTS        AGE      LABELS
label-demo                      1/1                    Running        0                    27s        environment=production


다음으로, node에 label을 구성하는 방법을 알아보겠습니다.

node label
node의 특성을 label로 설정하여, pod를 배치할 때 node를 선택할 수 있도록 합니다.


  • node의 label 조희
    kubectl get nodes --show-labels
    NAME     STATUS   ROLES    AGE   VERSION    LABELS
    master   Ready    master   76d   v1.18.19   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,
    kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,master=true,
    node-role.kubernetes.io/master=,sodaflow/nginx-proxy=true,sodaflow/sodaflow-master-area=true,
    sodaflow/sodaflow-worker-area=true
    worker   Ready    <none>   69d   v1.18.19   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,
    kubernetes.io/arch=amd64,kubernetes.io/hostname=worker,kubernetes.io/os=linux,sodaflow/gpu-enabled=true,sodaflow/nginx-proxy=true,sodaflow/sodaflow-master-area=true,sodaflow/sodaflow-worker-area=true,worker=true

  • node에 label 지정
    kubectl label nodes <node name> <key>=<value>
    
    kubectl label node worker testKey=testValue
    node/worker labeled
    kubectl get nodes --show-labels
    NAME     STATUS   ROLES    AGE   VERSION    LABELS
    master   Ready    master   76d   v1.18.19   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,
    kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,master=true,
    node-role.kubernetes.io/master=,sodaflow/nginx-proxy=true,sodaflow/sodaflow-master-area=true,
    sodaflow/sodaflow-worker-area=true
    worker   Ready    <none>   69d   v1.18.19   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,
    kubernetes.io/arch=amd64,kubernetes.io/hostname=worker,kubernetes.io/os=linux,sodaflow/gpu-enabled=true,sodaflow/nginx-proxy=true,sodaflow/sodaflow-master-area=true,sodaflow/sodaflow-worker-area=true,testKey=testValue,worker=true
    worker 라는 이름의 node에 key 값은 testKey, value값은 testValue 가 설정되었습니다.

  • node label을 활용하여 pod 배치하기
    pod의 yaml파일에 아래와 같이 nodeSelector을 활용하여, 원하는 node에 pod를 배치할 수 있습니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: label-demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
      nodeSelector:
        testKey: testValue
    kubectl get po -owide
    NAME                  READY            STATUS               RESTARTS         AGE             IP                     NODE
    label-demo          1/1                 Running              0                       3m48s        6.2.171.108       worker
    nodeSelector에 key값은 testKey, value 값은 testValue를 지정하여 pod를 생성한 결과, 해당 label을 가지고 있는 worker node에 pod가 배치되었습니다.



마무리

  • label이 무엇 인지와 역할에 대해 알아보았습니다.

  • pod와 node에 label을 지정하는 방법을 알아보았습니다.

  • pod의 nodeSelector를 보고, msater가 적정한 node에 pod를 배치하는 것을 확인해 보았습니다.

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300