[k8s] Argo Rollouts: Blue Green Deploy

์ด์ „ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223134344138

Argo Rollouts์„ ์‚ฌ์šฉํ•ด์„œ Blue-Green ๋ฐฐํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

์šฐ์„  ์„œ๋น„์Šค๊ฐ€ 2๊ฐœ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
ํ•˜๋‚˜๋Š” ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ์šฉ ์—”๋“œํฌ์ธํŠธ๊ณ , ํ•˜๋‚˜๋Š” ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ• ๋•Œ ํ…Œ์ŠคํŠธํ•  ์šฉ๋„์˜ ์—”๋“œํฌ์ธํŠธ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: prod-service
spec:
  selector:
    app: bg-server
  ports:
    - protocol: TCP
      port: 80
  type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  selector:
    app: bg-server
  ports:
    - protocol: TCP
      port: 80
  type: LoadBalancer

๋‘˜๋‹ค ์ผ๋‹จ ํ•˜๋‚˜์˜ ์•ฑ(bg-server)๋งŒ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ด๋†จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Rollout์„ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.
Rollout๋Š” Deployment์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ ์ปค์Šคํ…€ ์ปจํŠธ๋กค๋Ÿฌ๋‹ค.

apiVersion: argoproj.io/v1alpha1
kind: Rollout 
metadata:
  name: bg-server
spec:
  replicas: 3
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: bg-server
  template:
    metadata:
      labels:
        app: bg-server
    spec:
      containers:
      - name: bg-server
        image: myyrakle/node-server-for-test:1
        imagePullPolicy: Always
        ports:
        - containerPort: 80
  strategy:
    blueGreen: 
      activeService: prod-service
      previewService: test-service
      autoPromotionEnabled: false

blueGreen ํ•„๋“œ์— ๊ถ๊ธˆํ•ดํ• ๋งŒํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์˜ต์…˜์ด ๋“ค์–ด์žˆ๋‹ค.
๋ฐฉ๊ธˆ ์ •์˜ํ•œ 2๊ฐœ์˜ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  autoPromotionEnabled๋ฅผ false๋กœ ํ–ˆ๋‹ค.
autoPromotionEnabled๋Š” ์ƒˆ ๋ฒ„์ „์ด ๋ฌธ์ œ์—†์ด ๋–ด์„๋•Œ blue-green ์Šค์œ„์นญ์„ ์ž๋™์œผ๋กœ ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.

์ž๋™์œผ๋กœ ํ•˜๊ฒŒ ํ•ด๋„ ์ข‹์ง€๋งŒ, ์ผ๋‹จ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ ํ•˜๊ฒŒ ํ–ˆ๋‹ค.

์ด๋ฏธ์ง€ myyrakle/node-server-for-test:1๋Š” ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ๋ง์•„๋‘” ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„๋‹ค.
์ด์ œ ์ €๊ฑธ myyrakle/node-server-for-test:2๋กœ ์˜ฌ๋ฆฌ๋ฉด์„œ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

์ผ๋‹จ ์ € ์ดˆ๊ธฐ ๊ตฌ์„ฑ๋Œ€๋กœ ๋ฆฌ์†Œ์Šค๋“ค์„ ๊ฒŒ์‹œํ•œ๋‹ค.
๊ทธ๋Ÿผ Rollout์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ ˆํ”Œ๋ฆฌ์นด Pod๊ฐ€ 3๊ฐœ ๋œฐ ๊ฒƒ์ด๊ณ 

์„œ๋น„์Šค๋กœ ์‹คํ–‰๋„ ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.

๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์—์„œ๋Š” ๋‘˜๋‹ค ๊ฐ™์€ Pod ๊ทธ๋ฃน์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.


kubectl argo rollouts list rollout





Blue-Green ๋ฐฐํฌ ์‹คํ–‰

ArcoCD๋กœ gitops ๊ธฐ๋ฐ˜์„ ๊ตฌ์„ฑํ•ด๋’€๋‹ค๋ฉด, ๊ทธ๋ƒฅ ์ด๋ฏธ์ง€ ๋ฒ„์ „๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋™์„ ์‹œ์ž‘ํ•ด์„œ

์ถ”๊ฐ€ ํŒŒ๋“œ๋ฅผ ๋„์šฐ๊ณ 

