Deployment 를 사용한 컨테이너 운영은 kubernetes 에서 가장 권장하는 방법이다.
컨테이너를 기동하는 방법에는
1. pod 를 직접 사용하는 방법(단순 기동)
2. replicaset 으로 파드의 replica 갯수를 설정된 상태에 맞도록 유지하도록 유지하는 방법(자동복구 + scaling 가능)
3. deployment 로 n개의 replicaset 을 제어하면서 전체 파드의 갯수는 설정된 상태에 맞도록 유지하는 방법(rolling update 가능)
pod < replicaset < deployment 순서로 포함하는 구조이며, 따라서 상위에서는 하위의 기능을 사용할 수 있다.
1. 디플로이먼트 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
ports:
- containerPort: 80
위 내용으로 디플로이먼트를 생성한 후, 아래 커맨드로 디플로이먼트 및 디플로이먼트가 관리하는 레플리카셋, 그리고 그 레플리카셋이 관리하는 파드를 조회할 수 있다.
$ kubectl get deployments.apps sample-deployment
sample-deployment
$ kubectl get replicasets.apps -l app=sample-app
sample-deployment-79cd77b9d6
$ kubectl get pods -l app=sample-app
sample-deployment-79cd77b9d6-767b4
sample-deployment-79cd77b9d6-7j2zh
sample-deployment-79cd77b9d6-ksjpf
조회 결과를 보면, 디플로이먼트 > 레플리카셋 > 파드 순서로 네이밍 규칙을 이어받아 따르는 것을 알 수 있다.
- deployment 명: {deployment 명}
- ex) sample-deployment
- replicaset 명: {deployment 명}-{10자리 랜덤hash 문자열}
- ex) sample-deployment-79cd77b9d6
- pod 명: {replicaset 명}-{5자리 랜덤hash 문자열}
- ex) sample-deployment-79cd77b9d6-767b4
2. 디플로이먼트 업데이트
이제 deployment 매니페스트 파일의 컨테이너 이미지의 nginx 버전을 1.16 -> 1.17로 변경하고 apply 하면, 자동으로 새로운 replicaset 이 생성되며 rolling update 가 진행된다. 즉, 디플로이먼트가 알아서 rolling update 방식으로 무중단 배포를 진행해준다.
# 매니페스트 파일 수정 후
$ kubectl apply -f sample-deployment.yaml
$ kubectl get replicasets.apps -l app=sample-app
# rolling update 를 위한 새로운 replicaset 이 추가로 생성되었는지 확인
참고로, 다시 nginx 버전을 1.17 -> 1.16 으로 변경하여 rolling update 를 진행한 후 pod 명을 확인해보면, replicaset 과는 다르게 pod 는 재활용되지 않고 새로 생성된 것을 알 수 있다.(파드명이 다름)
- replicaset 은 업데이트시 삭제되지 않고 유지되며, 다시 동일한 spec.template 으로 업데이트시 재사용된다.
- 즉, spec.template 내용의 변경이 있으면 해당 내용으로 레플리카셋이 새로 생성된다.
- 실제로 레플리카셋명의 hash 값은 spec.template 아래의 값으로부터 생성된다.(파드 템플릿 해시)
- nginx 버전을 1.16 -> 1.17 -> 1.16 으로 변경한 경우에 1.16 버전 파드 템플릿 해시값이 동일할 것이므로, 레플리카셋이 새로 생성되지 않고 재사용되는 것이다.
- pod 는 업데이트시 삭제되고 새롭게 생성된다.
# 최초 상태
$ kubectl get rs
sample-deployment-558978b4c5 3 3 3 2m40s
sample-deployment-79cd77b9d6 0 0 0 17m
$ kubectl get po
sample-deployment-558978b4c5-6d9gw 1/1 Running 0 3m56s
sample-deployment-558978b4c5-c7qjx 1/1 Running 0 3m57s
sample-deployment-558978b4c5-tffhz 1/1 Running 0 3m55s
# 첫번째 rolling update 후 => 새로운 replicaset 이 생성되고, 기존 replicaset 는 유지됨. 새로운 replicaset 하위로 pod 가 생성됨.
$ kubectl get rs
sample-deployment-558978b4c5 0 0 0 8m26s
sample-deployment-79cd77b9d6 3 3 3 23m
$ kubectl get po
sample-deployment-79cd77b9d6-56vlj 1/1 Running 0 4s
sample-deployment-79cd77b9d6-rznvh 1/1 Running 0 2s
sample-deployment-79cd77b9d6-tlk5f 1/1 Running 0 4s
# 두번째 rolling update 후 => replicaset 은 유지되나, 그 하위 pod 는 새로 생성됨
$ kubectl get rs
sample-deployment-558978b4c5 3 3 3 8m50s
sample-deployment-79cd77b9d6 0 0 0 24m
$ kubectl get po
sample-deployment-558978b4c5-c4dwd 1/1 Running 0 20s
sample-deployment-558978b4c5-hkb7p 1/1 Running 0 19s
sample-deployment-558978b4c5-tcrtx 1/1 Running 0 18s
'Kubernetes' 카테고리의 다른 글
[Kubernetes] 디플로이먼트 업데이트 전략 (0) | 2025.08.31 |
---|---|
[Kubernetes] 디플로이먼트 롤백 (1) | 2025.08.31 |
[Kubernetes] 레플리카셋을 이용한 파드의 스케일링 (0) | 2025.08.25 |
[Kubernetes] 컨테이너 작업 디렉터리 설정 (0) | 2025.08.24 |
[Kubernetes] 파드 내 모든 컨테이너의 정적 호스트 설정 (0) | 2025.08.24 |