[개발자 관점] 주요 Kubernetes 컨트롤러 종류 – 1. Deployment

25 sec read

🤔 Deployment란?

간단히 말해, Deployment는 Pod를 선언적으로 배포, 관리, 업데이트할 수 있게 해주는 상위 컨트롤러입니다. ‘Pod 매니저’라고 생각하면 쉽습니다.

핵심 개념은 우리가 “원하는 상태(Desired State)”를 정의하면, Deployment가 현재 상태를 감시하며 그 상태를 알아서 유지해준다는 점입니다. 예를 들어, “나는 Nginx 웹 서버 Pod를 3개 실행하고 싶다”라고 YAML 파일에 선언해두면, Deployment는 무슨 일이 있어도 Pod 3개를 유지하기 위해 노력합니다. Pod 하나가 갑자기 죽으면 즉시 새로 만들고, 실수로 4개를 띄우면 하나를 삭제하는 식이죠.

✨ Deployment가 제공하는 주요 기능

Deployment는 단순한 Pod 생성기를 넘어, 안정적인 서비스 운영에 필수적인 여러 강력한 기능을 제공합니다.

1. Pod 수 관리 (Replica 관리)

  • 항상 지정한 수의 Pod가 실행되도록 보장합니다. YAML에 replicas: 3이라고 정의했다면, Deployment는 3개의 Pod가 항상 떠 있도록 관리합니다.
  • 장애 발생 시 자동으로 새 Pod를 생성합니다. 노드 문제나 애플리케이션 오류로 Pod가 죽더라도, Deployment가 이를 감지하고 즉시 새로운 Pod를 생성해 서비스 공백을 최소화합니다.

2. 무중단 배포 (롤링 업데이트)

  • 새 버전 배포 시, 기존 버전을 점진적으로 교체합니다. 새 버전의 Pod를 하나 띄우고, 정상 실행이 확인되면 기존 버전의 Pod를 하나 내리는 과정을 반복합니다.
  • 이 덕분에 사용자는 서비스 중단 없이 새로운 기능이 적용된 서비스를 이용할 수 있습니다. 운영의 안정성을 크게 높여주는 핵심 기능입니다.

3. 버전 롤백

  • 새 버전을 배포했는데 심각한 버그가 발견되었나요? 걱정할 필요 없습니다.
  • kubectl rollout undo라는 간단한 명령어로, 이전의 안정적인 버전으로 신속하게 복원할 수 있습니다. 이 롤백 과정 또한 무중단 방식으로 안전하게 진행됩니다.

4. 선언적 관리 (Declarative Management)

  • 모든 배포 설정은 YAML 파일로 정의되고 관리됩니다.
  • 이는 배포 상태를 코드로 관리(Infrastructure as Code)할 수 있게 해주며, Git과 같은 버전 관리 시스템을 통해 변경 이력을 추적하고 협업을 용이하게 만듭니다.

💻 기본 예시: Deployment YAML

가장 기본적인 Deployment YAML 파일의 구조입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: web
          image: nginx:1.25
          ports:
            - containerPort: 80

위 YAML의 의미:

  • nginx:1.25 이미지를 사용하는 컨테이너를 가진 Pod를 3개(replicas: 3) 실행해줘.
  • Deployment는 app: my-app 이라는 라벨(selector)을 가진 Pod들을 자신의 관리 대상으로 삼을 거야.
  • Pod를 만들 때는 이 템플릿(template)을 사용하고, 생성된 Pod에 app: my-app 라벨을 붙여줘.
  • 만약 Pod 수가 3개보다 부족하면 자동으로 생성하고, 많으면 자동으로 삭제해서 항상 3개를 유지해줘.

🔗 Deployment와 함께 작동하는 컨트롤러

사실 Deployment는 혼자 모든 일을 하지 않습니다. 내부적으로 다른 컨트롤러와 협력하여 동작합니다.

Deployment

ReplicaSet

Pod (n개)

  • Deployment: 배포 전략(예: 롤링 업데이트)을 관리하고 버전 기록을 유지하는 최상위 사령관입니다. 업데이트 명령이 내려지면 새로운 ReplicaSet을 생성합니다.
  • ReplicaSet: Deployment의 하위 컨트롤러로, 오직 ‘지정된 수의 Pod 복제본을 유지’하는 임무만 수행하는 실행 담당자입니다. Deployment가 생성하고 관리하므로 우리가 직접 다룰 일은 거의 없습니다.
  • Pod: 실제 애플리케이션 컨테이너가 실행되는 기본 단위입니다.

🚀 개발자 관점 요약

Deployment는 Pod를 안정적이고 선언적으로 관리할 수 있게 해주는 핵심 컨트롤러입니다.
서비스 무중단 배포, 롤백, 리소스 유지 관리 기능을 제공하여 운영 부담을 크게 줄여줍니다.
실서비스 환경에서는 항상 Deployment를 통해 Pod를 관리해야 합니다.
kubectl get deployment, kubectl rollout status 등의 명령어를 통해 배포 상태를 손쉽게 추적할 수 있습니다.

쿠버네티스 시크릿 관리, 어떤 방법이 최선일까? 4가지 방식 장단점…

쿠버네티스에서 애플리케이션을 운영할 때, DB 접속 정보나 API 키 같은 민감한 정보, 즉 ‘시크릿(Secret)’을 어떻게 관리해야 할지는 모두의 공통된 고민입니다. 관리 방식은 보안, 운영...
eve
13 sec read

[MSA] Spring Cloud Gateway VS Apache APISIX : 단계별…

마이크로서비스 아키텍처(MSA)에서 API 게이트웨이는 시스템의 관문 역할을 하는 핵심 컴포넌트입니다. 수많은 Java 개발팀이 Spring 생태계와의 완벽한 통합성을 자랑하는 Spring Cloud Gateway를 선택해왔습니다. 그러나 시스템이...
eve
1 min read

[Kafka] 카프카의 심장: 토픽, 파티션, 프로듀서, 컨슈머 완벽 해부

Apache Kafka가 어떻게 대용량 데이터를 실시간으로, 그리고 안정적으로 처리할 수 있는지 궁금하신가요? 그 비밀은 Kafka를 구성하는 핵심 요소들의 유기적인 협력에 있습니다. Kafka는 마치 잘...
eve
1 min read