[Kubernetes] Label, Select & Annotation

Label

레이블은 쿠버네티스 오브젝트에 첨부되는 키-값 쌍으로, 오브젝트의 특성을 정의한다. 레이블은 시스템 자체에는 직접적인 의미를 가지지 않지만, 사용자가 중요하게 여기는 정보를 담아 리소스를 식별하고 그룹화하는 데 주로 사용한다. 

  • 선택적 사용: 반드시 정의할 필요는 없지만, 효율적인 관리를 위해 자주 사용됨.
  • 동적 변경 가능: 오브젝트 생성 시 추가하거나 생성 후에도 수정/삭제 가능.
  • 검색 및 필터링: kubectl 명령어나 UI에서 쿼리를 통해 특정 레이블을 가진 리소스를 쉽게 찾을 수 있음.
apiVersion: v1
kind: Pod
metadata:
  name: myweb
  labels:
    app: apache
    env: dev
spec:
  containers:
  - name: myweb
    image: httpd
    ports:
    - containerPort: 80

여기서 app: apache와 env: dev는 각각 애플리케이션 이름과 환경을 나타내며 레이블 값은 개인 마음대로 지정해주면 된다. 

  • 레이블 확인
kubectl get pods --show-labels kubectl get pods <파드_이름> -o yaml
  • 레이블 추가/수정/삭제
kubectl label pods <파드_이름> key=value 
kubectl label pods <파드_이름> key=value --overwrite 
kubectl label pods <파드_이름> key-

Selector

Selector는 레이블을 기반으로 쿠버네티스 리소스를 선택하거나 연결하는 기능이다. 서비스, 디플로이먼트, 컨트롤러 등에서 특정 조건을 만족하는 오브젝트를 필터링할 때 사용된다. 

 

Equality-based Selector (일치 기반)

  • 특정 레이블 값과 동일하거나 같지 않은 리소스를 선택.
  • 연산자: =, ==, !=
kubectl get pods -l app=nginx 
kubectl get pods -l app!=nginx

Set-based Selector (집합 기반)

  • 레이블 값이 특정 집합에 속하거나 속하지 않을 때 사용.
  • 연산자: in, notin, exists, doesnotexist
kubectl get pods -l 'env in (dev, staging)' 
kubectl get pods -l 'env notin (production)' 
kubectl get pods -l 'env' 
kubectl get pods -l '!env'

Annotation

Annotation은 레이블과 유사하게 키-값 쌍으로 데이터를 저장하지만, 검색 및 리소스 연결에는 사용되지 않는 부가적인 정보를 제공한다. 어노테이션은 주로 사람이 읽거나 시스템이 활용하는 정보를 기록하는 데 사용된다. 

  • 비식별 정보 저장: 릴리스 버전, 타임스탬프, 디버깅 정보 등을 저장
  • 유연한 데이터 포맷: 크기 제한이 없으며 구조적/비구조적 데이터 모두 허용
  • 검색 불가: 레이블과 달리 오브젝트 검색에는 사용되지 않음
apiVersion: v1
kind: Pod
metadata:
  name: myweb
  annotations:
    created-by: "John Doe"
    build-version: "1.0.0"
spec:
  containers:
    - name: myweb
      image: httpd
      ports:
        - containerPort: 80
  • 어노테이션 추가/수정/삭제
kubectl annotate pods myweb environment="production"
→ Pod myweb에 environment: "production" 추가.

kubectl annotate pods myweb environment="staging" --overwrite
→ 기존 environment 값을 "staging"으로 변경.

kubectl annotate pods myweb environment-
→ environment annotation 제거.

Label과 Annotation 활용 사례

Label

  • 서비스 분류: 프론트엔드와 백엔드 파드를 구분 (tier: frontend, tier: backend)
  • 환경 구분: 개발, 테스트, 프로덕션 환경 (env: dev, env: prod)
  • 릴리스 관리: 릴리스 트랙을 식별 (release: stable, release: canary)

Annotation

  • 디버깅 정보: 생성 시간, 개발자 이름, 버전 정보
  • 빌드 정보: 이미지 해시, 릴리스 ID, Git 브랜치 정보
  • 로그 및 모니터링: 외부 시스템의 URL이나 리소스 포인터

'kubernetes' 카테고리의 다른 글

[Kubernetes] Pod Lifecycle(Probe)  (0) 2024.12.03
[Kubernetes] Node Scheduling (nodeSelector, nodeName, Label/Taint/Toleration)  (0) 2024.12.03
[Kubernetes] Namespace  (0) 2024.11.29
[Kubernetes] Kubernetes Objects  (0) 2024.11.28
[kubernetes] Pod  (0) 2024.11.27