test์šฉ ์„œ๋น„์Šค์— ์ƒˆ ๋ฐฐํฌ ๋ฒ„์ „์ด ๋ผ์šฐํŒ…๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  Pod ํ”„๋กœ๋น„์ €๋‹์ด ์™„๋ฃŒ๋˜๋ฉด ์ •์ง€ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

๊ทผ๋ฐ ์ด๊ฑด autoPromotionEnabled๋ฅผ ๊บผ๋†”์„œ ๊ทธ๋ ‡๊ณ , ์ผœ๋†จ๋‹ค๋ฉด ์ž๋™์œผ๋กœ ์Šค์œ„์นญ์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.
์ง€๊ธˆ์€ ์ €๊ฑธ ์ˆ˜๋™์œผ๋กœ ์Šค์œ„์นญํ•ด๋ณด๊ฒ ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด CLI๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€๊ฒฝ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค๋„ ์Šค์œ„์นญ์ด ๋  ๊ฒƒ์ด๊ณ 

๊ธฐ์กด ๋ฒ„์ „๋„ ๋‚ด๋ ค๊ฐ€๊ณ 

๋ฐฐํฌ๊ฐ€ ๋๋‚  ๊ฒƒ์ด๋‹ค.




๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

๊ทธ๋Ÿฐ๋ฐ ์ €๋Œ€๋กœ autoPromotionEnabled๋งŒ ์ผœ๊ธฐ์—๋Š” ๊ตฌ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ข€ ์žˆ๋‹ค.
๋”ฐ๋กœ ๋ญ˜ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— Pod๋“ค๋งŒ ๋‹ค ๋œจ๋ฉด ๋ฐ”๋กœ ๊ฐˆ์•„๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, Pod๊ฐ€ ๋œจ๋Š” ๊ฒƒ๊ณผ ๊ทธ ์•ˆ์—์„œ ์‹ค์ œ ์„œ๋ฒ„๊ฐ€ ๋‹ค ๋œจ๋Š”์ง€๋Š” ๋ณ„๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค...

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ autoPromotionSeconds์œผ๋กœ ์Šค์œ„์นญ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋Œ€๊ธฐ์‹œ๊ฐ„์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
์ง€๊ธˆ ๋‚ด ์„œ๋ฒ„๊ฐ€ ๋œจ๋Š” ์‹œ๊ฐ„์ด ์–ด์ง€๊ฐ„ํ•ด์„œ๋Š” 10์ดˆ ์•ˆ์— ๋‹ค ๋๋‚  ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ 10์ดˆ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.




Health Check

ํ•˜์ง€๋งŒ ์ €๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์ƒˆ๋กœ ๋œฌ ๋ฒ„์ „์ด ํ•ญ์ƒ ์™„๋ฒฝํ•˜๊ฒŒ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์žˆ๋Š”๊ฐ€? ๊ฐ‘์ž๊ธฐ ์„ธํŒ…์ด ๊ผฌ์—ฌ์„œ 500์ด ๋œฐ ์ˆ˜๋„ ์žˆ์ง€ ์•Š์€๊ฐ€?

์ด ๋•Œ๋ฌธ์—, ๋ณดํ†ต ์Šค์œ„์นญ์„ ํ•˜๊ธฐ ์ „์— ์ƒˆ ๋ฒ„์ „์— ๋Œ€ํ•œ Health Check๋กœ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค๋‚˜ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € AnalysisTemplate์œผ๋กœ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ •์˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
๋ณดํ†ต์€ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์™€ ์—ฐ๊ณ„ํ•ด์„œ ์ƒํƒœํ™•์ธ์„ ํ•˜๋Š” ํŽธ์ด๋‹ค.

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  args:
  - name: service-name
  metrics:
  - name: success-rate
    interval: 5m
    # NOTE: prometheus queries return results in the form of a vector.
    # So it is common to access the index 0 of the returned array to obtain the value
    successCondition: result[0] >= 0.95
    failureLimit: 3
    provider:
      prometheus:
        address: http://prometheus.example.com:9090
        query: |
          sum(irate(
            istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m]
          )) /
          sum(irate(
            istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m]
          ))

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑธ ๊ฐ€์ ธ๋‹ค๊ฐ€ prePromotionAnalysis์— ๋“ฑ๋กํ•ด์ฃผ๋ฉด ๋์ด๋‹ค.




์ฐธ์กฐ
https://argoproj.github.io/argo-rollouts/features/bluegreen/
https://argo-rollouts.readthedocs.io/en/stable/features/analysis/