Kubernetes: Deployment 이해하기

Kubernetes Deployment

Deployment는 쿠버네티스(Kubernetes)에서 애플리케이션을 관리하고 확장하기 위한 중요한 리소스 중 하나입니다.

Concept

쿠버네티스(Kubernetes)에서 Deployment는 애플리케이션을 관리하고 배포하는 핵심적인 개념 중 하나입니다.
Deployment는 주로 상태를 선언적으로 관리하며, 원하는 수의 파드 인스턴스가 클러스터에서 실행되도록 보장합니다.

Features

쿠버네티스 Deployment의 주요 기능 및 특징은 다음과 같습니다:

  • 선언적 업데이트:
    Deployment를 사용하면 원하는 상태(desired state)를 선언적으로 정의1하고, 쿠버네티스는 현재 상태를 원하는 상태로 안전하게 변경합니다.
  • 롤링 업데이트:
    Deployment는 애플리케이션을 새 버전으로 업데이트할 때 파드를 점진적으로 교체하여 서비스 중단 시간 없이 업데이트를 수행할 수 있습니다. 이는 롤링 업데이트 전략을 사용하여 수행됩니다.
  • 롤백:
    Deployment를 사용하면 최근의 업데이트를 롤백하여 이전 상태로 되돌릴 수 있습니다.
    이는 배포 중 문제가 발생했을 때 유용합니다.
  • 스케일링:
    Deployment를 통해 파드의 수를 수동으로 또는 오토스케일러를 사용하여 자동으로 확장 및 축소할 수 있습니다.
  • 프로브(Probes):
    애플리케이션의 상태를 체크하기 위한 프로브 (예: liveness, readiness probes)를 설정하여, 애플리케이션이 제대로 작동하는지 감지하고 필요한 조치를 취할 수 있습니다.

Deployment 작동 방식:

https://yankeexe.medium.com/

Deployment 리소스를 생성하면 내부적으로 ReplicaSet이 생성됩니다. ReplicaSet은 주어진 파드의 복사본 수(replicas)를 유지하는 책임을 가지며, Deployment는 이 ReplicaSet을 통해 파드의 생성, 삭제 및 업데이트를 관리합니다.

예를 들어, 애플리케이션의 새 버전을 배포하려고 할 때 Deployment는 새 ReplicaSet을 생성하고, 롤링 업데이트 전략에 따라 새 파드를 점진적으로 생성하며, 동시에 이전 파드를 점진적으로 종료합니다. 이 과정은 새 버전의 파드가 정상적으로 작동할 때까지 진행됩니다.

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: my-app-container
        image: my-image:v1

이 예시에서는 my-image:v1 이미지를 기반으로하는 my-app라는 이름의 Deployment가 정의되어 있습니다.
이 Deployment는 3개의 파드 복제본을 유지하기 위해 생성됩니다.

Deployment는 쿠버네티스에서 애플리케이션의 라이프사이클을 관리하는 데 중요한 리소스이며, 쿠버네티스에서 애플리케이션을 배포하고 관리할 때 매우 유용합니다.

Note


  1. 선언적 정의와 명령적 정의?

    선언적(declarative) 정의는 원하는 최종 상태를 지정하는 방식으로, 해당 상태를 어떻게 달성할지에 대한 구체적인 명령이나 절차를 기술하지 않는 방법을 의미합니다. 이는 반대되는 개념인 명령형(imperative) 방식과 대조됩니다.

    선언적 (Declarative) vs 명령형 (Imperative):

    선언적: “무엇을 달성하고 싶은지”에 집중합니다. “어떻게 달성할 것인지”에 대한 구체적인 절차나 단계는 지정하지 않습니다. 시스템이 원하는 상태를 달성하기 위한 방법을 결정하고 실행합니다.
    예: “나는 밤 10시까지 창문이 닫혀 있기를 원한다.” (어떻게 닫을 것인지, 언제 닫을 것인지 등에 대한 상세한 정보는 제공하지 않음)

    명령형: “어떻게 하면 될지”에 집중합니다. 원하는 결과를 달성하기 위한 명령어나 단계를 순차적으로 지정합니다.
    예: “8시에 창문을 닫아라. 9시에 확인해서 다시 닫혀 있지 않으면 다시 닫아라.”

    쿠버네티스에서의 선언적 접근:
    쿠버네티스는 선언적 접근 방식을 채택합니다. 예를 들어, 사용자는 원하는 파드의 수, 서비스의 상태, 배포의 상태 등을 선언적으로 정의할 수 있습니다. 쿠버네티스는 이 선언적 사양에 따라 시스템의 상태를 조정하려고 노력합니다.

    예를 들어, Deployment에서 원하는 파드의 수(replicas)를 3으로 지정하면 쿠버네티스는 이 상태를 유지하려고 노력합니다.
    1개의 파드만 실행 중인 경우, 쿠버네티스는 추가로 2개의 파드를 시작하여 원하는 상태를 달성하려고 합니다.
    이렇게 선언적 접근 방식을 통해, 사용자는 원하는 상태만 지정하면 쿠버네티스가 그 상태를 달성하기 위해 필요한 작업을 자동으로 처리합니다. ↩︎