Kubernetes Label과 Annotation

2026. 6. 13. 15:23Kubernetes


Ⅰ. Label (레이블)

Label

(레이블)
항목 설명
개념 클러스터 내에서 사용자가 오브젝트를 생성하고 구분하기 위해

임의의 값을 지정하여 사용하는 표식 기능을 제공하는 것
역할
리소스의 특성 분류
Selector 이용하여 선택 가능
형식
key : value 형태로 구성
key와 value는 고유해야 함
특징 분류 설명
개발 목적

(name)
리소스가 어떤 역할을 하는지 구분하기 위한 목적 기반 레이블
예시 설명
name=mainui 메인 UI를 담당하는 프런트엔드
name=product 상품 관리 서비스
name=order 주문 처리 서비스
name=account 계정 및 로그인 서비스
name=shopping 쇼핑 서비스 전체를 대표하는 모듈
개발 버전

(rel)
빌드 버전이나 배포 단계 나타낼 때 사용하는 레이블
예시 설명
rel=stable 운영 중인 안정 버전
rel=beta 테스트용 베타 버전
rel=canary 일부 사용자에게만 배포되는 변경된 버전
리소스 이름

(name)
네트워크 계층 리소스를 구분하거나 연결 관계를 표현할 때 사용하는 레이블
예시 설명
name=myvpc VPC 리소스
name=myigw 인터넷 게이트웨이
name=mynat NAT 게이트웨이
name=alb Application Load Balancer
적용 대상 Node, Pod, ReplicaSet, Deployment, Service 등 모든 리소스에서 활용 가능
주의 사항 Label의 key 값은 목적, 버전, 리소스 이름과 연결되는 이름을 사용하는 것이 권장됨
설정 위치
Pod와 같은 오브젝트에서 설정할 수 있는 키 : 값
오브젝트 식별하는 데 사용
상속 여부
오브젝트 생성할 때 설정
생성 이후에도 수정 가능
중복 제한 하나의 오브젝트에서 동일한 키 중복 불가
Selector와의 관계 spec.selector.matchLabels 항목을 통해 Service나

Deployment가 특정 Label을 가진 Pod만 선택 가능

 


Ⅰ - Ⅰ. Label Selector (레이블 셀렉터)

Label Selector 항목 설명
개념 Kubernetes에서 Label을 기반으로 오브젝트를 검색하고 식별하기 위한 조건 지정 도구
기능 특정 Label 지정된 리소스 (Pod, Service 등)를 선택하거나 제외 가능
목적  
논리 연산 여러 Label 조건을 동시에 지정 가능
조건은 기본적으로 AND (논리곱) 관계로 동작
구문 특징 쉼표 (,)는 AND 연산자 (&&) 역할 수행
다양한 요구 사항을 동시에 만족하는 리소스만 선택 가능
주요 사용 방식 구분 설명
matchLabels 단순한 key : value 매칭을 이용해 리소스 선택
matchExpressions 연산자 (In, NotIn, Exists, DoesNotExists)를 활용해 조건식 기반 선택
적용 대상 Deployment, ReplicaSet, Service, Job 등 Label 기반으로 관리되는 모든 리소스에서 사용

 

 

 

# testpod 리소스 생성 및 실행 (Pod)

 

kubectl run testpod —image=nginx:1.14 명령을 통해 Nginx:1.14 이미지 사용하여 testpod 리소스 생성 및 실행

 

—port=80 옵션을 통해 80번 포트와 연결

 

kubectl get pod —show-labels 명령을 통해 라벨과 함께 testpod가 잘 생성되었는지 확인

 

cd kube/10 명령을 통해 홈 디렉터리에서 kube/10 디렉터리로 이동

 

ls 명령을 통해 해당 디렉터리 내에 있는 디렉터리 및 파일 목록 확인

 

cd label/ 명령을 통해 kube/10 디렉터리에서 kube/10/label 디렉터리로 이동

 

 

vi nolabel-pod.yml 명령을 통해 vi 편집기 사용하여 nolabel-pod.yml 파일 생성 및 내용 입력

 

cat nolabel-pod.yml 명령을 통해 nolabel-pod.yml 파일의 내용 확인

 

 

