Deplyment
- 현재 한 서비스가 운영 중인데, 이 서비스를 업데이트 해야 돼서 재배포를 해야 될 때 도움을 주는 컨트롤러이다.
- 쿠버네티스에서 배포 전략에 따른 서비스 업데이트 방식은 아래 사진과 같다.
- ReCreate
- Deployment를 만들면 v1의 Pod들이 만들어진다.
- Pod를 업데이트 하려고 한다면, 해당 Pod를 삭제해준다. -> 서비스에 대한 Downtime 발생
- v2에 대한 파드를 만들어준다.
- Rolling Update
- Deployment를 만들면 v1의 Pod들이 만들어진다.
- 먼저 v2에 대한 파드를 하나 만들어준다.
- v1과 v2에 모두 서비스가 되고 있기 때문에 누군가는 v1에, 또 다른 누군가는 v2에 접속된다.
- v1이 사라지지 않은 상태에서 v2를 추가하므로 추가적인 자원을 요구하지만 Downtime이 존재하지 않는 장점이 있다.
- v1의 Pod 한 개를 제거해준다.
- v1에 대한 Pod가 없어질 때까지 (2, 3)번 작업을 반복한다.
- Blue/Green (Deployment 컨트롤러에 한정된 방식 X)
- 컨트롤러를 만들어서 v1의 파드가 생성된다. 이때의 파드는 라벨이 존재하므로, Service와 연결이 된다.
- 새로운 컨트롤러를 만들어서 v2의 파드를 생성한다. 이때의 라벨은 v1의 라벨과 다른 값을 띈다. -> 이때 자원 사용량이 기존에 2배가 된다.
- Service의 셀렉터를 v1에 대한 라벨에서 v2에 대한 라벨로 변경해준다.
- 기존 파드, v1의 파드와의 관계는 끊어버리고 v2 버전의 새 파드와 바로 연결이 된다.
- 순간적으로 변경이 되기 때문에 서비스에 대한 Downtime이 없다.
- 만약 v2에 문제가 발생하면 다시 셀렉터를 v1에 대한 라벨로 바꿔주면 기존 서비스로 전환이 되므로 롤백이 쉽다.
- v2에 문제가 없다면 v1에 대한 파드를 모두 삭제해주면 된다.
- Canary
- v1과 v2에 대한 컨트롤러를 만들고, 각각 v1 Pod와 v2 Pod에 대해 서로 다른 Service에 연결해준다.
- 유입되는 트래픽을 URL에 따라서 서비스에 연결을 해주는 Ingress Controller를 붙여준다.
- v2에 대한 서비스가 문제가 없으면 v1을 삭제해주며 v2에 대한 URL을 기본 URL로 변경해준다.
- Downtime X
- 자원 사용량 ⬆️
ReCreate
- Deployment를 만들 때 ReplicaSet에서 넣었던 selector와 replicas, template 값을 똑같이 넣는다.
- 이 값들은 Deployment가 직접 파드를 만들어서 관리하기 위한 값들이 아니다.
- ReplicaSet을 만들고 여기에 값들을 지정하기 위한 용도이다.
- 서비스를 업그레이드 하려면, Deployment의 template를 수정해주면 된다.
- 기존 ReplicaSet의 replicas를 0으로 변경한다.
- 수정된 template가 반영된 새로운 ReplicaSet이 생성되고 Pod도 생성된다.
- strategy: type: 에 배포 전략을 넣어주면 된다.
- revisionHistoryLimit(기본값 10) 만큼만 파드가 없는 ReplicaSet을 남겨둔다. 즉, 1의 값을 지정하면 새로운 ReplicaSet 하나와, 기존 중 가장 최근의 생성된 ReplicaSet이 존재하게 된다.
Rolling Update
- ReCreate 방식과 비교했을 때 서비스를 업데이트하기 위해 template를 수정하는 과정까지는 동일하다.
- 새로운 ReplicaSet이 만들어지기 시작하는 과정부터 달라진다.
- 기존의 ReplicaSet의 replicas를 그대로 두고, 새로운 ReplicaSet이 만들어질 때 Deployment에 지정한 replicas가 아닌, 1의 값부터 시작한다.
- 이후 기존 ReplicaSet의 replicas를 1로 만들고 새 ReplicaSet의 replicas를 1 증가시켜준다.
- 마지막으로 기존 ReplicaSet의 replicas를 0으로 만들고 v2로만 서비스를 운영한다.
- ReCreate와 마찬가지로 revisionHistoryLimit에 의해 사용이 끝난 ReplicaSet에 대해 삭제 여부가 결정된다.
- v2에 대한 ReplicaSet이 동일한 라벨을 가지고 있는 v1의 파드를 가리키지 않는 이유는 새로운 ReplicaSet이 만들어질 때 파드에 고유한 라벨을 붙여주고, 새 ReplicaSet 또한 이에 대한 고유한 셀렉터를 가지기 때문이다.
- minReadySeconds(기본값 0) 만큼 파드가 사라지고 생성될 때 텀을 줄 수 있다.
- 만약 값을 지정 안 해서 기본값 0이 들어가면 v1과 v2의 파드들이 추가되고 삭제되는 게 순식간에 진행된다.
롤백
kubectl rollout history deployment deployment-1
- 이 명령어를 통해 Deployment에 의해 생성된 ReplicaSet의 revision을 볼 수 있다.
kubectl rollout undo deployment deployment-1 --to-revision=2
- 이 명령어를 통해 ReplicaSet을 롤백시킬 수 있다.
- 이 명령어를 통해 이전 버전의 ReplicaSet이 가장 최신 버전이 된다.
- 즉, revision 값이 1인 것과 2인 것이 있을 때 1로 롤백을 시키고 template를 수정할 시에, revision 값이 2인 것이 사라진다.
'Infra > Kubernetes' 카테고리의 다른 글
Pod - Lifecycle (0) | 2025.06.17 |
---|---|
DaemonSet, Job, CronJob (0) | 2025.06.15 |
Controller - ReplicaSet 특징 -> Template, Replicas, Selector (0) | 2025.06.12 |
쿠버네티스 - 컨트롤러 제공 기능 (0) | 2025.06.12 |
Namespace, ResourceQuota, LimitRange (0) | 2025.06.10 |