2026. 6. 13. 15:23ㆍKubernetes
Ⅰ. 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 |