[k8s] 배포 전략
카테고리: k8s
태그: k8s
🎯4가지 배포 전략
- Recreate Deployment(In-place Deployment)
- Rolling Upgrade Deployment
- Blue/Green Deployment
- Canary Deployment
1️⃣Recreate Deployment
Recreate Deployment 배포 전략은 이전 버전의 소프트웨어를 완전히 종료하고 새 버전을 배포합니다. 이 전략은 새 버전의 소프트웨어가 서비스에 참여할 수 있는 준비를 하는 동안 시스템 다운타임이 발생합니다.
쿠버네티스에서 이 배포 전략은 디플로이먼트의 YAML 파일에 있는 strategy의 type 항목에서 설정할 수 있습니다. 다음은 그 예시입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-recreate
spec:
replicas: 3
strategy:
type: Recreate
...
2️⃣Rolling Upgrade Deployment
Rolling Upgrade Deployment 배포 전략은 이전 버전의 소프트웨어를 새 버전으로 점진적으로 변경합니다. 이 전략은 다운타임 없이 버전 업데이트를 진행할 수 있습니다. 하지만 업그레이드/롤백 주기가 길어질 수 있습니다.
쿠버네티스에서 이 배포 전략은 기본 방법입니다. YAML 파일에서 별도의 설정을 하지 않아도 디플로이먼트의 버전을 업데이트할 때는 롤링 업데이트를 사용합니다.
이떄 기존 버전의 포드를 몇 개씩 삭제할 것인지, 새로운 버전의 포드는 몇 개씩 생성할 것인지는 커스터마이징이 가능합니다. 이러한 세부 옵션을 설정하려면 디플로이먼트를 정의하는 YAML 파일에서 명시적으로 strategy의 type 항목을 RollingUpdate로 설정해야 합니다.
롤링 업데이트의 세부 옵션에는 maxSurce, maxUnavailable 두 가지가 있습니다. (옵션의 값은 숫자나 비율(%)을 값으로 설정할 수 있으며, 비율을 사용하면 전체 포드의 개수(디플로이먼트에 정의된 replicas 값)를 기준으로 값이 결정됩니다., 두 옵션 모두 기본값은 25%입니다.) 다음은 그 예시입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-rolling-update
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2
maxUnavailable: 2
...
maxUnavailable: 롤링 업데이트 도중 사용 불가능한 상태가 되는 포드의 최대 개수를 설정합니다. 즉, 롤링 업데이트 도중에도 사용자의 요청이 처리될 수 있도록 실행 중인 포드의 개수가 일정 값 이하로 내려가지 않도록 유지합니다. 예를 들어,maxUnavilable의 기본값인 25%를 그대로 사용한다면 롤링 업데이트 도중 적어도 75%만틈의 포드는 사용자의 요청을 처리할 수 있는 상태로 유지됩니다.maxSurge: 롤링 업데이트 도중 전체 포드의 개수가 디플로이먼트의 replicas 값보다 얼마나 더 많이 존재할 수 있는지 설정합니다. 이는 곧 새로운 버전의 포드가 얼마나 많이 생성될 수 있는지를 의미합니다. 예를 들어 maxSurge의 기본값인 25%를 그대로 사용한다면(이전 버전의 포드 + 새로운 버전의 포드)의 개수는 replicas 값 대비 최대 125%까지 늘어날 수 있습니다.
3️⃣Blue/Green Deployment
Blue/Green Deployment 배포 전략은 새 버전의 소프트웨어가 이전 버전과 함께 실행됩니다. 새 버전이 모든 요구 사항을 충족하는 것으로 테스트되고 검증된 후 트래픽을 이전 버전에서 새 버전으로 전환합니다.
쿠버네티스에서 이 배포 전략은 자체적으로 지원되지 않지만 service의 라벨을 변경함으로써 실현할 수 있습니다.
- 기존 버전(v1)의 디플로이먼트가 생성돼 있으며, 서비스는 사용자 요청을 v1 포드로 전달하고 있습니다.
- 새 버전(v2)의 디플로이먼트를 생성합니다.
- 새 버전의 디플로이먼트가 잘 동작하는 것을 확인했다면 서비스의
라벨을 변경함으로써 서비스를 통한 요청이 새 버전의 디플로이먼트로 전달되도록 수정합니다. - 만약 이전 버전으로 롤백이 필요하다면 서비스의
라벨을 다시 이전 상태로 되돌립니다.
$ kubectl apply -f bluegreen-deployment-blue.yaml
$ kubectl apply -f bluegreen-service.yaml
$ kubectl apply -f bluegreen-deployment-green.yaml
$ kubectl patch service app-service -p "$(cat blue-green.yaml)"
bluegreen-deployment-blue.yaml
...
template:
metadata:
name: nginx
labels:
version: v1
...
bluegreen-deployment-green.yaml
...
template:
metadata:
name: nginx
labels:
version: v2
...
bluegreen-service.yaml
...
selector:
version: v1
...
# TODO version v1 -> v2
blue-green.yaml
spec:
selector:
color: green
4️⃣Canary Deployment
Canary Deployment 배포 전략은 새 버전을 설정한 다음 점진적으로 프로덕션 트래픽을 이전 버전에서 최신 버전으로 이동합니다. 예를 들어 특정 시점에서 이전 버전은 모든 트래픽의 90%를 유지하고 최신 버전은 트래픽의 10%를 호스팅할 수 있습니다. 이 전략은 새 버전의 안정성을 프로덕션 환경에서 테스트하는 데 도움이 됩니다.
쿠버네티스에서 이 배포 전략은 자체적으로 지원되지 않지만 Blue/Green Deployment와 마찬가지로 service의 라벨을 변경함으로써 실현할 수 있습니다.
- 이전 버전(v1)과 새 버전(v2)의 디플로이먼트를 생성합니다. 이떄 두 버전의 라벨은 같은 값을 가집니다.
- 서비스는 2개의 디플로이먼트에 의해 생성된 파드 집합의 replicas 개수에 따라 트래픽을 분배합니다.
- 새 버전의 디플로이먼트가 잘 작동하는 것을 확인했다면 새 버전의 replicas를 늘리고 서비스의 라벨 셀렉터를 변경합니다.
- 이전 버전의 디플로이먼트를 삭제합니다.
- 만약 이전 버전으로 롤백이 필요하다면
라벨을 이전 상태로 되돌립니다.
$ kubectl apply -f canary-deployment-v1.yaml canary-deployment-v2.yaml
$ kubectl apply -f canary-service.yaml
$ kubectl delete -f canary-deployment-v1.yaml
$ kubectl patch svc app-service "$(cat canary.yaml)"
canary-deployment-v1.yaml
...
template:
metadata:
name: nginx
labels:
app: nginx
version: v1
...
canary-deployment-v2.yaml
...
template:
metadata:
name: nginx
labels:
app: nginx
version: v2
...
canary-service.yaml
...
selector:
app: nginx
...
canary.yaml
spec:
selector:
app: nginx
version: v2
📌출처
[시작하세요! 도커/쿠버네티스 위키북스 용찬호 저]
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기