본문 바로가기
Kubernetes (k8s)

[k8s] Rollout Canary -- workbook

by moveho 2023. 5. 21.

[Canary 배포]

점진적으로 구버전에 대한 트래픽을 신버전으로 옮기는 것은 롤링 업데이트 방식과 비슷합니다. 하지만 차이점은 새로운 버전에 대한 오류를 조기에 감지하는 것입니다. 소수만 새로운 버전으로 옮겨둔 상태에서 서비스를 운영하고 새로운 버전에 이상이 없다고 판단되면 모든 트래픽을 신규 버전으로 옮기는 배포 방식입니다. 새로운 버전에 대한 위험성을 최소화 있지만, / 버전이 동시에 존재하므로 호환성 문제가 발생할 있습니다.

                           

이를 쿠버네티스 환경에서 실습 해보는 것이 워크북의 주요 내용입니다.

 

1.Canary 배포 실습환경 구성

[deployment.yaml 파일 생성]

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

httpd alpine 버전으로 작동하는 10개의 replicas 가진 deployment 생성합니다.

 

[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

 

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

 

kevin@k8s-master:~/rollout-canary$ kubectl get po -o wide

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

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

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

 

2. Canary 배포 - 새로운 이미지 배포

[기존 app Scale 조정 --REPLICAS 8]

최대 10개의 pod 기존()버전의 이미지는 8, 새로운 버전의 이미지를 2개로 8:2 비율로 Canary 배포를 시작해보겠습니다. 최대 가용 가능한 pod 개수를 10개로 가정을 합니다. 1차적으로 새로운 이미지 2개를 추가해주기 위해 기존의 deploy replicas 개수를 10개에서 8개로 낮춰줍니다.

 

[새로운 app 배포 -- REPLICAS 2]

kevin@k8s-master:~/rollout-canary$ kubectl create deploy wonderful-v2 --replicas 2 --image nginx:alpine --dry-run=client -o yaml > v2.yaml
kevin@k8s-master:~/rollout-canary$ vi v2.yamlAGE

 

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: wonderful
  name: wonderful-v2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: wonderful
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: wonderful
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        resources: {}
status: {}

 

새로운 앱을 생성하기 위해서 위와 같이 새로운 manifest 파일을 작성해줍니다. 그리고 기존에 서비스되고 있는 app service 동일하게 서비스 있도록 match label svc selector label 동일하게 맞춰줍니다.

 

apiVersion: v1
…
selector:
    app: wonderful

새로운 app 배포합니다.

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

 

[새로운 app 배포 확인]

pod/wonderful-v1-787cbd4cbb-55wpc     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-5shqg     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-crvlp     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-cs6br     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-fdpgp     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-gk4td     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-nl6z6     1/1     Running            0             31m
pod/wonderful-v1-787cbd4cbb-t9skq     1/1     Running            0             31m
pod/wonderful-v2-576df7fd78-6npvh     1/1     Running            0             2m4s
pod/wonderful-v2-576df7fd78-t4262     1/1     Running            0             2m4s

8:2 비율로 새로운 버전인 v2 pod 생성된 것을 확인할 있습니다.

 

3.Curl Test & Web 확인

[curl 테스트]

kevin@k8s-master:~/rollout-canary$ curl k8s-node1:30080

반복해서 curl 명령어를 실행시킵니다. 8:2 비율의 확률중 2 확률로 nginx 기본 홈페이지가 나오며 나머지 비율의 확률로 httpd 기반의 It works ! 출력하는 APP 만날 있습니다.

kevin@k8s-master:~/rollout-canary$ curl k8s-node1:30080

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

kevin@k8s-master:~/rollout-canary$ curl k8s-node1:30080

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

</html>

kevin@k8s-master:~/rollout-canary$ curl k8s-node1:30080

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

kevin@k8s-master:~/rollout-canary$ curl k8s-node1:30080

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

kevin@k8s-master:~/rollout-canary$ curl k8s-node1:30080

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

 

[web browser 테스트]

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

 

반복해서 curl 명령어를 실행시킵니다. 8:2 비율의 확률중 2 확률로 nginx 기본 홈페이지가 나오며 나머지 비율의 확률로 httpd 기반의 It works ! 출력하는 브라우져를 만날 있습니다.

댓글