본문으로 건너뛰기

Labels-And-Selectors

1 Labels

  • 레이블은 파드와 모든 다른 쿠버네티스 리소스를 조직화할 수 있는 단순하면서 강력한 쿠버네티스 기능이다.
  • 레이블은 키와 밸류의 쌍으로 오브젝트에 부여된다.
  • 이 쌍은 레이블 셀렉터를 사용해 리소스를 선택할 때 사용된다.
  • 일반적으로 리소스를 생성할 때 레이블을 붙이지만 생성 이후에 레이블을 수정할 수 있다

1.1 사용 예시

  • 아래와 같이 두 개의 레이블을 가지는 파드를 생성해보자
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

확인

$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-manual-v2 1/1 Running 0 33s creation_method=manual,env=prod

특정 레이블만 보기

  • -L 에 보고싶은 레이블을 지정한다.
$ kubectl get pods -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
kubia-manual-v2 1/1 Running 0 84s manual prod
mysql-0 1/1 Running 0 9d

1.2 레이블 수정

  • 기존 레이블의 값을 변경하려면 --overwrite 옵션이 필요하다
$ kubectl label pod kubia-manual-v2 env=debug --overwrite
pod/kubia-manual-v2 labeled

## debug로 변경된 것을 확인
$ kubectl get pods -L env
NAME READY STATUS RESTARTS AGE ENV
kubia-manual-v2 1/1 Running 0 4m31s debug

1.3 자주 사용되는 Labels

release

  • "release" : "stable", "release" : "canary"

environment

  • "environment" : "dev", "environment" : "qa", "environment" : "production"

tier

  • "tier" : "frontend", "tier" : "backend", "tier" : "cache"

partition

  • "partition" : "customerA", "partition" : "customerB"

track

  • "track" : "daily", "track" : "weekly"

2 Selectors

  • 레이블은 레이블 셀렉터와 같이 사용된다.
  • 레이블 셀렉터는 특정 레이블로 태그된 파드의 부분 집합을 선택해 원하는 작업을 수행한다

레이블 셀렉터의 리소스 선택 기준

  • 특정 키를 포함하거나 포함하지 않는 레이블
  • 특정 키와 값을 가진 레이블
  • 특정 키를 갖고 있지만 다른 값을 가진 레이블

2.1 예시

## env 레이블을 가지고 있고 값이 'manual'인 파드 조회
$ kubectl get pods -l creation_method=manual --show-labels

NAME READY STATUS RESTARTS AGE LABELS
kubia-manual-v2 1/1 Running 0 11m creation_method=manual,env=debug
## env 레이블을 가지고 있지만 값은 상관없는 파드를 조회
$ kubectl get pods -l env --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-manual-v2 1/1 Running 0 9m20s creation_method=manual,env=debug

## env 레이블을 가지고 있지 않은 파드를 조회
$ kubectl get pods -l '!env' --show-labels
NAME READY STATUS RESTARTS AGE LABELS
test 1/1 Running 1 (2d4h ago) 2d4h run=test
test-rs-g6s6x 1/1 Running 0 9d app=nginx
test-rs-kpspg 1/1 Running 0 9d app=nginx
test-rs-wv7nq 1/1 Running 0 9d app=nginx

2.2 nodeSelector

  • 레이블 셀렉터는 kubectl에서만 사용하는 것이 아니라 내부적으로도 사용된다.
  • 워커 노드 분류에 레이블을 사용하고 파드를 특정 노드에 스케줄링 되도록 만들어보자.
## 노드가 GPU를 가지고 있음을 보여주는 레이블을 노드에 추가한다.
$ kubectl label node worker1 gpu=true
node/worker1 labeled

## 노드의 레이블이 gpu이고 값이 true인 노드를 조회한다.
$ kubectl get nodes -l gpu=true -L gpu
NAME STATUS ROLES AGE VERSION GPU
worker1 Ready <none> 15d v1.25.3 true

스케줄러가 GPU를 제공하는 노드에 파드를 배치할 수 있도록 아래와 같이 노드셀렉터를 이용한다.

spec.nodeSelector 노드 셀렉터가 gpu=true 레이블을 포함하는 노드에 이 파드를 배포하도록 지시한다.

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