[ nolabel-pod.yml 파일의 내용 ]

 

apiVersion: v1 명령을 통해  API 버전을 v1로 지정하여 Core API 그룹 사용하도록 설정

 

kind: Pod 명령을 통해  리소스 종류를 Pod로 설정

 

metadata.name: nolabel-pod 명령을 통해 생성된 Pod의 이름을 nolabel-pod로 설정

 

spec.containers.name: nginx-container 명령을 통해  컨테이너 이름을 nginx-container로 설정

 

spec.containers.image: nginx:1.14 명령을 통해  컨테이너에서 사용할 이미지로 Nginx:1.14 설정

 

spec.ports.containerPort: 80 명령을 통해  컨테이너 내부에서 오픈되는 포트로 80번 지정

 

spec.ports.protocol: TCP 명령을 통해  포트의 통신 프로토콜을 TCP로 지정

 

kubectl creat –f nolabel-pod.yml 명령을 통해 nolabel-pod.yml 파일을 사용하여 nolable-pod 리소스 생성

 

kubectl get pod —show-labels 명령을 통해 리소스가 잘 생성되었는지 라벨과 함께 확인

 

 

vi label-pod.yml 명령을 통해 vi 편집기 사용하여 label-pod.yml 파일 생성 및 내용 입력

 

cat label-pod.yml 명령을 통해 label-pod.yml 파일의 내용 확인

 

 

[ label-pod.yml 파일의 내용 ]

 

apiVersion: v1 명령을 통해 API 버전을 v1으로 지정하여 Core API 그룹 사용하도록 설정

 

kind: Pod 명령을 통해  리소스 종류를 Pod로 설정

 

metadata.name: label-pod 명령을 통해 생성된 Pod의 이름을 label-pod로 설정

 

metadata.labels.name: mainui 명령을 통해 name=mainui 라벨을 Pod에 부여하여 UI 관련 서비스임을 표시

 

metadata.labels.rel: stable 명령을 통해 rel=stable 라벨을 Pod에 부여하여 안정화된 운영 버전임을 표시

 

spec.containers.name: nginx-container 명령을 통해  컨테이너 이름을 nginx-container로 설정

 

spec.containers.image: nginx:1.14 명령을 통해  컨테이너에서 사용할 이미지로 Nginx:1.14 설정

 

spec.ports.containerPort: 80 명령을 통해  컨테이너 내부에서 오픈되는 포트로 80번 지정

 

spec.ports.protocol: TCP 명령을 통해  TCP 프로토콜 설정

 

kubectl creat –f label-pod.yml 명령을 통해 label-pod.yml 파일을 사용하여 lable-pod 리소스 생성

 

kubectl get pod —show-labels 명령을 통해 리소스가 잘 생성되었는지 라벨과 함께 확인

 

kubectl get pod –l name=mainui 명령을 통해 name = mainui 라벨을 가진 파드만 확인

 

kubectl get pod —selector name=mainui 명령을 통해 name = mainui 라벨을 가진 파드만 확인

 

 

# nolabel-pod 리소스에 이름과 라벨 부여

 

kubectl label pod nolabel-pod name=product rel=beta 명령을 통해

 

nolabel-pod 리소스에 name = product, rel = beta 라벨 부여

 

-> 제품용 베타 버전 파드라는 의미

 

kubectl get pod —show-labels 명령을 통해 부여된 라벨이 잘 적용되었는지 확인

 

 

# nolabel-pod 리소스에 이름 재부여

 

kubectl label pod nolabel-pod name=order —overwrite 명령을 통해

 

nolabel-pod 리소스에 name = order라는 라벨 덮어쓰기

 

kubectl get pod —show-labels 명령을 통해 변경된 라벨이 잘 적용되었는지 확인

 

 

# testpo 리소스d에 이름과 라벨 부여

 

kubectl label pod testpod name=order rel=beta 명령을 통해

 

testpod 리소스에 name = order, rel = beta 라벨 새로 부여

 

-> 제품용 베타 버전 파드라는 의미

 

kubectl get pod —show-labels 명령을 통해 부여된 라벨이 잘 적용되었는지 확인

 

 

