근묵자흑
Pod, ReplicaSet, Deployment 본문
쿠버네티스(Kubernetes, K8s)는 컨테이너화된 애플리케이션을 자동화된 방식으로 배포, 확장 및 관리하기 위한 오픈소스 플랫폼입니다. 오늘은 쿠버네티스의 핵심 구성 요소인 Pod, ReplicaSet, Deployment에 대해 자세히 알아보겠습니다.
1. Pod: 쿠버네티스의 기본 단위
Pod이란?
Pod은 쿠버네티스에서 컨테이너를 관리하는 가장 작은 배포 단위입니다. Pod이 생성되면 쿠버네티스 클러스터 내에서 고유한 IP 주소를 할당받게 됩니다.
Pod의 특징
- 하나의 Pod에는 하나 이상의 컨테이너가 포함될 수 있음 (pod ≠ container)
- 일반적으로 하나의 애플리케이션 컨테이너를 하나의 Pod으로 실행
- Pod 내의 모든 컨테이너는 네트워크 네임스페이스를 공유
- Pod은 임시적(Ephemeral)인 특성을 가짐 - 언제든지 삭제되거나 재생성될 수 있음
왜 컨테이너와 Pod을 분리했을까?
Pod을 사용하는 주된 이유는 리눅스 네임스페이스를 공유하는 여러 컨테이너들을 추상화된 집합으로 관리하기 위함입니다. Pod 내 컨테이너들은 다음을 공유합니다:
- 네트워크 네임스페이스: 동일한 IP 주소와 포트 공간
- IPC 네임스페이스: 프로세스 간 통신
- UTS 네임스페이스: 호스트명
Pod 정의 예제 (YAML)
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
다중 컨테이너 Pod 예제
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
- name: busybox-container
image: busybox
command: ["sh", "-c", "while true; do wget -qO- http://localhost:80; sleep 5; done"]
이 예제에서 busybox 컨테이너는 localhost:80
을 통해 같은 Pod 내의 nginx 컨테이너에 접근할 수 있습니다.
Pod 기본 명령어
# Pod 생성
kubectl run my-first-pod --image stacksimplify/kubenginx:1.0.0
# Pod 목록 확인
kubectl get pods
# Pod 상세 정보 확인
kubectl describe pod my-first-pod
# Pod 로그 확인
kubectl logs my-first-pod
kubectl logs -f my-first-pod # 실시간 로그 스트리밍
# Pod 내 컨테이너에 접속
kubectl exec -it my-first-pod -- /bin/bash
# Pod 삭제
kubectl delete pod my-first-pod
2. ReplicaSet: Pod의 가용성 보장
ReplicaSet이란?
ReplicaSet은 지정된 개수의 Pod 복제본이 항상 실행되도록 보장하는 컨트롤러입니다. Pod이 실패하거나 삭제되면 ReplicaSet은 자동으로 새 Pod을 생성하여 지정된 복제본 수를 유지합니다.
ReplicaSet의 주요 역할
- 고가용성 보장: 항상 지정된 수의 Pod이 실행되도록 유지
- 자동 복구: Pod이 실패하면 자동으로 새 Pod 생성
- 수평적 확장: 필요에 따라 Pod 복제본 수를 조정 가능
ReplicaSet 정의 예제 (YAML)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
spec:
replicas: 3 # 항상 3개의 Pod 유지
selector:
matchLabels:
app: nginx-app # 이 라벨을 가진 Pod을 관리
template: # 새 Pod을 생성할 때 사용할 템플릿
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
Labels & Selectors
ReplicaSet은 selector
를 통해 어떤 Pod을 관리할지 결정합니다:
- Labels: Pod에 부여하는 키-값 쌍의 메타데이터
- Selectors: 라벨을 기반으로 Pod을 선택하는 필터링 메커니즘
ReplicaSet 명령어
# ReplicaSet 생성
kubectl apply -f replicaset-demo.yaml
# ReplicaSet 목록 확인
kubectl get rs
# ReplicaSet 상세 정보 확인
kubectl describe rs my-replicaset
# ReplicaSet 규모 조정
kubectl scale --replicas=5 rs/my-replicaset
# ReplicaSet 삭제
kubectl delete rs my-replicaset
ReplicaSet 고가용성 테스트
Pod을 수동으로 삭제하면 ReplicaSet이 즉시 새 Pod을 생성하여 지정된 복제본 수를 유지합니다:
kubectl delete pod my-helloworld-rs-tp5td
# 새 Pod이 자동으로 생성됨
3. Deployment: 애플리케이션 배포 관리
Deployment란?
Deployment는 ReplicaSet의 상위 개념으로, ReplicaSet이 제공하는 기능 외에도 애플리케이션의 업데이트, 롤백, 스케일링 등을 더 효율적으로 관리할 수 있는 기능을 제공합니다.
Deployment의 주요 기능
- 롤링 업데이트: 무중단 배포 지원
- 롤백: 이전 버전으로 쉽게 되돌리기 가능
- 배포 일시 중지/재개: 여러 변경사항을 한번에 적용 가능
- 배포 이력 관리: 기본적으로 최근 10개 버전 유지
Deployment 정의 예제 (YAML)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:1.21
ports:
- containerPort: 80
strategy:
type: RollingUpdate # 롤링 업데이트 전략
rollingUpdate:
maxUnavailable: 1 # 최대 1개의 Pod은 비가용 상태 허용
maxSurge: 1 # 지정된 수량보다 최대 1개의 Pod 추가 생성 허용
배포 전략
Deployment는 두 가지 배포 전략을 지원합니다:
- RollingUpdate(기본값): 점진적으로 Pod을 교체하여 무중단 배포 제공
maxUnavailable
: 업데이트 중 사용 불가능한 상태일 수 있는 최대 Pod 수maxSurge
: 원하는 Pod 수 이상으로 생성할 수 있는 최대 Pod 수
- Recreate: 모든 기존 Pod을 삭제한 후 새 Pod을 생성 (다운타임 발생)
Deployment 명령어
# Deployment 생성
kubectl apply -f deployment-demo.yaml
# Deployment 목록 확인
kubectl get deployments
# Deployment 상세 정보 확인
kubectl describe deployment my-deployment
# Deployment 이미지 업데이트
kubectl set image deployment/my-deployment my-container=nginx:1.22 --record=true
# Deployment 직접 편집
kubectl edit deployment my-deployment --record=true
# 롤아웃 상태 확인
kubectl rollout status deployment/my-deployment
# 롤아웃 이력 확인
kubectl rollout history deployment/my-deployment
# 특정 리비전의 세부 정보 확인
kubectl rollout history deployment/my-deployment --revision=2
# 이전 버전으로 롤백
kubectl rollout undo deployment/my-deployment
# 특정 버전으로 롤백
kubectl rollout undo deployment/my-deployment --to-revision=2
# Deployment 일시 중지
kubectl rollout pause deployment/my-deployment
# Deployment 재개
kubectl rollout resume deployment/my-deployment
# Deployment 재시작
kubectl rollout restart deployment/my-deployment
# Deployment 규모 조정
kubectl scale deployment/my-deployment --replicas=5
Deployment 롤백 예제
- 업데이트에 문제가 발생한 경우:
# 이미지 버전 업데이트 kubectl set image deployment/my-deployment my-container=nginx:broken-version --record=true
2. 특정 버전으로 롤백:
```bash
# 롤아웃 이력 확인
kubectl rollout history deployment/my-deployment
# 특정 버전으로 롤백
kubectl rollout undo deployment/my-deployment --to-revision=3
추가적으로 Kubernetes Pod 배포 시 발생하는 주요 오류와 해결 방법에 대한 글을 작성하였습니다. 참고 부탁드립니다.
'k8s' 카테고리의 다른 글
[쿠버네티스] 서비스와 시크릿의 보안 취약점 및 대응 전략 (0) | 2025.04.13 |
---|---|
[쿠버네티스] 서비스, 네임스페이스, 컨피그맵, 시크릿 (0) | 2025.04.13 |
Kubernetes Pod 배포 시 발생하는 주요 오류와 해결 방법 (0) | 2025.04.06 |
Docker Compose (0) | 2025.03.30 |
도커 엔진 (0) | 2025.03.23 |