8. Core Concepts - Deployment

2024. 7. 4. 01:27·Kubernetes
이 글은 아래 자료를 참고하여 작성되었습니다.

Udemy [Kubernetes For the Absolute Beginners]

 

1. Deployment란?

Kubernetes Deployment는 애플리케이션을 클러스터에 쉽게 배포하고 관리할 수 있는 리소스이다. 애플리케이션 업데이트와 롤백을 무중단으로 수행하며, 애플리케이션의 가용성과 신뢰성을 높일 수 있다. 또한 Deployment는 자동 스케일링과 서비스 디스커버리를 지원하여, 클라우드 네이티브 환경에서 유연하고 안정적인 운영을 가능하게 한다.

 

2. Deployment 주요 기능

  1. 애플리케이션 배포: Deployment는 Pod의 템플릿을 정의하고, 이를 기반으로 클러스터에 여러 개의 Pod 인스턴스를 생성한다. 이를 통해 애플리케이션의 인스턴스를 쉽게 배포할 수 있다. 배포 시 Deployment는 기본적으로 롤링 업데이트 전략을 사용하여 이전 버전의 Pod을 점진적으로 새 버전의 Pod로 교체한다. 이 과정에서 서비스의 중단 없는 업데이트가 가능하다.
  2. 변경 사항 일시 중지 및 재개: Deployment의 롤아웃을 일시 정지하여 PodTemplateSpec에 변경 사항을 적용하고, 이후 재개하여 새로운 롤아웃을 시작할 수 있다. 이 과정은 애플리케이션의 업데이트를 특정 수정 사항이나 결함을 해결한 후에 다시 시작할 때 유용하다.
  3. 롤백: 롤링 업데이트 중 문제가 발생할 경우, Deployment는 자동으로 이전 버전으로 롤백하여 서비스의 안정성을 유지할 수 있다. 수동으로 특정 ReplicaSet으로 롤백하는 것도 가능하다.
  4. 각 버전의 관리: Deployment는 각 롤아웃 또는 롤백마다 새로운 ReplicaSet을 생성하고 이를 관리한다. 이를 통해 각 버전의 배포 상태와 히스토리를 추적할 수 있다.
  5. 자동 스케일링: Deployment는 Pod의 수평 스케일링을 설정할 수 있다. 이는 트래픽이나 부하에 따라 Pod 인스턴스의 개수를 자동으로 조정하여 애플리케이션의 성능을 최적화한다.
  6. 서비스 디스커버리 및 로드 밸런싱: Deployment는 서비스와 함께 사용되어 클러스터 내의 다른 애플리케이션과 통신하며, 로드 밸런싱을 통해 트래픽을 분산시킨다.

 

3. Rollout과 버전 관리

  1. Rollout
    • Rollout은 Kubernetes에서 Deployment가 새로운 버전의 애플리케이션을 클러스터에 배포하는 과정을 말한다. 이 과정에서 Deployment는 새로운 ReplicaSet을 생성하고 이전 ReplicaSet에서 새 ReplicaSet으로 Pod를 옮기며 점진적으로 업데이트를 수행한다 (롤링업데이트)
  2. 버전 관리
    • Deployment는 여러 버전의 애플리케이션을 관리할 수 있는 기능을 제공한다. Deployment는 고유한 버전을 가리키는 ReplicaSet을 생성하며, 업데이트할 때마다 새로운 ReplicaSet이 생성되어 버전이 관리된다.
    • 롤백 시 이전 버전의 ReplicaSet으로 되돌리거나, 특정 버전의 ReplicaSet을 기반으로 배포를 수행할 수 있습니다.

 

4. 배포 전략

  1. RollingUpdate (롤링 업데이트) : default
    • 장점: 점진적으로 Pod를 교체하므로 서비스의 지속적인 가용성을 제공하며, 안정적인 배포를 보장한다.
    • 단점: 업데이트 속도가 상대적으로 느릴 수 있으며, 트래픽이 집중된 상황에서는 리소스 소모가 발생할 수 있다.
  2. Recreate (재생성)
    • 장점: 새로운 ReplicaSet을 만들고 한 번에 이전 버전을 제거하므로 간단하고 빠르게 배포할 수 있다.
    • 단점: 배포 중 서비스 중단이 발생할 수 있으며, 롤백 시간도 오래 걸릴 수 있다 (현재 실행 중인 모든 인스턴스를 삭제한 다음 이전 버전의 인스턴스를 다시 생성해야 하므로)
  3. Blue-Green Deployment (블루-그린 배포)
    • 장점: 두 개의 별도 환경(블루와 그린)을 준비하여 전환할 수 있어, 제로 다운타임 배포가 가능하다.
    • 단점: 인프라 비용이 증가할 수 있으며, 배포 시스템 구성이 복잡할 수 있다.

 

