[DevOps] 디플로이먼트 (Deployment)

·2025년 2월 16일

쿠버네티스

목록 보기
5/7
post-thumbnail

✅ 디플로이먼트 (Deployment)

🚨 문제

이전에 백엔드 서버 1개를 파드로 띄어보았다.
실제 서비스를 운영하다보면 트래픽이 증가해서 서버가 버벅거리는 경우 서버를 수평적 확장(서버의 개수를 늘리는 방식)을 통해 해결할 수 있다.
기존 방법으로 3개의 서버를 띄우려면 아래와 같이 작성해야한다.

apiVersion: v1
kind: Pod
metadata:
  name: spring-pod-1
spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080
      
---
apiVersion: v1
kind: Pod
metadata:
  name: spring-pod-2
spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080
      

---
apiVersion: v1
kind: Pod
metadata:
  name: spring-pod-3
spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080

3개의 서버를 띄우는데 성공했지만, 만약 100개의 서버를 띄워야하면 이렇게 매번 반복적인 코드를 작성해야하는 문제가 있다. 또한 트래픽은 계속해서 변하기 때문에 트래픽에 맞게 서버의 대수를 바꿀때도 불편하다.
이런 불편함을 해결해주는 쿠버네티스 기능이 디플로이먼트(Deployment)이다.


✅ 디플로이먼트 (Deployment)란?

  • 디플로이먼트: 파드를 묶음으로 쉽게 관리할 수 있는 기능
  • 현업에서는 일반적으로 서버를 작동할 때 파드(Pod)를 수동으로 배포하지 않고 디플로이먼트(Deployment)를 활용하여 파드를 자동으로 배포한다.

✅ 디플로이먼트 장점

  • 파드의 수를 지정하는 대로 여러 개의 파드를 쉽게 생성할 수 있다.
    • ex) 파드를 100개 생성하라고 하면, 디플로이먼트가 자동으로 파드 100개를 생성한다.
  • 파드가 비정상적으로 종료된 경우, 자동으로 새로 파드를 생성해 파드 수를 유지한다.
  • 동일한 구성의 여러 파드를 일괄적으로 일시 중지, 삭제, 업데이트를 하기가 쉽다.
    • ex) 디플로이먼트를 활용하면 '100개의 파드로 띄워져있는 결제 서버'를 한번에 일시 중지/삭제/업데이트를 하는게 쉽다.

✅ 디플로이먼트 구조

  • 디플로이먼트(Deployment)가 레플리카셋(ReplicaSet)을 관리하고, 레플리카셋(ReplicaSet)이 여러 파드(Pod)를 관리하는 구조이다.
    • 레플리카(Replica) : 파드의 복제본
    • 레플리카셋(ReplicaSet) : 복제본끼리의 묶음(Pod 복제본을 관리하는 Kubernetes 컨트롤러)

실제 디플로이먼트를 이용해서 위의 문제를 해결해보자


✅ 디플로이먼트를 활용하여 백엔드서버 3개 띄우기

1. 매니페스트 파일 수정

  • 기존 매니페스트 파일
apiVersion: v1
kind: Pod
metadata:
  name: spring-pod-1
spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080
      
---
apiVersion: v1
kind: Pod
metadata:
  name: spring-pod-2
spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080
      

---
apiVersion: v1
kind: Pod
metadata:
  name: spring-pod-3
spec:
  containers:
    - name: spring-container
      image: spring-server
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 8080
  • 새로운 매니페스트 파일 (spring-deployment.yaml)
apiVersion: apps/v1
kind: Deployment

# Deployment 기본 정보
metadata:
  name: spring-deployment # Deployment 이름

# Deployment 세부 정보
spec:
  replicas: 3 # 생성할 Pod 개수
  selector:
    matchLabels:
      app: backend-app # 아래에서 정의한 Pod 중 'app: backend-app' 라벨을 가진 Pod'

  # 배포할 Pod 정의
  template:
    metadata:
      labels: # 레이블
        app: backend-app
    spec:
        containers:
            - name: spring-container # 컨테이너 이름
              image: spring-server # 컨테이너 이미지
              imagePullPolicy: IfNotPresent # 로컬에서 이미지를 먼저 가져온다. 이미지가 없을 때만 pull
              ports:
                - containerPort: 8080 # 컨테이너에서 사용할 포트를 명시적으로 작성
        

2. 기존 파드 삭제 및 디플로이먼트(Deployment) 생성

kubectl delete pod spring-pod-1 spring-pod-2 spring-pod-3 
kubectl get pods # 잘 삭제됐는 지 확인하기
kubectl apply -f spring-deployment.yaml 

3. 디플로이먼트, 레플리카셋, 파드 생성 확인


💡 전체 구조

📌 백엔드 서버 3개를 디플로이먼트를 통해 띄우는데 성공했다. 실제 요청을 보낼 때는 각 서버에 균등하게 트랙픽이 분배되어야한다. 그런데 사용자가 균등하게 서버에 요청할 수 없기때문에 파드 앞단에 알아서 여러 파드에 균등하게 요청을 분배해줄 어떤것이 필요하다. 이를 쿠버네티스에서 서비스(Service)가 수행한다. 서비스는 다음 포스트에서 다룰 예정이다.

0개의 댓글