본문으로 건너뛰기

Day 6 - Kubernetes Labels & Deployments

Day 6 - Kubernetes Labels & Deployments

목차


1. Label 기초

Label 생성

# 단일 라벨로 Pod 생성
kubectl run pod-label-1 --image=nginx:1.29.4-alpine --labels="key=value"

# 다중 라벨로 Pod 생성
kubectl run pod-label-2 --image=nginx:1.29.4-alpine --labels="key=value,key1=value1"

# 라벨 확인
kubectl get pods --show-labels

Label 추가/삭제

# 라벨 추가
kubectl label pod pod-label-1 job=devops

# 라벨 삭제 (키 뒤에 - 붙이기)
kubectl label pod pod-label-2 key1-

# 라벨 값 수정 (--overwrite 필수)
kubectl label pod pod-label-2 key=newvalue --overwrite

Label YAML 생성

kubectl run pod-label-1 --image=nginx:1.29.4-alpine --labels="key=value" --dry-run=client -o yaml > label-pod.yaml

2. Label Selector 실습

다중 라벨 Pod 생성

kubectl run pod-label-1 --image=nginx:1.29.4-alpine --labels="key1=value1,key2=value2"
kubectl run pod-label-2 --image=nginx:1.29.4-alpine --labels="key2=value2,key3=value3"
kubectl run pod-label-3 --image=nginx:1.29.4-alpine --labels="key3=value3,key1=value1"
kubectl run pod-label-4 --image=nginx:1.29.4-alpine --labels="key1=value1,key2=value2,key3=value3"

Selector 조회

옵션설명예시
-l key=value일치 조건-l key1=value1
-l key!=value제외 조건-l key1!=value1
-l key1=v1,key2=v2AND 조건두 조건 모두 만족
--selector-l과 동일--selector='key1=value1'
# 단일 조건
kubectl get pods -l key1=value1 --show-labels

# AND 조건
kubectl get pods -l key1=value1,key2=value2 --show-labels

# 제외 조건
kubectl get pods -l key1!=value1 --show-labels

Service와 Pod 연결

# Pod 생성
kubectl run pod1 --image=nginx:1.29.4-alpine --labels="app=webserver,tier=frontend"
kubectl run pod2 --image=nginx:1.29.4-alpine --labels="app=webserver,tier=backend"
kubectl run pod3 --image=nginx:1.29.4-alpine --labels="app=database,tier=backend"

# Service 생성 (selector로 Pod 연결)
kubectl expose pod pod1 --port=80 --name=webserver-frontend --selector="app=webserver,tier=frontend"
kubectl expose pod pod2 --port=80 --name=webserver-backend --selector="app=webserver,tier=backend"

Service-Pod 매칭 확인

kubectl get endpoints

리소스 삭제

kubectl delete pod pod-label-1 pod-label-2 pod-label-3 pod-label-4

3. 팀별 Label 구성

라벨 설계

라벨설명
jobweb, srv, db워크로드 유형
teamse, dba, frontend, backend담당 팀

Pod 구성

Podjobteam
pod-se-1 ~ pod-se-3web, srv, dbse
pod-dba-1 ~ pod-dba-3web, srv, dbdba
pod-fe-1 ~ pod-fe-3web, srv, dbfrontend
pod-be-1 ~ pod-be-3web, srv, dbbackend

Service 구성

ServicePortSelector매칭 Pod
se-svc8081team=sepod-se-*
dba-svc8082team=dbapod-dba-*
frontend-svc8083team=frontendpod-fe-*
backend-svc8084team=backendpod-be-*

배포

# Pod 생성
kubectl apply -f pod-svc-label-team/pod-label-back.yaml
kubectl apply -f pod-svc-label-team/pod-label-dba.yaml
kubectl apply -f pod-svc-label-team/pod-label-front.yaml
kubectl apply -f pod-svc-label-team/pod-label-se.yaml

# Service 생성
kubectl apply -f pod-svc-label-team/svc-label.yaml

# 확인
kubectl get endpoints

각 Pod에 index.html 생성

# SE 팀
kubectl exec pod-se-1 -- sh -c 'echo "<h1>SE Web Server</h1>" > /usr/share/nginx/html/index.html'

# DBA 팀
kubectl exec pod-dba-1 -- sh -c 'echo "<h1>DBA Web Server</h1>" > /usr/share/nginx/html/index.html'

# Frontend 팀
kubectl exec pod-fe-1 -- sh -c 'echo "<h1>Frontend Web Server</h1>" > /usr/share/nginx/html/index.html'

# Backend 팀
kubectl exec pod-be-1 -- sh -c 'echo "<h1>Backend Web Server</h1>" > /usr/share/nginx/html/index.html'

리소스 삭제

kubectl delete -f pod-svc-label-team/

4. Service 네트워킹

NodePort Service 실습

# Pod 생성
kubectl run pod1 --image=pyh5523/web:nginx-1.29.3-alpine-v2 --labels="app=web"
kubectl run pod2 --image=pyh5523/web:nginx-1.29.3-alpine-v2 --labels="app=web"
kubectl run pod3 --image=pyh5523/web:nginx-1.29.3-alpine-v2 --labels="app=web"

# NodePort Service 생성
kubectl expose pod pod1 --port=80 --name=svc-front --type=NodePort --selector="app=web"

# 확인
kubectl get svc,endpoints

Pod 삭제 시 동작

# Pod 삭제
kubectl delete pod pod3

# Endpoints 자동 업데이트 확인
kubectl get endpoints
# → pod3 제거됨

# Pod 재생성
kubectl run pod3 --image=pyh5523/web:nginx-1.29.3-alpine-v2 --labels="app=web"

# Endpoints 자동 업데이트 확인
kubectl get endpoints
# → pod3 다시 추가됨

리소스 삭제

kubectl delete svc svc-front
kubectl delete pod pod1 pod2 pod3

5. Deployment

Pod vs Deployment 비교

항목PodDeployment
자가 복구❌ 삭제되면 끝✅ 자동 재생성
스케일링❌ 수동 생성✅ replicas 조정
롤링 업데이트❌ 불가✅ 무중단 배포
롤백❌ 불가✅ 이전 버전 복구
사용 목적테스트운영 환경 ✅

Deployment 생성

kubectl apply -f deployment/pod-deployment.yaml

kubectl get deployments -o wide

Service 연결

kubectl expose deployment deploy-app --name=svc-app --type=NodePort --port=80 --target-port=8080

롤링 업데이트

기존 Pod를 하나씩 새 버전으로 교체하는 무중단 배포 방식

kubectl set image deployment/deploy-app cont-app=pyh5523/web:nginx-1.29.4-alpine-v2

# 진행 상황 확인
kubectl get deployments -o wide

6. Sidecar 패턴

개념

컨테이너역할
myapp (nginx)웹서버 - index.html 서빙
sidecar (curl)데이터 수집 - 외부 사이트 다운로드

공유 볼륨

sidecar: curl → index.html 저장 → 공유 볼륨

myapp: nginx가 서빙

배포

kubectl apply -f client/client-pod.yaml

kubectl get pod

컨테이너 접속

# myapp 컨테이너 접속
kubectl exec pod-client -c myapp -it -- /bin/bash

# index.html 확인
cat /usr/share/nginx/html/index.html

Service 생성

kubectl expose pod pod-client --name=svc-client --type=NodePort --port=80 --target-port=80

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: Day 6 - Kubernetes Labels & Deployments
노드 클릭 → 이동 · 드래그 → 위치 조정