6장. 라벨과 애노테이션
라벨은 파드와 레플리카셋 같은 쿠버네티스 객체에 연결할 수 있는 키/값 쌍으로, 쿠버네티스 객체에 식별 정보를 첨부하는데 매우 유용하다. 라벨은 객체를 그룹화하기 위한 기초를 제공한다. 애노테이션은 도구와 라이브러리에서 활용할 수 있게 비식별 정보를 유지해 설계된 키/값 쌍이다. 라벨과 다르게 쿼리, 필터링 또는 파드를 서로 구분하기 위한 수단이 아니다.
라벨
라벨은 객체의 메타데이터를 식별하는 기능을 제공한다. 라벨의 키는 두 부분으로 나눌 수 있는데, 선택적 접두사와 이름이며 슬래시(/)로 구분된다. 접두사가 지정된 경우, 반드시 DNS 하위 도메인이어야 한다.
라벨 적용
Before
# 디플로이먼트를 생성
kubectl run alpaca-prod \
--image=gcr.io/kuar-demo/kuard-amd64:blue \
--replicas=2 \
--labels="ver=1,app=alpaca,env=pod"
error: unknown flag: –replicas
The
--replicas
option was deprecated in Kubernetes 1.18 and removed in a Kubernetes 1.21.
After
# 디플로이먼트를 생성
kubectl create deployment alpaca-prod \
--image=gcr.io/kuar-demo/kuard-amd64:blue \
--replicas=2
# 라벨 적용
kubectl label deployments alpaca-prod ver=1 app=alpaca env=prod --overwrite=true
<라벨 기반의 벤다이어그램>
app, env, ver 별 그룹핑 가능
라벨 수정
# 라벨 수정
kubectl label deployments alpaca-prod ver=1 "canary=false"
error: ‘canary’ already has a value (true), and –overwrite is false –overwrite=true를 추가해야 함
# 라벨 제거
kubectl label deployments alpaca-prod ver=1 "canary-"
라벨 셀렉터
라벨 셀렉터는 라벨의 집합을 기반으로 쿠버네티스 객체를 필터링하는데 사용된다.
현재 클러스터에서 실행 중인 모든 파드의 상태 확인
kubectl get pods --show-labels
pod-template-hash
: 디플로이먼트에 적용되는 라벨로, 특정 파드가 어떤 템플릿 버전에서 생성됐는지 추적할 수 있음
ver 라벨이 2로 설정된 파드만을 나열
kubectl get pods --selector="ver=2"
or
kubectl get pods -l "ver=2"
app 라벨이 bandicoot 이면서 ver 라벨이 2로 설정된 파드만을 나열
kubectl get pods --selector="app=bandicoot,ver=2"
app 라벨이 alpaca 또는 bandicoot로 설정된 파드만을 나열
kubectl get pods --selector="app in (alpaca,bandicoot)"
셀렉터 연산자
API 객체의 라벨 셀렉터
쿠버네티스에서 특정 객체가 다른 객체 집합을 참조하고자 라벨 셀렉터를 사용한다. 이때, 구문 분석된 구조(parsed structure) 를 사용한다.
# app=alpaca, ver in (1, 2)
selector:
matchLabels:
app: alpaca
matchExpressions:
- {key: ver, operator: In, values: [1, 2]}
# app=alpaca, ver=1
selector:
app: alpaca
ver: 1
라벨은 쿠버네티스에서 애플리케이션을 서로 연결하고 관리해주는 강력한 도구다.
파드의 여러 복제본을 생성하고 유지 관리하는 레플리카셋의 경우, 셀렉터를 통해 관리 중인 파드를 찾는다.
서비스 로드밸런서의 경우, 셀렉터 쿼리를 통해 트래픽을 전달해야 하는 파드를 찾는다.
애노테이션
애노테이션은 메타데이터의 유일한 목적인, 쿠버네티스 객체에 추가적인 정보를 저장할 수 있는 장소를 제공한다.
라벨 vs 애노테이션 확실하지 않은 경우, 애노테이션을 통해 객체에 정보를 추가하고 셀렉터에서 사용하려는 경우, 라벨을 사용한다.
애노테이션은 어떤 용도로 사용되는가
객체의 최신 업데이트에 대한 이유 추적
라벨에 적합하지 않은 빌드, 릴리즈 또는 이미지 관련 정보 첨부
UI의 시각적 품질이나 유용성을 향상시키고자 추가 데이터 제공
…
애노테이션의 포맷
라벨 키와 동일한 포맷을 사용
추가적인 정보 제공에 주로 사용되므로, 키의 ‘네임스페이스’ 부분이 보다 중요
키의 예시) deployment.kubernetes.io/change-cause
애노테이션은 모든 쿠버네티스 객체의 공통 metadata 섹션에 정의된다.
...
metadata:
annotations:
example.com/icon-url: "https://example.com/icon.png"
...