Kubernetes에서 애플리케이션을 배포하는 방법

쿠버네티스는 호스트 또는 노드 클러스터 환경에서 애플리케이션 컨테이너를 효율적으로 배포하고, 규모를 조정하며, 운영을 자동화하는 데 가장 널리 활용되는 플랫폼 중 하나입니다.

본 문서에서는 쿠버네티스에서 핵심적인 역할을 수행하는 배포(Deployment) 객체에 대해 자세히 알아봅니다. 배포의 작동 방식과 생성, 업데이트, 삭제 과정을 명확히 이해하는 것이 주요 목표입니다.

배포란 무엇인가?

배포는 포드(Pod)를 실행하는 데 사용되는 중요한 객체 중 하나입니다. 쿠버네티스에서는 상태가 없는(stateless) 애플리케이션을 배포할 때 배포 객체를 사용하는 것을 권장합니다. 배포를 사용하지 않으면 여러 개의 포드를 수동으로 생성, 업데이트, 삭제해야 하므로 대규모 환경에서는 비효율적이고 실현 불가능합니다.

배포는 단순하게 포드를 생성하는 것뿐만 아니라, 포드가 항상 최신 상태로 유지되고 있는지 확인하는 역할을 합니다. 이 모든 과정은 YAML 형식으로 단일 객체로 정의됩니다. 또한, 배포를 활용하면 애플리케이션의 자동 스케일링을 간편하게 구현할 수 있습니다. 따라서 배포는 포드 기반 애플리케이션의 확장, 배포, 롤백 등을 관리하는 데 필수적인 요소입니다.

배포는 쿠버네티스에게 실행할 포드 복제본의 수를 알려주고, 나머지 복잡한 작업은 쿠버네티스가 처리합니다. 배포가 생성되면 연결된 컨트롤러가 자동으로 레플리카셋(ReplicaSet)을 생성합니다. 이 레플리카셋 컨트롤러는 레플리카셋 구성에 따라 일련의 포드를 생성합니다.

배포를 사용하면 레플리카셋을 직접 생성하는 것보다 다음과 같은 중요한 이점을 누릴 수 있습니다.

  • 객체 이력 관리: 객체의 변경 사항(“적용” 또는 “편집”)이 발생할 때마다 이전 버전의 백업을 생성합니다.
  • 롤아웃 및 롤백 관리: 이전 설정 상태로 쉽게 되돌릴 수 있습니다.

배포 생성 방법

쿠버네티스 배포를 생성하는 방법에는 크게 두 가지 접근 방식이 있습니다.

명령형 방식

쿠버네티스 API를 활용하면 별도의 구성 파일이나 YAML 매니페스트 없이 명령어를 통해 직접적으로 배포를 생성할 수 있습니다. 이 방법에서는 원하는 결과를 명령어로 표현하기만 하면 쿠버네티스가 그 결과를 달성하기 위한 모든 단계를 자동적으로 처리합니다.

명령형 방식을 사용하려면 다음 명령어를 실행합니다.

kubectl create deployment nginx-deployment --image nginx --port=80

선언적 방식

선언적 방식에서는 배포에 대한 모든 구성 요소를 YAML 파일에 명시해야 합니다. 쿠버네티스는 이 파일을 읽고, 파일에 정의된 대로 정확하게 배포를 생성합니다.

선언적 배포를 위해서는 YAML 파일을 먼저 생성해야 합니다.

다음은 new_deployment.yaml이라는 이름의 배포 YAML 파일 예시입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  # 포드 복제본 수 지정
  replicas: 3
  # 배포에서 관리할 포드 선택
  selector:
    # 정의된 레이블과 일치
    matchLabels:
      deploy: example
  template:
    metadata:
      # 포드에 레이블 지정
      labels:
        deploy: example
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.2 

이 YAML 파일은 쿠버네티스 API 버전, 생성할 객체 종류(배포)와 이름을 정의하고, 이후에 사양(spec) 섹션이 이어집니다. 사양 섹션에서는 우선 `replicas` 키를 통해 배포가 유지해야 할 포드 인스턴스 수를 지정합니다.

배포는 선택자 레이블을 사용하여 포드를 식별합니다. 배포 레이블을 활용하여 이 레이블과 일치하는 모든 포드를 해당 배포로 그룹화합니다.

다음으로 배포 사양 내부에 포드 템플릿 객체가 있습니다. 배포는 포드를 생성할 때 이 템플릿을 활용합니다. 포드 사양은 템플릿 키 아래에 정의됩니다.

