쿠버네티스 배포 전략

xgro·2022년 7월 4일
0

Kubernetes

목록 보기
1/3

[C181] 디플로이먼트가 지원하는 배포 전략에서 블루/그린이나 카나리는 찾아볼 수 없습니다. 어떻게 블루/그린이나 카나리 배포를 할 수 있을까요?

최신버전에서 업데이트 된 기능이 있는지 확인하였다. ( 기준 날짜 : 2022.06.30 )

Deployment

📌 쿠버네티스 디플로이먼트

👉 블루/그린


그림 출처 - https://itnext.io/kubectl-plugin-for-blue-green-deployment-strategy-cc5b40a87817

쿠버네티스 디플로이먼트가 정식으로 지원하지 않는다.

디플로이먼트를 블루(v1)/그린(v2) 각각 생성하여 서비스의 셀렉터를 이용하여 버전을 적용한다.

✅ Deployment Blue

블루에 해당하는 ReplicaSet 생성

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 2
  selector:
    matchLabels:
      ver: v1
  template:
    metadata:
      name: pod1
      labels:
        ver: v1
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 0

✅ Service

selector에 ver:v1을 지정하여 ReplicaSet의 Label과 동일하게 구성(ReplicaSet의 Pod와 연결)

apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    ver: v1
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080

✅ Deployment Green

v2의 ReplicaSet을 생성(green)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica2
spec:
  replicas: 2
  selector:
    matchLabels:
      ver: v2
  template:
    metadata:
      name: pod1
      labels:
        ver: v2
    spec:
      containers:
      - name: container
        image: kubetm/app:v2
      terminationGracePeriodSeconds: 0

✅ Service의 selector을 v2로 변경한다.

...
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    ver: v2
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
...

👉 카나리(canary) 디플로이먼트

✅ track 레이블을 사용하여 다른 릴리스를 구별

여러 레이블이 필요한 또 다른 시나리오는 동일한 컴포넌트의 다른 릴리스 또는 구성의 디플로이먼트를 구별하는 것이다. 새 릴리스가 완전히 롤아웃되기 전에 실제 운영 트래픽을 수신할 수 있도록 새로운 애플리케이션 릴리스(파드 템플리트의 이미지 태그를 통해 지정됨)의 카나리 를 이전 릴리스와 나란히 배포하는 것이 일반적이다.

예를 들어, track 레이블을 사용하여 다른 릴리스를 구별할 수 있다.

기본(primary), 안정(stable) 릴리스에는 값이 stable 인 track 레이블이 있다.

     name: frontend
     replicas: 3
     ...
     labels:
        app: guestbook
        tier: frontend
        track: stable
     ...
     image**: gb-frontend:v3

그런 다음 서로 다른 값(예: canary)으로 track 레이블을 전달하는 방명록 프론트엔드의 새 릴리스를 생성하여, 두 세트의 파드가 겹치지 않도록 할 수 있다.

     name: frontend-canary
     replicas: 1
     ...
     labels:
        app: guestbook
        tier: frontend
        track: canary
     ...
     image: gb-frontend:v4

프론트엔드 서비스는 레이블의 공통 서브셋을 선택하여(즉, track 레이블 생략) 두 레플리카 세트에 걸쳐 있으므로, 트래픽이 두 애플리케이션으로 리디렉션된다.

  selector:
     app: guestbook
     tier: frontend

안정 및 카나리 릴리스의 레플리카 수를 조정하여 실제 운영 트래픽을 수신할 각 릴리스의 비율을 결정한다(이 경우, 3:1).

확신이 들면, 안정 릴리스의 track을 새로운 애플리케이션 릴리스로 업데이트하고 카나리를 제거할 수 있다.

보다 구체적인 예시는, Ghost 배포에 대한 튜토리얼을 확인한다.

✅ kind:RouteRule 를 이용한 가중치 설정

RouteRule을 적용하여 v1과 v2의 가중치를 부여하여 카나리 배포를 구현한다.

Example:...
kind:Deployment
metadata:
    name: shasr-app-v1
spec:
    replicas: 5
    template:
        labels:
            app: shasr-app
            version: v1.0.0
...

...
kind:Deployment
metadata:
    name: shasr-app-v2
spec:
    replicas: 1
    template:
        labels:
            app: shasr-app
            version: v2.0.0
...

...
kind:Service
metadata:
    name: shasr-app
spec:
    selector:
        app: shasr-app
...

...
kind:RouteRule
metadata:
    name: shasr-app
    spec:
        destination:
            name: shasr-app
        route:
        - labels:
            version: v1.0.0
          weight:95 # 95% traffic
        - labels:
            version: v2.0.0
          weight:5# 5% traffic
...

✅ 참조 레퍼런스

https://kubernetes.io/ko/docs/concepts/cluster-administration/manage-deployment/#카나리-canary-디플로이먼트

https://medium.com/nerd-for-tech/kubernetes-k8s-deployment-strategies-1ef4c1dc1c6c

https://jangcenter.tistory.com/107

profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글