Deployment는 Kubernetes의 리소스 중 하나로, 애플리케이션을 배포하고 관리하기 위한 가장 일반적인 방식이다.
Deployment를 통해 애플리케이션의 생명 주기 관리, 버전 업데이트, 수평 확장(스케일링) 등을 선언적 방식으로 제어할 수 있다.
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:
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
(4) 수평 확장
- 부하에 따라 파드의 복제본 수를 동적으로 조정.
kubectl scale deployment my-deployment --replicas=5
(5) 상태 확인
- Deployment의 상태와 진행 상황을 확인 가능
kubectl get deployment my-deployment kubectl describe deployment my-deployment
Deployment | ReplicaSet | ReplicationController | |
주요 목적 | 배포 및 관리 자동화 | 파드 복제본 관리 | 파드 복제본 관리 |
자동 업데이트 | 지원 (롤링 업데이트 및 롤백 가능) | 미지원 | 미지원 |
추천 사용 사례 | 대부분의 애플리케이션 관리에 적합 | 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
ReplicaSet과 Deployment의 주요 차이점
ReplicaSet | Deployment | |
주요 목적 | 파드 복제본(replica)을 유지하고 관리. | 애플리케이션의 배포, 업데이트, 롤백 등 전체 생명 주기를 관리. |
롤링 업데이트 | 지원하지 않음. 수동으로 관리해야 함. | 롤링 업데이트 및 롤백을 자동으로 지원. |
버전 관리 | 이전 버전의 상태를 유지하거나 롤백할 수 없음. | 애플리케이션 버전 관리 및 롤백 지원. |
직접 사용 여부 | 일반적으로 직접 사용하지 않고, Deployment 내부에서 생성 및 관리됨. | 사용자가 직접 정의하고 관리하며, ReplicaSet을 생성함. |
주요 사용 사례 | Deployment의 내부 구성 요소로 사용되며 직접 정의하지 않는 것이 일반적. | 대부분의 애플리케이션 배포 및 관리에 적합. |
ReplicaSet은 Deployment의 내부 컴포넌트로 작동한다.
- ReplicaSet 생성: Deployment는 내부적으로 ReplicaSet을 생성하여 파드 복제본(replica)을 관리한다.
- 예를 들어, Deployment로 3개의 파드를 실행하려면 Kubernetes는 이를 관리하는 ReplicaSet을 생성한다.
- ReplicaSet과 파드 연결: ReplicaSet은 Deployment의 파드 템플릿에 따라 생성된 파드를 유지한다.
- 업데이트 관리: Deployment가 롤링 업데이트를 수행하면, 새로운 ReplicaSet을 생성하여 새로운 파드를 실행하고, 이전 ReplicaSet을 점진적으로 삭제한다.
즉, Deployment는 ReplicaSet을 상위 수준에서 관리하는 리소스로, 배포, 업데이트, 롤백 같은 고급 기능을 제공한다. 일반적으로 Deployment를 사용하여 애플리케이션을 배포하고 관리하며, ReplicaSet은 직접 정의하지 않는다.
Deployment와 서비스(Services)의 관계
Deployment는 파드의 생명 주기를 관리하고, 서비스는 이러한 파드에 접근할 수 있는 네트워크 엔드포인트를 제공
- Deployment: 파드 생성 및 관리.
- Service: Deployment에서 생성된 파드에 트래픽을 라우팅.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
반응형
'Container > Kubernetes' 카테고리의 다른 글
[K8S] Static Pods (0) | 2025.01.07 |
---|---|
[K8S] Endpoints (0) | 2025.01.02 |
[K8S] kube-proxy (0) | 2024.12.28 |
[K8S] Kube-controller-manager (0) | 2024.12.24 |
[K8S] Kube-API Server (0) | 2024.12.24 |