이 배포 설정은 `nginx` 이미지를 사용하여 지정된 레이블로 포드를 배포합니다. 또한, 포드는 쿠버네티스에서 확장성의 기본 단위이므로, 단일 포드 내에 여러 컨테이너를 배치할 경우 신중하게 고려해야 합니다.

이제 `new_deployment.yaml` 파일을 적용하려면 다음 명령어를 사용합니다.

kubectl apply -f new_deployment.yaml

몇 초 후 다음 명령어를 사용하여 배포 상태를 확인할 수 있습니다.

kubectl get all

배포 조회 및 업데이트

생성된 포드, 배포, 그리고 레플리카셋을 확인할 수 있습니다. 배포는 항상 레플리카셋을 생성하고 관리합니다. 이제 다음 명령어로 배포에 대한 자세한 정보를 확인할 수 있습니다.

kubectl describe deployment nginx-deployment

배포에 대한 자세한 정보가 표시됩니다. 포드를 생성하고 재구축하는 데 사용되는 전략이 `RollingUpdate`로 설정된 것을 강조합니다.

`RollingUpdate` 전략을 사용하면 애플리케이션의 한 버전을 새 버전으로 점진적으로 마이그레이션할 수 있습니다. 이것이 쿠버네티스에서 기본적으로 사용되는 전략입니다.

이 외에도 다음과 같은 전략이 있습니다.

  • 재생성(Recreate): 현재 실행 중인 포드 인스턴스를 중지하고 새 버전으로 다시 생성합니다.
  • 블루/그린(Blue/Green): 두 개의 별도 환경을 만들고, 한 환경(블루)에서 기존 애플리케이션을 실행하는 동안 다른 환경(그린)에서 새 버전을 실행합니다.
  • 카나리아(Canary): 일부 사용자에게 애플리케이션 또는 서비스를 점진적으로 출시하는 배포 전략입니다.

“롤링 업데이트”를 선택하면 원하는 복제본 수에 따른 동작을 설정할 수 있습니다.

  • `maxSurge` 설정을 통해 현재 구성된 복제본 수 외에 추가로 생성할 수 있는 포드 수를 백분율 또는 절대값으로 지정할 수 있습니다.
  • `maxUnavailable` 설정을 통해 업데이트 중에 “사용 불가능한” 상태가 될 수 있는 포드 수를 백분율 또는 절대값으로 지정할 수 있습니다.

이러한 구성 설정을 통해 애플리케이션 특성과 자동 스케일링 요구 사항에 따라 서비스 품질(QoS)을 보장하거나 배포 속도를 높일 수 있습니다.

다음으로 포드 수를 10개로 늘리고 Nginx 이미지 태그를 최신 버전으로 업데이트해야 합니다.

kubectl scale deployment nginx-deployment --replicas=10

5개의 컨테이너가 생성 중이며 총 10개의 포드 중 5개의 포드를 사용할 수 있습니다.

몇 초 후 다음 명령어를 실행합니다.

kubectl get all

모든 포드가 정상적으로 생성되었고 컨테이너가 실행 중인 것을 확인할 수 있습니다.

배포 삭제

쿠버네티스 배포를 삭제하려면 다음 명령어를 사용합니다.

kubectl delete deploy nginx-deployment
kubectl delete deploy new_deployment.yaml

Helm: 배포 간소화

수십 개 또는 수백 개의 쿠버네티스 리소스를 사용하는 복잡한 애플리케이션을 배포해야 하는 경우, `kubectl` 도구만으로는 충분하지 않을 수 있습니다. 이러한 복잡성을 해소하기 위해 Helm이라는 도구가 개발되었습니다. Helm은 `kubectl`을 기반으로 구축되었으며 애플리케이션 배포를 단순화하는 쿠버네티스용 패키지 관리자입니다.

Helm에서 애플리케이션 배포는 릴리스(release)라고 합니다. 이는 차트(chart)라는 일련의 구성 파일과 연결됩니다. 차트는 쿠버네티스 리소스를 설명하는 템플릿과 전역 변수를 포함하는 YAML 형식 파일 모음입니다.

결론

배포는 쿠버네티스에서 매우 중요한 객체입니다. 배포는 강력한 기능을 제공하지만, 설정 시 주의를 기울이지 않으면 예기치 않은 동작을 초래할 수 있습니다. 배포 설정을 자세히 알아보려면 쿠버네티스 공식 문서를 참조하는 것이 좋습니다.

또한, 쿠버네티스를 처음부터 배우고 전문가 수준으로 성장하고 싶다면 다양한 쿠버네티스 튜토리얼을 살펴보는 것이 유용합니다.