[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 기본 페이지를 출력하는 앱으로 한번에 변경해 보았습니다.
'Kubernetes (k8s)' 카테고리의 다른 글
[k8s] k8sgpt -- 쿠버네티스와 ChatGPT? (1) | 2023.06.01 |
---|---|
[k8s] Deploy a Django application on kubernetes & HPA test (0) | 2023.05.24 |
[k8s] Rollout Canary -- workbook (1) | 2023.05.21 |
[k8s] VPA (Vertical Pod Autoscaler) 설치 및 실습 (1) | 2023.05.16 |
[k8s] TLS Ingress 생성해서 https로 서비스 하기 (1) | 2023.05.03 |
댓글