Deployment는 Kubernetes의 리소스 중 하나로, 애플리케이션을 배포하고 관리하기 위한 가장 일반적인 방식이다.
Deployment를 통해 Pod와 ReplicaSet의 생명 주기 관리, 버전 업데이트, 수평 확장(스케일링) 등을 선언적 방식으로 제어할 수 있다.
Deployment의 주요 기능
- 애플리케이션 배포: 새로운 애플리케이션을 손쉽게 클러스터에 배포, 무중단 배포 보장
- 자동 업데이트 및 롤백:
- 새로운 버전의 애플리케이션을 배포하면서 이전 버전으로의 롤백 기능도 제공
- 업데이트가 실패하거나 문제가 발생하면 자동으로 롤백 가능
- 수평 확장: 애플리케이션 부하에 따라 파드의 수를 동적으로 조정(스케일링)
- 셀프 힐링(Self-Healing): 비정상적으로 종료된 파드나 노드 장애가 발생한 경우 자동으로 새 파드를 생성.
- 선언적 관리: YAML 또는 JSON 파일로 애플리케이션의 상태를 정의하고, Kubernetes가 이를 원하는 상태와 일치하도록 유지.
Yaml 파일
# Replicaset과 kind 빼고는 전부 동일하다.
[master ~]$ cat > deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
spec:
replicas: 3
selector: # 생성된 replicaset이 관리할 파드를 찾아내는 방법 정의
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
[node1 ~]$ kubectl create -f deploy-nginx.yaml
deployment.apps/deploy-nginx created
[node1 ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-9cc457697-6mrjb 1/1 Running 0 15s 10.5.2.2 node3 <none> <none>
deploy-nginx-9cc457697-hpf5l 1/1 Running 0 15s 10.5.1.3 node2 <none> <none>
deploy-nginx-9cc457697-l9xfj 1/1 Running 0 15s 10.5.1.2 node2 <none> <none>
[node1 ~]$ kubectl get deploy,rs,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deploy-nginx 3/3 3 3 66s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deploy-nginx-9cc457697 3 3 3 67s
NAME READY STATUS RESTARTS AGE
pod/deploy-nginx-9cc457697-6mrjb 1/1 Running 0 67s
pod/deploy-nginx-9cc457697-hpf5l 1/1 Running 0 67s
pod/deploy-nginx-9cc457697-l9xfj 1/1 Running 0 67s
------------ --------- ----
deployment RS controller pod
Deployment의 주요 동작
(1) 새로운 애플리케이션 배포
- Deployment를 생성하면 Kubernetes가 지정된 수의 파드(replica)를 자동으로 생성하고 관리.
(2) 롤링 업데이트 (스케일 업)
- 새로운 파드를 한 개 생성.
- 이전 버전의 파드를 한 개 종료.
- 모든 파드가 새로운 버전으로 교체될 때까지 반복.
(3) 롤백 (스케일 다운)
- 새로운 업데이트가 실패하거나 문제가 발생할 경우 이전 버전으로 되돌릴 수 있음.
kubectl rollout undo deployment my-deployment
# deployment의 롤아웃 상태 확인
$ kubectl rollout status deployment <deployment-name>
- 일시 중지
- 일시 중지된 디플로이먼트를 재개할 때까지 롤백할 수 없다.
$ kubectl rollout pause deployment <deployment_name>
- 진행사항 모니터링
$ kubectl rollout status
(4) 수평 확장
- 부하에 따라 파드의 복제본 수를 동적으로 조정.
kubectl scale deployment my-deployment --replicas=5
- 수직확장
kubectl set resources deployment <deploy_name> -c=<container_name> --limits=cpu=200m,memory=512Mi
- HPA(HorizontalPodAutoscaler)가 deployment 크기를 관리하고 있다면 replicas를 설정해서는 안된다. (control-plane이 자동관리한다.)
(5) 상태 확인
- Deployment의 상태와 진행 상황을 확인 가능
kubectl get deployment my-deployment kubectl describe deployment my-deployment
- Deployment로 생성된 레플리카셋 확인
# Deployment가 내부적으로 ReplicaSet을 생성하고 이를 통해 파드를 관리해서 결과가 같은 것 처럼 보인다.
controlplane ~ ➜ kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend-deployment-649fb4c7c 4 4 0 2m42s
# Deployment가 생성한 ReplicaSet이 표시된다.
controlplane ~ ➜ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
frontend-deployment 0/4 4 0 2m48s
Rolling update 설정
.spec.strategy.type==RollingUpdate이면,
- maxSurge (default : 25%): 의도한 파드의 수에 대해 생성할 수 있는 최대 파드의 수를 지정하는 선택적
- maxUnavailable (default : 25%): 업데이트 프로세스 중에 사용할 수 없는 최대 파드의 수를 지정하는 선택적 필드
- ex. maxUnavailable = 30%로 설정되면 rolling update 시작 시 이전 레플리카셋의 크기를 의도한 파드 중 70%를 스케일 다운한다. 즉, 업데이트 중에 사용 가능한 전체 파드 수는 의도한 파드 수의 70% 이상이 되도록 스케일 업 한다.
Deployment와 Replicaxx의 주요 차이점
Deployment | ReplicaSet | ReplicationController | |
주요 목적 | 배포 및 관리 자동화 | 파드 복제본 관리 | 파드 복제본 관리 |
자동 업데이트 | 지원 (롤링 업데이트 및 롤백 가능) | 미지원 | 미지원 |
추천 사용 사례 | 대부분의 애플리케이션 관리에 적합 | Deployment의 내부 구성요소 | 이전 버전 레거시 지원 |
ReplicaSet과 Deployment의 주요 차이점
ReplicaSet | Deployment | |
주요 목적 | 파드 복제본(replica)을 유지하고 관리. | 애플리케이션의 배포, 업데이트, 롤백 등 전체 생명 주기를 관리. |
롤링 업데이트 | 지원하지 않음. 수동으로 관리해야 함. | 롤링 업데이트 및 롤백을 자동으로 지원. |
버전 관리 | 이전 버전의 상태를 유지하거나 롤백할 수 없음. | 애플리케이션 버전 관리 및 롤백 지원. |
직접 사용 여부 | 일반적으로 직접 사용하지 않고, Deployment 내부에서 생성 및 관리됨. | 사용자가 직접 정의하고 관리하며, ReplicaSet을 생성함. |
주요 사용 사례 | Deployment의 내부 구성 요소로 사용되며 직접 정의하지 않는 것이 일반적. | 대부분의 애플리케이션 배포 및 관리에 적합. |
ReplicaSet은 Deployment의 내부 컴포넌트로 작동한다.
→ Deployment는 내부적으로 ReplicaSet을 생성하여 파드 복제본(replica)을 관리한다.
- 예를 들어, Deployment로 3개의 파드를 실행하려면 Kubernetes는 이를 관리하는 ReplicaSet을 생성한다.
- ReplicaSet과 파드 연결: ReplicaSet은 Deployment의 파드 템플릿에 따라 생성된 파드를 유지한다.
- 업데이트 관리: Deployment가 롤링 업데이트를 수행하면, 새로운 ReplicaSet을 생성하여 새로운 파드를 실행하고, 이전 ReplicaSet을 점진적으로 삭제한다.
📝 즉, Deployment는 ReplicaSet을 상위 수준에서 관리하는 리소스로, 배포, 업데이트, 롤백 같은 고급 기능을 제공한다.
일반적으로 Deployment를 사용하여 애플리케이션을 배포하고 관리하며, ReplicaSet은 직접 정의하지 않는다!
반응형
'Container > Kubernetes' 카테고리의 다른 글
[K8S] Static Pods (0) | 2025.01.07 |
---|---|
[K8S] Endpoints (0) | 2025.01.02 |
[K8S] kube-proxy (0) | 2024.12.28 |
[K8S] kubelet (0) | 2024.12.27 |
[K8S] Kube-controller-manager (0) | 2024.12.24 |