Kubernetes

Kubernetes 기초 - Label(4)

사실 나도 모름 2023. 12. 22. 00:52
  1. 레이블이란
  2. 워커 노드에 레이블 설정
  3. 레이블과 애너테이션
  4. 레이블을 이용한 카나리 배포                ←  오늘 볼 내용

4. 레이블을 이용한 카나리 배포

카나리 배포는 '카나리아' 라는 새의 이름을 따서 만들어졌다.

카나리아는 유독가스에 굉장히 민감해서 탄광에 함께 데리고 들어가던 새로 유명하다.

유독가스가 많이 누출되어 사람이 느끼게 되면 굉장히 위험한 상태가 되지만 카나리아는 그 보다 먼저 반응하여 죽기 때문에 위험을 사전에 인지한다는 의미로 사용되었다.

 

카나리 배포라고 이름이 붙은 이유도 위와 비슷하다.

실제 카나리 배포는 일부 버전만 신규로 올렸다가 성능이나 안정성에 이상이 없으면 새로운 버전을 점진적으로 더 많은 사용자에게 릴리즈하거나, 문제가 발생하면 빠르게 롤백한다.

 

Canary 배포 : 기존 버전을 유지한 채로 일부 버전만 신규 버전으로 올려서 신규 버전에 버그나 이상은 없는지 확인

 

 

파드를 배포(업데이트)하는 방법

    • 블루 그린 업데이트
    • 카나리 업데이트
    • 롤링 업데이트

 

1. 카나리 배포 (Canary Deployment):
목표: 새로운 소프트웨어 버전을 점진적으로 일부 사용자에게만 릴리즈하여 안정성 및 성능을 확인하고, 문제가 발생하면 빠르게 롤백하는 것이 주 목표입니다.
방식: 일부 사용자에게만 새로운 버전을 릴리즈하고 모니터링을 통해 성능 및 안정성을 검증한 후, 성공적이면 전체 사용자에게 배포합니다.

2. 블루-그린 배포 (Blue-Green Deployment):
목표: 새로운 소프트웨어 버전을 배포하면서 전체 트래픽을 새로운 환경(그린)으로 전환하여 중단 없이 업데이트를 수행하는 것이 주 목표입니다.
방식: 현재 운영 중인 환경(블루)과 새로운 환경(그린)을 병렬로 구성하고, 트래픽을 블루에서 그린으로 전환함으로써 배포를 완료합니다.

3. 롤링 업데이트 (Rolling Update):
목표: 새로운 소프트웨어 버전을 기존에 운영 중인 환경에서 일정 부분씩 차례로 업데이트하여 전체 시스템을 새로운 버전으로 업데이트하는 것이 목표입니다.
방식: 한 번에 일정 부분(일반적으로는 한 노드나 파드의 일부)을 업데이트하고, 이를 반복하여 전체 시스템을 업데이트합니다. 이 과정에서 중단 시간이 최소화됩니다.

차이점 요약:
카나리 배포: 점진적으로 일부 사용자에게 배포하고 모니터링 후, 성공 시 전체로 확대 배포.
블루-그린 배포: 기존 환경(블루)과 새로운 환경(그린)을 병렬로 구성하고 트래픽을 전환하여 배포를 완료.
롤링 업데이트: 일정 부분(노드 또는 파드의 부분)을 차례로 업데이트하며 중단 시간을 최소화.

 

 

동작과정
Blue Green Service
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-stable
spec:
  replicas: 2

  selector:
    matchLabels:
      app: mainui
      version: stable
      ...
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-stable
spec:
  replicas: 1

  selector:
    matchLabels:
      app: mainui
      version: canary
      ...
apiVersion: v1
kind: Service
metadata: 
  name: mainui-svc
spec:
  selector:
    app: mainui




 

  1. 위와 같은 기존 버전(블루)과 app: mainui 레이블로 묶는 서비스가 있을 때 신규 버전(그린)을 배포하면 서비스에 함께 묶이게 된다.
  2. 신규 버전을 점진적으로 replicas를 늘리고 기존 버전의 replicas를 조금씩 줄여가며 배포를 시도한다.
  3. 문제가 발생하지 않으면 그대로 신규 버전으로만 구성되도록 배포를 완료하고 문제가 발생하면 빠르게 원래 버전으로 롤백하여 영향을 최소화한다.

이 때 이상 현상을 빠르게 감지할 수 있어야 하고 발견했을 경우 빠르게 롤백할 수 있는 전략을 마련해야 한다.

 

 

 


실습

위 내용을 실습해보자.

 

mainui-stable.yaml

# mainui-stable.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-stable
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mainui
      version: stable
  template:
    metadata:
      labels:
        app: mainui
        version: stable
    spec:
      containers:
      - name: mainui
        image: nginx:1.24
        ports:
        - containerPort: 80
          protocol: TCP

 

 

mainui-svc.yaml

# mainui-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mainui-svc
spec:
  selector:
    app: mainui
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80

서비스 실행

 

 

서비스를 실행하면 mainui라는 레이블로 두 개의 파드가 묶여 있다.

위에 나온 ClusterIP인 10.104.12.86:8080 으로 접속하면 nginx의 HTML파일이 나올 것이다.

ClusterIP로 접속

 

 

이제 새로운 버전의 이미지가 배포되었다고 가정해보자.

다음 yaml코드는 단순히 nginx의 이미지 버전과 레이블만 바뀐 것이지만 실제 애플리케이션 업데이트라 생각하고 진행해보자.

# mainui-canary
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-stable
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mainui
      version: canary
  template:
    metadata:
      labels:
        app: mainui
        version: stable
    spec:
      containers:
      - name: mainui
        image: nginx:1.25
        ports:
        - containerPort: 80
          protocol: TCP

두 개의 디플로이먼트가 실행 중

 

 

실제 환경에서는 두 개의 디플로이먼트가 배포되었는데 문제없이 잘 실행된다면 성공이다.

 

 

물론 서비스의 엔드포인트도 잘 연결이 되어있다.

사용자들이 우리의 애플리케이션을 사용하는데 문제없이 잘 된다는 것을 인지했을 때 신규 버전의 수를 하나씩 증가시키고 기존 버전은 하나씩 감소시키며 계속 영향이 있는지 없는지 체크한다.

# 신규 버전 배포 수 확대
kubectl scale deployment mainui-canary --replicas=2

# 기존 버전 배포 수 축소
kubectl scale deployment mainui-stable --replicas=1

 

 

완벽하게 대체했음에도 시스템에 문제가 전혀 없다면 기존 배포 버전을 삭제하고 신규 버전으로 대체한다.


 

 

여기서 중요한 것은 카나리 배포를 하면서 사용했던 레이블이다.

이번 챕터는 레이블의 중요성을 알리기 위한 챕터로 레이블을 활용하면 파드 관리에 효과적이다.

레이블을 잊지 말고 잘 사용하여 원하는 시스템을 구축하고 관리, 운영하는데 도움이 되었으면 한다.

 


글이 좀 지저분하지만 읽어주셔서 감사합니다.

 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Secret  (0) 2023.12.23
Kubernetes 기초 - ConfigMap  (0) 2023.12.23
Kubernetes 기초 - Label(3)  (0) 2023.12.22
Kubernetes 기초 - Label(2)  (0) 2023.12.21
Kubernetes 기초 - Label(1)  (0) 2023.12.21