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=v2 | AND 조건 | 두 조건 모두 만족 |
--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 구성
라벨 설계
| 라벨 | 값 | 설명 |
|---|---|---|
| job | web, srv, db | 워크로드 유형 |
| team | se, dba, frontend, backend | 담당 팀 |
Pod 구성
| Pod | job | team |
|---|---|---|
| pod-se-1 ~ pod-se-3 | web, srv, db | se |
| pod-dba-1 ~ pod-dba-3 | web, srv, db | dba |
| pod-fe-1 ~ pod-fe-3 | web, srv, db | frontend |
| pod-be-1 ~ pod-be-3 | web, srv, db | backend |
Service 구성
| Service | Port | Selector | 매칭 Pod |
|---|---|---|---|
| se-svc | 8081 | team=se | pod-se-* |
| dba-svc | 8082 | team=dba | pod-dba-* |
| frontend-svc | 8083 | team=frontend | pod-fe-* |
| backend-svc | 8084 | team=backend | pod-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 비교
| 항목 | Pod | Deployment |
|---|---|---|
| 자가 복구 | ❌ 삭제되면 끝 | ✅ 자동 재생성 |
| 스케일링 | ❌ 수동 생성 | ✅ 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