쿠버네티스(3) : Label & Annotation

NOHHYEONGJUN·2024년 9월 7일

쿠버네티스

목록 보기
4/23

Label

  • 라벨은 파드뿐 아니라 쿠버네티스의 모든 리소스를 구성하는 간단하고 강력한 기능
  • 리소스에 부여하는 임의의 Key/Value 쌍
  • 라벨 셀렉터를 사용해 리소스를 선택할 때 사용
  • 일반적으로 리소스를 만들 때 부여하지만, 이후에도 라벨을 추가 혹은 변경 가능
  • 필터링에 사용. (라벨의 개수 = 차원)

 

 


1. Label 활용

  • app는 파드가 속한 애플리케이션, 구성요소 또는 마이크로 서비스 지정
  • rel은 파드에서 실행중인 애플리케이션의 안정적 버전, 베타 혹은 카나리 버전인지 여부
  • app과 rel을 추가하면서 파드들을 2가지 차원으로 구성


 

 


2. Label 지정

  • yaml 파일에 객체 선언 시에 metadata 내에 labels 키워드에 key/value 쌍으로 정의
apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
 labels:
 app: myapp
 env: prod
 creation_method: manual
spec:
 containers:
 - name: myapp-container
 image: busybox
 command: ['sh', '-c', 'echo hi K8S ! &&sleep 3600']

 

 labels:
 app: myapp
 env: prod
 creation_method: manual

→ 3개의 라벨 선언


 

 


3. Label 추가 및 수정

기존 파드에 라벨 추가

$kubectl label po <Pod-Name> <Label-Key>=<Label-Value>
ex) kubectl label goapp-pod env=prod

 

기존 파드에 라벨 수정

$kubectl label po <Pod-Name> <Label-Key>=<Label-Value> --overwrite
ex) kubectl label nginx-pod rel=stable --overwrite

 

 


4. Label Selector 사용

라벨 셀렉터를 이용한 파드 조회

$kubectl get pod –l <Label-Key>=<Label-Value>
ex) kubectl get pod –l env=prod

 

라벨 셀렉터로 Key 값만 이용해서 조회

$kubectl get pod –l <Label-Key>
ex) kubectl get pod –l env

 

라벨 셀렉터로 연산자를 사용해서 조회

# env 라는 라벨 Key 가 없는 Pod 조회
$kubectl get po –l ‘!env’ 

 

연산식 예제

creation_method!=manual : manual 이외의 다른 값으로 creation_method 라벨이 있는 Pod 선택

env in (prod, dev) : env 라벨이 prod 또는 dev 로 설정된 모든 Pod를 선택

env notin (prod, dev) : env 라벨이 prod 또는 dev 가 아닌 다른 값으로 설정된 Pod 선택

 

 


5. Pod 스케줄링을 위한 라벨 활용

  • 쿠버네티스에서는 어떤 노드로 파드가 스케줄 될지 알 수 없음
  • 라벨을 이용해 특정 노드로 스케줄링 가능
  • GPU 유무, 메모리 (High-Memmory), SSD 유무를 노드의 라벨에 적용

노드에 라벨 추가

$kubectl label node worker01.acorn.com ssd=true
$kubectl get nodes –l ssd=true

 

SSD가 있는 노드에 파드 스케줄링

apiVersion: v1
kind: Pod
metadata:
 name: goapp-pod
spec:
 nodeSelector:
 ssd: “true”
 containers:
 - image: dangtong/goapp
 name: goapp

 

 


6. Label Selector에서 다중 조건 사용

  • 쿠버네티스의 객체 이름의 범위를 제공하는 것
  • 동일한 리소스 이름을 여러 네임스페이스에서 여러번 사용 가능 (개발 / 검증 / 운영 ..)
  • 멀티 - 테넌트 환경으로 분리하는 효과

 

6-1. Namespace 사용

네임스페이스 조회

$kubectl get ns

 

특정 네임스페이스에 있는 파드 조회.

$kubectl get po -n kube-system

 

네임스페이스 yaml 작성

apiVersion: v1
kind: Namespace
metadata:
 name: prod-namespace

 

네임스페이스 생성

$kubectl create -f prod-namespace.yaml

 

다른 네임스페이스 관리

$kubectl create -f goapp-pod.yaml -n dev-namespace

 

다른 네임스페이스로 전환

$kubectl config set-context $(kubectl config current-context) -namespace <Namespace - Name>

 

손쉬운 네임스페이스 전환을 위한 Alias 설정

$alias kcd='kubectl config set-context $(kubectl config current-context) -namespace <Namespace - Nmae>

 

쉽게 전환

kcd namespace-prod

 

 

 


Annotation

  • Key/Value 쌍으로 라벨과 유사하지만, 셀렉터로 선택 불가능
  • 라벨보다 훨씬 더 많은 정보를 담을 수 있음
  • 주로 쿠버네티스 객체에 상세한 설명을 추가해 다른 사람이 알아보기 쉽게 하는 용도
    • EX) 객체를 만든 사람의 이름을 기록해 공동 작업 시에 훨씬 수월한 작업

 

 


1. Annotation 사용

250kb 까지 작성 가능하지만, 되도록 짧고 간결하게 사용 할 것

 

주석 추가

$kubectl annotate pod goapp-pod mycompany.com/created-by=“HYEONGJUN NOH”

 

주석 조회

$kubectl describe pod goapp-pod

profile
Cloud/DevOps & Network Virtualization에 관심 있는 Engineer입니다. 🐳⚓️👨‍✈️

0개의 댓글