[k8s] 배포 전략

업데이트:     Updated:

카테고리:

태그:

🎯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의 라벨을 변경함으로써 실현할 수 있습니다.

  1. 기존 버전(v1)의 디플로이먼트가 생성돼 있으며, 서비스는 사용자 요청을 v1 포드로 전달하고 있습니다.
  2. 새 버전(v2)의 디플로이먼트를 생성합니다.
  3. 새 버전의 디플로이먼트가 잘 동작하는 것을 확인했다면 서비스의 라벨을 변경함으로써 서비스를 통한 요청이 새 버전의 디플로이먼트로 전달되도록 수정합니다.
  4. 만약 이전 버전으로 롤백이 필요하다면 서비스의 라벨을 다시 이전 상태로 되돌립니다.
$ 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의 라벨을 변경함으로써 실현할 수 있습니다.

  1. 이전 버전(v1)과 새 버전(v2)의 디플로이먼트를 생성합니다. 이떄 두 버전의 라벨은 같은 값을 가집니다.
  2. 서비스는 2개의 디플로이먼트에 의해 생성된 파드 집합의 replicas 개수에 따라 트래픽을 분배합니다.
  3. 새 버전의 디플로이먼트가 잘 작동하는 것을 확인했다면 새 버전의 replicas를 늘리고 서비스의 라벨 셀렉터를 변경합니다.
  4. 이전 버전의 디플로이먼트를 삭제합니다.
  5. 만약 이전 버전으로 롤백이 필요하다면 라벨을 이전 상태로 되돌립니다.
$ 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

📌출처

[시작하세요! 도커/쿠버네티스 위키북스 용찬호 저]


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

k8s 카테고리 내 다른 글 보러가기

댓글남기기