관리 메뉴

근묵자흑

Pod, ReplicaSet, Deployment 본문

k8s

Pod, ReplicaSet, Deployment

Luuuuu 2025. 4. 6. 14:57

쿠버네티스(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는 두 가지 배포 전략을 지원합니다:

  1. RollingUpdate(기본값): 점진적으로 Pod을 교체하여 무중단 배포 제공
    • maxUnavailable: 업데이트 중 사용 불가능한 상태일 수 있는 최대 Pod 수
    • maxSurge: 원하는 Pod 수 이상으로 생성할 수 있는 최대 Pod 수
  2. 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 롤백 예제

  1. 업데이트에 문제가 발생한 경우:
    # 이미지 버전 업데이트
    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 배포 시 발생하는 주요 오류와 해결 방법에 대한 글을 작성하였습니다. 참고 부탁드립니다.