kubectl get pod --selector name=order —show-labels 명령을 통해 name = order 라벨을 가진 파드만 표시

 

kubectl get pod --selector name!=order —show-labels 명령을 통해

 

name = order 라벨을 가지지 않는 파드만 표시

 

kubectl get pod -l 'name in (mainui,order)' --show-labels 명령을 통해

 

라벨이 mainui 또는 order인 모든 파드 출력

 

 

# Pod 모두 삭제

 

kubectl delete pod —all 명령을 통해 현재 네임스페이스의 모든 파드를 한 번에 삭제

 

 

kubectl get node —show-labels 명령을 통해 노드 목록 및 기본 라벨 확인

 

kubectl label nodes node1 gpu=true disk=ssd 명령을 통해 node1 노드에 gpu = true, disk = ssd 라벨 추가

 

-> GPU 탑재, SSD 디스크 장착

 

kubectl label nodes node2 gpu=true 명령을 통해 node2 노드에 gpu = true 라벨 추가

 

-> GPU 탑재

 

kubectl label nodes node3 disk=ssd 명령을 통해 node3 노드에 disk = ssd 라벨 추가

 

-> SSD 디스크 장착

 

kubectl get nodes –L disk,gpu 명령을 통해 라벨이 잘 추가되었는지 확인

 

 

cd ../nodelabel/ 명령을 통해 label 디렉터리에서 nodelabel 디렉터리로 이동

 

vi nodeselector.yml 명령을 통해 vi 편집기 사용하여 nodeselector.yml 파일 생성 및 내용 입력

 

cat nodeselector.yml 명령을 통해 nodeselector.yml 파일의 내용 확인

 

 

[nodeselector.yml 파일의 내용]

 

apiVersion : v1 명령을 통해 Core API 그룹의 v1 버전을 사용하도록 지정

 

kind : Pod 명령을 통해 리소스의 종류를 Pod로 설정

 

metadata.name: nodeselector-pod 명령을 통해 생성된 Pod의 이름을 nodeselector-pod로 지정

 

metadata.labels.name: mainui 명령을 통해 Pod에 name=mainui 라벨을 부여하여 UI 서비스용 Pod임을 표시

 

metadata.labels.rel: stable 명령을 통해 Pod에 rel=stable 라벨을 부여하여 안정화 버전임을 표시

 

spec.nodeSelector.disk: ssd 명령을 통해 disk=ssd 라벨이 설정된 노드에만 Pod 배치하도록 지정

 

spec.nodeSelector.gpu: "true" 명령을 통해 gpu=true 라벨이 설정된 노드에서만 실행되도록 지정

 

spec.containers[0].name: nginx-container 명령을 통해 컨테이너 이름을 nginx-container로 설정

 

spec.containers[0].image: nginx:1.14 명령을 통해 컨테이너에서 사용할 이미지를 nginx:1.14로 지정

 

spec.containers[0].ports[0].containerPort: 80 명령을 통해 컨테이너 내부에서 오픈되는 포트를 80번으로 설정

 

spec.containers[0].ports[0].protocol: TCP 명령을 통해 포트의 통신 프로토콜을 TCP로 지정

 

 

# nodeselector-pod 리소스 생성 (Pod)

 

kubectl create –f nodeselector.yml 명령을 통해 nodeselector.yml 파일 이용하여 nodeselector-pod 리소스 생성

 

kubectl get pod –o wide 명령을 통해 리소스가 잘 생성되었는지 확인

 

vi wrong_nodeselector.yml 명령을 통해 vi 편집기 사용하여 wrong_nodeselector.yml 파일 생성 및 내용 입력

 

cat wrong_nodeselector.yml 명령을 통해 wrong_nodeselector.yml 파일의 내용 확인

 

 

[wrong_nodeselector.yml 파일의 내용]

 

apiVersion : v1 명령을 통해 Core API 그룹의 v1 버전을 사용하도록 설정

 

kind : Pod 명령을 통해 리소스의 종류를 Pod로 지정

 

metadata.name: nodeselector-wrong-pod 명령을 통해 생성된 Pod에 nodeselector-wrong-pod 이름 부여

 

metadata.labels.name: mainui 명령을 통해 Pod에 name=maiui 라벨을 부여하여 UI 서비스용 Pod임을 표시

 

