본문 바로가기
Kubernetes (k8s)

[k8s] Rollout blue-green -- workbook

by moveho 2023. 5. 23.

[Blue-green 배포]

트래픽을 한번에 구버전에서 신버전으로 옮기는 방법입니다. Blue/Green 배포에서 현재 운영중인 서비스 환경을 Blue 라고 부르고, 새롭게 배포할 환경을 Green이라고 부릅니다. Blue Green 서버를 동시에 나란히 구성해둔 상태로 배포 시점에 로드밸런서가 트래픽을 Blue에서 Green으로 일제히 전환 시킵니다. 새로운 버전에 문제가 없다고 판단 됐을 시점에 Blue 구버전을 제거하거나 다음 배포를 위해 유지해 수도 있습니다. 이를 쿠버네티스 환경에서 실습 해보는 것이 워크북의 주요 내용입니다.

 

1.Blue-green 배포 실습환경 구성

[deployment.yaml 파일 생성]

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: wonderful
  name: wonderful-v1
spec:
  replicas: 4
  selector:
    matchLabels:
      app: wonderful
      version: v1
  template:
    metadata:
      labels:
        app: wonderful
        version: v1
    spec:
      containers:
      - image: httpd:alpine
        name: httpd

[service.yaml 파일 생성]

apiVersion: v1
kind: Service
metadata:
  labels:
    app: wonderful
  name: wonderful
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: wonderful
  type: NodePort

NodePort 적용해서 특정 30080 포트에서 테스트가 가능하도록 설정해줍니다.

[deploy, svc yaml 파일 실행]

kevin@k8s-master:~/blue-green$ kubectl apply -f woderful.yaml
deployment.apps/wonderful-v1 created
service/wonderful created

배포가 완료 되었는지 확인합니다.

 

kevin@k8s-master:~/blue-green$ kubectl get po -o wide

curl 명령어로도 확인해봅니다.

kevin@k8s-master:~/blue-green$ curl k8s-node1:30080
<html><body><h1>It works!</h1></body></html>
kevin@k8s-master:~/blue-green$ curl k8s-node2:30080
<html><body><h1>It works!</h1></body></html>

현재 4개의 pod 실행 입니다. 이로서, blue-green 배포를 실습해 있는 환경이 구성 완료 되었습니다.

 

2. Blue-green 배포 - 새로운 버전의 생성

[새로운 deployment -v2 생성]

새로 배포할 v2 deployment생성해 줍니다.

kevin@k8s-master:~/blue-green$ kubectl create deploy wonderful-v2 --image nginx:alpine --replicas 4 --dry-run=client -o yaml > 1.yaml
kevin@k8s-master:~/blue-green$ vi 1.yaml
kevin@k8s-master:~/blue-green$ kubectl apply -f 1.yaml 
deployment.apps/wonderful-v2 created

 

[새로운 app 배포 -- label 설정]

kevin@k8s-master:~/blue-green$ kubectl create deploy wonderful-v2 --replicas 2 --image nginx:alpine --dry-run=client -o yaml > v2.yaml
kevin@k8s-master:~/ blue-green $ vi v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: wonderful
    version: v2
  name: wonderful-v2
spec:
  replicas: 4
  selector:
    matchLabels:
      app: wonderful
      version: v2
  strategy: {}
  template:
    metadata:
labels:
        app: wonderful
        version: v2
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        resources: {}
status: {}

새로운 앱을 생성하기 위해서 위와 같이 새로운 manifest 파일을 작성해줍니다. 그리고 기존에 서비스되고 있는 app service 서비스를 준비할 있도록 match label svc selector label 동일하되 version: v2 라벨을 추가해줍니다.

apiVersion: v1
…
selector:
    app: wonderful
    version: v2

 

새로운 app 배포합니다.

kevin@k8s-master:~/blue-green$ kubectl apply -f v2.yaml
deployment.apps/wonderful-v2 created

 

[새로운 app 배포 확인]

kevin@k8s-master:~/blue-green$ kubectl get po

 

wonderful-v1-96b99cff9-77p4x      1/1     Running            0              11m

wonderful-v1-96b99cff9-799vd      1/1     Running            0              11m

wonderful-v1-96b99cff9-c4rxg      1/1     Running            0              11m

wonderful-v1-96b99cff9-fjmwg      1/1     Running            0              11m

wonderful-v2-58b5fbf596-2rnv7     1/1     Running            0              2m58s

wonderful-v2-58b5fbf596-kdm9c     1/1     Running            0              2m58s

wonderful-v2-58b5fbf596-snbtw     1/1     Running            0              2m58s

wonderful-v2-58b5fbf596-xn4fs     1/1     Running            0              2m58s

새로운 버전인 v2 pod 4개의 replica 생성된 것을 확인할 있습니다. 이로서 blue-green 배포 준비 단계를 완료하였습니다.

 

[curl 테스트]

kevin@k8s-master:~/blue-green$ kubectl get po

kevin@k8s-master:~/blue-green$ curl k8s-node1:30080

<html><body><h1>It works!</h1></body></html>

kevin@k8s-master:~/blue-green$ curl k8s-node1:30080

<html><body><h1>It works!</h1></body></html>

 

아직 서비스의 match label 변경되지 않았기 때문에 기존의 구버전의 It works 출력하는 앱이 서비스 되고 있습니다.

 

3.Service Selector 변경 (version: v2)

[Service label 변경]

kevin@k8s-master:~/blue-green$ kubectl edit svc wonderful
service/wonderful edited
apiVersion: v1
kind: Service
metadata:
  labels:
    app: wonderful
    version: v2
  name: wonderful
spec:
  ports:
  - nodePort: 30080
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: wonderful
    version: v2
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

위와 같이.metadata.labels. 하위에 version: v2 // .spec.selector 하위에 v2 변경합니다.

 

4.Blue-green 배포 확인 테스트

[curl 테스트]

kevin@k8s-master:~/blue-green$ curl k8s-node2:30080

nginx 기본 html파일이 출력됩니다.

 

[web browser 테스트]

주소창에 [Localhost주소]:30080 로 접속합니다.

sevice selector v2 변경하는 즉시 It works! 출력하는 페이지는 중단되고 새로운 nginx 페페이지 출력되는 것을 있습니다.

 

5.구버전 app Scale down

마지막으로 기존의 v1 deployment replica 0으로 조정해 줍니다.

kevin@k8s-master:~/blue-green$ kubectl scale deploy wonderful-v1 --replicas 0
deployment.apps/wonderful-v1 scaled
kevin@k8s-master:~/blue-green$ kubectl get deploy
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
wonderful-v1     0/0     0            0           25m
wonderful-v2     4/4     4            4           17m

 

이로서 트래픽을 한번에 구버전에서 신버전으로 옮기는 배포 방식인 Blue-green 배포 방식을 실습해 보았습니다. 기존 v1 앱은 It works! 출력하는 httpd 기반인 앱에서 nginx 기본 페이지를 출력하는 앱으로 한번에 변경해 보았습니다.

댓글