본문 바로가기

Kubenetes/Kubernetes Pods

Pod 3 - (Label을 이용한 Pod 구성)

[라벨 소개]

 

- 라벨은 포드 뿐만 아니라 쿠버네티스의 모든 리소스를 구성하는 간단하면서도 강력한 쿠버네티스 기능

- 라벨은 리소스에 첨부하는 임의의 키/값 쌍이다.

- 라벨 셀렉터를 사용해 리소스를 선택할 때 활용

- 리소스는 해당 라벨의 키가 해당 자원 내에서 고유한 경우 하나 이상의 라벨을 가질 수 있다.

 

- 각각의 포드는 두개의 라벨이 있다.

 ㅁ app은 포드가 속한 애플리케이션이며, 구성 요소 또는 마이크로서비스를 지정한다.

 ㅁ rel은 포드에서 실행 중인 애플리케이션이 안정적 버전, 베타 혹은 카나리 버전인지 여부를 표시

 

정의: 카나리 버전은 안정적인 버전 이외의 새로운 버전의 애플리케이션을 배포할 때 사용. 모든 사용자에게 배포하기 전에 일부 사용자가 새로운 버전을 사용해 동작 방법을 살펴 볼 수 있다. 이렇게 하면 문제가 있는 릴리스 버전이 많은 사용자에게 노출되지 않음.

 

마이크로 서비스 아키텍처의. 분류되지 않은 포드
포드 라벨로 마이크로 서비스 내에 포드 구성하기

 

[포드를 만들 때 라벨 지정]

 

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

 

create_method=manual 라벨과 env=data.labels를 포함

 

$ kubectl create -f kubia-manual-with-labels.yaml

pod "kubia-manual-v2" create

 

-- show-labels 스위치를 사용하여 라벨 확인 가능

$ kubectl get po --show-labels

 

모든 라벨을 나열하는 대신 특정 라벨에만 관심이 있는 경우 -L 스위치를 사용해 라벨을 지정후 지정한 열에 표시 가능

$ kubectl get po -L creation_method, env

 

[포드의 라벨 수정]

 

수동으로 생성된 kubia-manual 포드에 creation_method=manual 라벨 추가

$ kubectl label po kubia-manual creation_method=manual

pod "kubia-manual" labeld 

 

기존 라벨 env=prod 라벨을 env=debug로 수정 --overwrite 옵션 사용

$ kubectl label po kubia-manual-v2 env=debug --overwrite

pod "kubia-manual-v2" labeled

 

[라벨 셀렉터를 사용한 포드 나열]

 

- 라벨은 라벨 셀렉터와 함께 사용된다.

- 라벨 셀렉터를 사용하면 특정 라벨로 태그가 지정된 포드의 하위 집합을 선택하고 해당 포드에서 작업을 수행할 수 있다.

- 라벨 셀렉터는 특정 값의 특정 라벨을 포함하는지 여부에 따라 리소스를 필터링하는 기준이 됨.

- 라벨 셀렉터는 리소스 여부에 따라 리소스를 선택할 수 있다.

 ㅁ 특정 키가 있는 라벨 포함(또는 포함하지 않음)

 ㅁ 특정 키와 값이 있는 라벨을 포함

 ㅁ 특정 키가 있지만 지정한 값과 다른 값이 있는 라벨을 포함

 

수동으로 생성한 모든 포드를 보려면 

$ kubectl get po -l creation_method=manual

 

해당값이 무엇이든 간에 env 라벨을 포함하는 모든 포드를 나열하면

$ kubectl get po -l env

 

env 라벨이 없는 사용자는 

$ kubectl get po -l '!env'

--> bash shell이 느낌표를 인식하지 못하도록 !env 주위에 작은 따옴표를 사용해야 함.

 

포드를 다음 라벨 셀렉터와 일치 가능

 

ㅁ creation_method!=manual은 manual 이외의 다른 값으로 creation_method 라벨이 있는 포드 선택

ㅁ env in (prod, devel)은 env 라벨이 prod 또는 devel로 설정된 포드를 선택

ㅁ env notin (prod, devel)은 env 라벨이 prod 또는 devel이 아닌 다른 값으로 설정된 포드를 선택

 

[app=pc 라벨 셀렉터를 사용해 아래의 전체 포드를 선택 가능]

 

 

[포드 스케줄링 제약을 위한 라벨과 셀렉터의 사용]

 

만약 GPU 컴퓨팅에 사용되는 GPU 서버 노드에 라벨 gpu=true을 추가하려고 하면

$ kubectl label node gke-kubia-85f6-node-0rrx gpu=true

 

만약 gpu=true 가 포함된 노드만 나열하려고 하면

$ kubectl get nodes -l gpu=true

 

[노드 지정으르 위한 포드 스케줄링]

 

GPU가 필요한 새 포드를 배포할 때 GPU를 제공하는 노드 중 하나로만 선택하도록 요청하려고 하면 포드의 YAML에 노드 셀렉터를 추가한다.

apiVersion: v1
kind: Pod
metadata:
    name: kubia-gpu
spec:
    nodeSelector:   # nodeSelector는 쿠버네티스에게 gpu-true 라벨을 포함하는 노드에만 이 포드를 배포하도록 지시
        gpu: "true"
    containers:
    - image: luksa/kubia
      name: kubia