metadata.labels.rel: stable 명령을 통해 Pod에 rel=stable 라벨을 부여하여 안정화 버전임을 표시

 

spec.nodeSelector.disk: ssd 명령을 통해 disk=ssd 라벨이 설정된 노드에만 Pod 배치하도록 지정

 

spec.nodeSelector.gpu: "true" 명령을 통해 gpu=true 라벨이 설정된 노드에서만 실행되도록 지정

 

spec.nodeSelector.mem: high 명령을 통해 노드 라벨 중 mem=high 조건도 추가로 설정

 

(이 조건이 실제 노드에 존재하지 않을 경우, Pod 스케줄링 실패)

 

spec.containers[0].name: nginx-container 명령을 통해 컨테이너 이름을 nginx-container로 설정

 

spec.containers[0].image: nginx:1.14 명령을 통해 컨테이너에서 사용할 이미지를 nginx:1.14로 지정

 

spec.containers[0].ports[0].containerPort: 80 명령을 통해 컨테이너 내부에서 오픈되는 포트를 80번으로 설정

 

spec.containers[0].ports[0].protocol: TCP 명령을 통해 포트의 통신 프로토콜을 TCP로 지정

 

 

# nodeselector-wrong-pod 리소스 생성 (Pod)

 

kubectl create –f wrong_nodeselector.yml 명령을 통해

 

wrong_nodeselector.yml 파일 사용하여 nodeselector-wrong-pod 리소스 생성

 

kubectl describe pod nodeselector-wrong-pod 명령을 통해 해당 리소스의 상세 정보 확인

 

 

# 모든 Pod 삭제

 

kubectl delete pod —all 명령을 통해 모든 Pod 삭제

 

 

# node1의 gpu, disk 라벨 키 삭제

 

kubectl label nodes node1 gpu- disk- 명령을 통해 node1에서 해당 라벨 키 삭제

 

 

# node2의 gpu 라벨 키 삭제

 

kubectl label nodes node2 gpu- 명령을 통해 node2에서 해당 라벨 키 삭제

 

kubectl get node —show-labels 명령을 통해 라벨이 잘 삭제되었는지 확인


 

Ⅱ. Annotation (애너테이션)

Annotation

(애너테이션)
항목 설명
정의 Kubernetes에서 생성된 리소스 (Pod, Service, Deployment 등)에 대해

추가적인 설명이나 메타데이터를 저장하기 위한 주석 기능
주요 목적 Kubernetes 시스템 또는 외부 도구 (모니터링, 배포 자동화 등)에서

리소스 관리, 추적, 운영에 필요한 정보 저장
사용 형태 key : value 형식으로 작성

(ex. annotations: description: "frontend deployment")
주요 용도 구분 설명
Kubernetes 시스템용 메타데이터 저장 Kubernetes API나 Controller가 인식할 수 있는

비운영 데이터 추가
운영 / 관리 도구 연동 CI / CD, 모니터링, 로그 시스템에서 리소스를 식별하고

관리하기 위한 보조 데이터
관리 이력 기록 릴리즈 버전, 배포자 이름, 롤링 업데이트 시간 등

운영 이력을 Annotation에 남길 수 있음
활용 예시 RollingUpdate 기록
빌드 / 배포 정보 (ex. git commit, build number)
모니터링 태그 (ex. prometheus.io/scrape: "true")
오토스케일러 (HPA)나 외부 툴에서 참고할 설정 값

 

● Label vs Annotation

차이점 구분 Label Annotation
역할 리소스를 그룹화하거나 검색용으로 사용 리소스에 추가적인 설명 및 관리 정보 기록
키 생성 방식 의미 있는 단어 (key)를

사용하여 생성 가능
시스템에서 인식 가능한 키를 사용해야 하며, 

검색용으로는 사용 불가
검색 / 식별 여부 Label Selector를 통해

검색 및 분류 가능
검색 불가 (조회 전용)
주요 특징 Kubernetes가 리소스를

분류하고 관리할 때 사용
사용자가 부가정보를 저장하거나

자동화 도구와 연동 시 활용
저장 위치 metadata.labels 필드 metadata.annotations 필드
활용 예시 Pod의 기능 구분

