본문 바로가기

K8S

쿠버네티스(Kubernetes) Label & Annotation

728x90

■ 쿠버네티스(Kubernetes) Label & Annotation 개요

  • Label
    • 파드와 같은 오브젝트에 첨부된 키와 값의 쌍
    • 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없음.
    • 오브젝트를 생성할 때에 붙이거나 생성 이후에 붙이거나 언제든지 수정이 가능하다. 오브젝트마다 키와 값으로 레이블을 정의할 수 있으며 오브젝트에 붙이는 키 값은 고유한 값이어야 한다.
    • 레이블은 UI와 CLI에서 효율적인 쿼리를 사용하고 검색에 사용하기에 적합하며, 식별되지 않는 정보는 어노테이션으로 기록 한다.
  • Annotation
    • 어노테이션도 레이블과 같이 키와 값의 쌍의 정보를 사용함.
    • 레이블을 사용하여 오브젝트를 선택하고, 특정 조건을 만족하는 오브젝트 컬렉션을 찾을 수 있다. 반면에, 어노테이션은 오브젝트를 식별하고 선택하는데 사용되지 않는다.
    • 어노테이션의 메타데이터는 작거나 크고, 구조적이거나 구조적이지 않을 수 있으며, 레이블에서 허용되지 않는 문자를 포함할 수 있다.
    • 어노테이션을 활용하면 임의의 비-식별 메타데이터를 오브젝트에 첨부할 수 있음.

 

 쿠버네티스(Kubernetes) Label & Annotation 문법

  • 문법 구성은 의 쌍으로 이루어 지며, 키를 구성하는 값은 접두사와 이름으로 구성할 수 있다. 키를 구성할 때 이름은 필수이다. 접두사를 포함하여 사용할 경우 슬래시(/)로 구분한다. 
  • 이름 세그먼트는 영문 숫자([a-z0-9A-Z])로 시작하고 끝나는 63자 이하이어야 하고, 사이에 대시(-), 밑줄(_), 점(.)이 들어갈 수 있다.
  • 접두사는 DNS 서브도메인이어야 한다. 점(.)으로 구분된 일련의 DNS 레이블은 총 253자를 넘지 않고, 뒤에 슬래시(/)가 붙는다. kubernetes.io/와 k8s.io/ 접두사는 쿠버네티스 핵심 구성 요소를 위해 예약되어 있다.
  • 접두사가 생략된 키는 일반적으로 사용자 정의 항목으로 간주되며, 쿠버네티스 시스템이나 다른 사용자에게 공개되지 않고 특정 애플리케이션 또는 팀 내에서만 사용 가능하다. 
# Label & Annotations

apiVersion: v1
kind: Pod
metadata:
  name: label-annotation-demo
  labels:
    environment: production
    app: nginx
  annotations:
    imageregistry: "https://hub.docker.com/"  
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

 

 쿠버네티스(Kubernetes) Label Selector

  • Label Selector를 통해 클라이언트와 사용자는 오브젝트 식별이 가능함
  • Label Selector는 쿠버네티스 코어 그룹의 기본이며 "일치성 기준"과 "집합성 기준" 이라는 두 종류의 셀렉터를 지원함. 그리고 두 종류 모두 OR(||) 연산자를 지원하지 않음
    • 일치성 기준
      1. =,==,!= 3가지 연산자를 지원함. =, == 일치성(동의어)를 !=는 불일치를 의미함
      2. environment = production
        tier != frontend
         
        • environment 키를 가지는 것과 production 이라는 값을 가지는 모든 리소스를 선택하고, tier 키를 가지는 것 중에 frontend라는 값을 제외한 모든 리소스를 선택하는 구문. != 연산자는 공백을 포함한다.
        • 레이블 셀럭터는 Pod를 검색하는 필터 목적으로도 사용되지만 노드를 선택하는 기준으로 지정하는 목적으로도 사용할 수 있다.
      3. apiVersion: v1
        kind: Pod
        metadata:
          name: cuda-test
        spec:
          containers:
            - name: cuda-test
              image: "registry.k8s.io/cuda-vector-add:v0.1"
              resources:
                limits:
                  nvidia.com/gpu: 1
          nodeSelector:
            accelerator: nvidia-tesla-p100
         해당 샘플은 Pod가 노드를 선택하는 기준을 지정하는 예제이며, Pod는 accelerator: nvidia-tesla-p100 라는 레이블을 가진 노드를 선택하게 된다.
    • 집합성 기준
      1. 값 집합을 키로 필터링을 수행 할 수 있다. in, notin, exists 3개의 연산자를 지원하며 키 식별자만 해당 한다.
      2. environment in (production, qa)
        tier notin (frontend, backend)
        partition
        !partition
        • 첫 번째 예시에서 키가 environment이고 값이 production 또는 qa인 모든 리소스를 선택한다.
        • 두 번째 예시에서 키가 tier이고 값이 frontend와 backend를 가지는 리소스를 제외한 모든 리소스와 키로 tier를 가지고 값을 공백으로 가지는 모든 리소스를 선택한다.
        • 세 번째 예시에서 레이블의 값에 상관없이 키가 partition을 포함하는 모든 리소스를 선택한다.
        • 네 번째 예시에서 레이블의 값에 상관없이 키가 partition을 포함하지 않는 모든 리소스를 선택한다.

 

 

728x90