5. Deployment 정의하기

# deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    tier: frontend
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      name: nginx-2
      labels:
        app: myapp
    spec:
      containers:
        - name: nginx
          image: nginx
  • metadata: 
    • name (required): Deployment의 이름을 정의. 클러스터 내에서 고유해야 한다.
    • labels: Deployment에 라벨을 추가
  • spec: 
    • replicas: Deployment가 유지해야 할 Pod의 복제본 수를 정의. 기본값은 1
    • selector (required): Deployment가 관리할 Pod를 선택하는 기준을 정의. matchLabels 또는 matchExpressions를 사용할 수 있다. 
    • template (required): 새로운 Pod를 생성할 때 사용할 Pod 템플릿을 정의
      • template.metadata (required): 생성될 Pod에 추가될 메타데이터 정의
      • template.metadata.labels (required): Deployment의 selector와 일치해야 한다.
      • template.spec (required): Pod의 스펙을 정의
      • template.spec.containers (required): Pod 내의 컨테이너를 정의
# 생성
kubectl create -f [file]
kubectl create deployment [deployment-name] --image=[image-name] --replicas=[num-replicas]

# 목록 보기
kubectl get deploy
kubectl get deployment
kubectl get deployments

# 특정 네임스페이스에서 목록 보기
kubectl get deployments -n [namespace]

# 상세정보 조회
kubectl describe deployment [deployment-name]

# 삭제
# 관리하고 있는 replicaset과 pod들도 모두 함께 삭제된다
kubectl delete deployment [deployment-name]

# 스케일링 (definition 파일 수정 x)
kubectl scale deployment [deployment-name] --replicas=[num-replicas]

# Deployment 업데이트 (새로운 이미지로 롤링 업데이트, 파일 수정 x)
kubectl set image deployment/[deployment-name] [container-name]=[new-image]

# Deployment 업데이트 (수정된 파일로 업데이트 진행)
kubectl apply -f [file]

# rollout 상태 조회
kubectl rollout status deployment/[deployment-name]

# rollout 이력 조회
# REVISION  CHANGE-CAUSE
# 생성/업데이트 시에 CHANGE-CAUSE에 명령어를 기록하고 싶으면 --record 옵션을 추가해주어야 한다. ex) kubectl create -f [file] --record
kubectl rollout history deployment/[deployment-name]

# 특정 이력으로 rollback
kubectl rollout undo deployment/[deployment-name] --to-revision=[revision-number]
kubectl rollout undo deployment/[deployment-name]  #바로 이전 버전으로 rollback

# rollout 일시 중지 및 재개
kubectl rollout pause deployment/[deployment-name]
kubectl rollout resume deployment/[deployment-name]
  • rollback test
    1. 현재 최신 revision이 3이고 history에 revision [1, 2, 3] 존재
    2. kubectl rollout undo deployment/[deployment-name]
    3. revision2으로 rollback되고 history에는 revision [1, 3, 4] 존재 (revision4 = revision2 = 현재 revision)
    4. (다시) kubectl rollout undo deployment/[deployment-name]
    5. revision3으로 rollback되고 history에는 revision [1, 4, 5] 존재 (revision5 = revision3 = 현재 revision)

'Kubernetes' 카테고리의 다른 글

10. Core Concepts - Services  (1) 2024.07.18
9. Kubernetes Overview - Networking  (1) 2024.07.08
7. Core Concepts - ReplicaSet  (0) 2024.06.25
6. Core Concepts - pod  (0) 2024.06.24
5. Introduction - Minikube  (1) 2024.06.24
'Kubernetes' 카테고리의 다른 글
  • 10. Core Concepts - Services
  • 9. Kubernetes Overview - Networking
  • 7. Core Concepts - ReplicaSet
  • 6. Core Concepts - pod
SerenaDev
SerenaDev
나의 기술블로그 입니다.
  • SerenaDev
    나의 기술블로그
    SerenaDev
    • 분류 전체보기 (33)
      • FastAPI (1)
      • Iceberg (6)
      • Kubernetes (24)
      • ETC (1)
      • 독서 (1)
  • hELLO· Designed By정상우.v4.10.0
SerenaDev
8. Core Concepts - Deployment
상단으로

티스토리툴바