이 글은 아래 자료를 참고하여 작성되었습니다.
Udemy [Kubernetes For the Absolute Beginners]
1. Deployment란?
Kubernetes Deployment는 애플리케이션을 클러스터에 쉽게 배포하고 관리할 수 있는 리소스이다. 애플리케이션 업데이트와 롤백을 무중단으로 수행하며, 애플리케이션의 가용성과 신뢰성을 높일 수 있다. 또한 Deployment는 자동 스케일링과 서비스 디스커버리를 지원하여, 클라우드 네이티브 환경에서 유연하고 안정적인 운영을 가능하게 한다.
2. Deployment 주요 기능
- 애플리케이션 배포: Deployment는 Pod의 템플릿을 정의하고, 이를 기반으로 클러스터에 여러 개의 Pod 인스턴스를 생성한다. 이를 통해 애플리케이션의 인스턴스를 쉽게 배포할 수 있다. 배포 시 Deployment는 기본적으로 롤링 업데이트 전략을 사용하여 이전 버전의 Pod을 점진적으로 새 버전의 Pod로 교체한다. 이 과정에서 서비스의 중단 없는 업데이트가 가능하다.
- 변경 사항 일시 중지 및 재개: Deployment의 롤아웃을 일시 정지하여 PodTemplateSpec에 변경 사항을 적용하고, 이후 재개하여 새로운 롤아웃을 시작할 수 있다. 이 과정은 애플리케이션의 업데이트를 특정 수정 사항이나 결함을 해결한 후에 다시 시작할 때 유용하다.
- 롤백: 롤링 업데이트 중 문제가 발생할 경우, Deployment는 자동으로 이전 버전으로 롤백하여 서비스의 안정성을 유지할 수 있다. 수동으로 특정 ReplicaSet으로 롤백하는 것도 가능하다.
- 각 버전의 관리: Deployment는 각 롤아웃 또는 롤백마다 새로운 ReplicaSet을 생성하고 이를 관리한다. 이를 통해 각 버전의 배포 상태와 히스토리를 추적할 수 있다.
- 자동 스케일링: Deployment는 Pod의 수평 스케일링을 설정할 수 있다. 이는 트래픽이나 부하에 따라 Pod 인스턴스의 개수를 자동으로 조정하여 애플리케이션의 성능을 최적화한다.
- 서비스 디스커버리 및 로드 밸런싱: Deployment는 서비스와 함께 사용되어 클러스터 내의 다른 애플리케이션과 통신하며, 로드 밸런싱을 통해 트래픽을 분산시킨다.
3. Rollout과 버전 관리
- Rollout
- Rollout은 Kubernetes에서 Deployment가 새로운 버전의 애플리케이션을 클러스터에 배포하는 과정을 말한다. 이 과정에서 Deployment는 새로운 ReplicaSet을 생성하고 이전 ReplicaSet에서 새 ReplicaSet으로 Pod를 옮기며 점진적으로 업데이트를 수행한다 (롤링업데이트)
- 버전 관리
- Deployment는 여러 버전의 애플리케이션을 관리할 수 있는 기능을 제공한다. Deployment는 고유한 버전을 가리키는 ReplicaSet을 생성하며, 업데이트할 때마다 새로운 ReplicaSet이 생성되어 버전이 관리된다.
- 롤백 시 이전 버전의 ReplicaSet으로 되돌리거나, 특정 버전의 ReplicaSet을 기반으로 배포를 수행할 수 있습니다.
4. 배포 전략
- RollingUpdate (롤링 업데이트) : default
- 장점: 점진적으로 Pod를 교체하므로 서비스의 지속적인 가용성을 제공하며, 안정적인 배포를 보장한다.
- 단점: 업데이트 속도가 상대적으로 느릴 수 있으며, 트래픽이 집중된 상황에서는 리소스 소모가 발생할 수 있다.
- Recreate (재생성)
- 장점: 새로운 ReplicaSet을 만들고 한 번에 이전 버전을 제거하므로 간단하고 빠르게 배포할 수 있다.
- 단점: 배포 중 서비스 중단이 발생할 수 있으며, 롤백 시간도 오래 걸릴 수 있다 (현재 실행 중인 모든 인스턴스를 삭제한 다음 이전 버전의 인스턴스를 다시 생성해야 하므로)
- 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
- 현재 최신 revision이 3이고 history에 revision [1, 2, 3] 존재
kubectl rollout undo deployment/[deployment-name]
- revision2으로 rollback되고 history에는 revision [1, 3, 4] 존재 (revision4 = revision2 = 현재 revision)
- (다시)
kubectl rollout undo deployment/[deployment-name]
- 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 |