(ex. app=frontend, tier=backend)
릴리즈 버전, 빌드 정보, 설명 등 기록

(ex. buildVersion: "1.0.3")
공통점 항목 설명
형태 모두 key : value 형식으로 작성
적용 대상 Pod, Service, Deployment, Node 등 모든 리소스에 적용 가능
메타데이터 역할 리소스에 의미 있는 추가 정보를 부여하는 기능 수행

 

 

cd ../annotations/ 명령을 통해 nodelabel 디렉터리에서 annotations 디렉터리로 이동

 

vi annotation-pod.yml 명령을 통해 vi 편집기 사용하여 annotation-pod.yml 파일 생성 및 내용 입력

 

 

# annotation-pod 리소스 생성 (Pod)

 

kubectl create –f annotation-pod.yml 명령을 통해

 

annotation-pod.yml 파일 사용하여 annotation-pod 리소스 생성

 

kubectl get pod –o wide 명령을 통해 리소스가 잘 생성되었는지 확인

 

kubectl describe pod annotation-pod 명령을 통해 annotation-pod 리소스의 상세 정보 확인


Ⅲ. Label을 이용한 Canary Version 배포

 

- Canary Version이란 사용자에게 일부 버전만 신규 버전으로 배포하고 사용자들이 사용하면서

 

발생되는 버그 또는 문제점에 대해서 반응을 확인하기 위한 버전


 

Ⅲ - Ⅰ. Canary Deployment

 

- 신규 Pod를 배포하기 이전에 기존 버전을 유지하며 일부 버전만 신규 버전으로 교체하여

 

버그, 문제점, 사용자 반응이 어떤지 확인할 때 구성

 

 

cd ../canary/ 명령을 통해 annotations 디렉터리에서 canary 디렉터리로 이동

 

vi mainui-stable.yml 명령을 통해 vi 편집기 사용하여 mainui-stable.yml 파일 생성 및 내용 입력

 

 

# mainui-stable 리소스 생성

 

kubectl create –f mainui-stable.yml 명령을 통해 mainui-stable.yml 파일 이용하여 mainui-stable 리소스 생성

 

kubectl get deploy,rs,pod –o wide 명령을 통해 잘 생성되었는지 확인

 

 

vi mainui-service.yml 명령을 통해 vi 편집기 사용하여 mainui-service.yml 파일 생성 및 내용 입력

 

 

# mainui-service 리소스 생성

 

kubectl create –f mainui-service.yml 명령을 통해 mainui-service.yml 파일 이용하여 mainui-service 리소스 생성

 

kubectl get svc,pod,ep –o wide 명령을 통해 잘 생성되었는지 확인

 

kubectl describe svc mainui-svc 명령을 통해 mainui-svc 리소스의 상세 정보 확인

 

 

vi mainui-canary.yml 명령을 통해 vi 편집기 사용하여 mainui-canary.yml 파일 생성 및 내용 입력

 

 

# mainui-canary 리소스 생성

 

kubectl create –f mainui-canary.yml 명령을 통해 mainui-canary.yml 파일 이용하여 mainui-canary 리소스 생성

 

kubectl get deploy,svc,pod,ep –o wide 명령을 통해 잘 생성되었는지 확인

 

kubectl describe pod | grep Image: 명령을 통해 사용 중인 이미지의 버전 확인

 

 

# mainui-canary.yml 파일과 그와 관련된 리소스 등 모두 삭제

 

kubectl delete –f mainui-canary.yml 명령을 통해 mainui-canary.ym 파일l과 그와 관련된 리소스 등 모두 삭제

 

 

# mainui-service.yml 파일과 그와 관련된 리소스 등 삭제

 

kubectl delete –f mainui-service.yml 명령을 통해 mainui-service.yml 파일과 그와 관련된 리소스 등 모두 삭제

'Kubernetes' 카테고리의 다른 글

Kubernetes Secret  (0) 2026.06.13
Kubernetes ConfigMap  (0) 2026.06.13
Kubernetes Ingress  (0) 2026.06.13
Kubernetes Service  (0) 2026.06.13
kubernetes Controller  (0) 2026.06.13