Skip to content

Spinnaker canary usage

kimhyungkook edited this page Mar 14, 2019 · 12 revisions

์ฐธ๊ณ  URL
https://ddii.dev/kubernetes/spinnaker-advanced-3/#

์œ„์˜ ์ฐธ๊ณ  URL ์„ ์ญˆ์šฑ ๋”ฐ๋ผํ•˜๋ฉด์„œ ์นด๋‚˜๋ฆฌ ๋””ํ”Œ๋กœ์ด์— ๋Œ€ํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ ,
ํ˜„์žฌ ๋ฒ„์ „์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜์˜€๋‹ค.

์„ค์น˜ ๋ฒ„์ „ halyard 1.12.5 kubernetes 1.11

# Canary ์…‹ํŒ…

prometheus ๋Š” istio ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๊ฐ™์ด ์„ค์น˜๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.
S3 ๋Š” minio ๋ฅผ ์…‹ํŒ…ํ•˜์˜€๋‹ค.

> hal config canary enable

> hal config canary prometheus enable
> hal config canary prometheus account add my-prometheus --base-url http://a83f0e6aa3ee611e9a56802910c21b39-1872812420.ap-> northeast-2.elb.amazonaws.com:9090

> hal config canary aws enable
> MINIO_ACCESS_KEY=AKIAJxxx
> MINIO_SECRET_KEY=QfvochKlxxxxx
> echo $MINIO_SECRET_KEY | \
hal config canary aws account add my-s3 --bucket spin-bucket --endpoint \
    http://minio:9000 --access-key-id $MINIO_ACCESS_KEY \
    --secret-access-key
> hal config canary aws edit --s3-enabled=true

> hal config canary edit --default-metrics-store prometheus
> hal config canary edit --default-metrics-account my-prometheus
> hal config canary edit --default-storage-account my-s3

# ์ตœ์ข… ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜
> hal deploy apply

# Canary ์„ค์น˜ ํ™•์ธ

์œ„์™€๊ฐ™์ด ์…‹ํŒ… ํ›„ ๋ฐฐํฌ์‹œ ์ •์ƒ์ ์œผ๋กœ spin-kayenta pod ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜์žˆ์—ˆ๋‹ค.
๋˜ํ•œ Config ํ•ญ๋ชฉ์— Canary ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-11 แ„‹แ…ฉแ„’แ…ฎ 5 51 23

# ์ž‘์—…์‹œ ์—๋Ÿฌ์‚ฌํ•ญ

ํ˜„์žฌ default namespace ์— istio ๊ฐ€ auto injection ์ด ๋˜์–ด์žˆ์–ด์„œ,
์œ„ ํ™”๋ฉด์—์„œ ์„ค๋ช…ํ•œ injector ์—์„œ curl ๋ช…๋ น์–ด๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™์„ ์•ˆ ํ•œ๋‹ค.
istio ๋กœ pod ๊ฐ€ ๋ฐฐํฌ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‘๊ฐœ์ด์ƒ์ด ๋˜๊ธฐ๋•Œ๋ฌธ์—,
์ปจํ…Œ์ด๋„ˆ ๋ช…์„ ์ง€์ •ํ•ด์„œ curl ์„ ๋‚ ๋ ค์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

kubectl -n default run injector --image=alpine -- \
    /bin/sh -c "apk add --no-cache --yes curl; \
    while true; do curl -sS --max-time 3 \
    http://sampleapp:8080/; done"

๊ทธ๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ค์น˜ํ•˜์˜€์Œ.

kubectl -n spinnaker run injector --image=alpine -- \
    /bin/sh -c "apk add --no-cache --yes curl; \
    while true; do curl -sS --max-time 3 \
    http://sampleapp.default.svc.cluster.local:8080/; done"

# test ์‹œ ์ฃผ์˜์‚ฌํ•ญ 1

injector ๋ฅผ ๋Œ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ํ˜ธ์ถœ๋˜๋Š” ๊ฐ’์ด ์—†๊ธฐ๋•Œ๋ฌธ์— successRate ๊ฐ’์„ 75 ์•„๋ž˜๋กœ ์ค˜๋„ Pass ๋กœ ๊ฐ’์ด ๋‚˜์™€๋ฒ„๋ฆฐ๋‹ค.

# ์ •์ƒ์ž‘๋™ ํ™”๋ฉด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-12 แ„‹แ…ฉแ„’แ…ฎ 1 49 00 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-12 แ„‹แ…ฉแ„’แ…ฎ 2 14 45

์œ„์˜ prometheus ํ™”๋ฉด์„ ๋ณด๋ฉด ์•Œ์ˆ˜์žˆ๋“ฏ์ด
์นด๋‚˜๋ฆฌ ์ง„ํ–‰์ค‘์— canary, baseline ์˜ pod ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ์„œ
ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์˜€์„๋•Œ ์ด ๋‘๊ฐœ์˜ pod ๋กœ ์—ฐ๊ฒฐ์„ ํ•˜์—ฌ score ๋ฅผ ์ธก์ •ํ•˜๊ณ ,
์นด๋‚˜๋ฆฌ๋กœ ์ง€์ •ํ•ด ๋†“์€ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์„๋•Œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‚ด์–ด๋†“๊ณ , ํ•ด๋‹น pod ๋Š” ์‚ญ์ œ ๋œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-12 แ„‹แ…ฉแ„’แ…ฎ 1 49 47

# ์นด๋‚˜๋ฆฌ ์ž‘๋™ ์›๋ฆฌ

์šฐ์„  ์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— base deploy ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„ ๋ผ์ธ์„ ๋ถ„์„ํ•ด๋ณด๋ฉด
Deploy Baseline ์€ ๊ธฐ์กด์— ๋Œ์•„๊ฐ€๊ณ ์žˆ๋Š” (version=prod) ์˜ successRate ๊ฐ’์„
env ์—์„œ ๊ฐ€์ ธ์™€์„œ ํ•˜๋‚˜์˜ pod ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
Deploy Canary ๋Š” ์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„ ๋ผ์ธ ์‹œ์ž‘์‹œ ์ž…๋ ฅ๋ฐ›์€ successRate ๊ฐ’์„ ๋ฐ›์•„์„œ pod ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๊ธฐ์กด์— 4๊ฐœ์˜ sampleapp pod ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜์—ˆ๋‹ค๋ฉด, ์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋ฉด์„œ ์ด 6๊ฐœ์˜ pod ์—
์‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜๋ˆ„์–ด์ ธ์„œ ํ˜ธ์ถœ๋œ๋‹ค.

ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ง€๋Š” y ์ถ•์€ ์—๋Ÿฌ์œจ์ธ๋ฐ..(responce_500 / (responce_500+responce_200) * 100)

์นด๋‚˜๋ฆฌ ๋ถ„์„์˜ ํ†ต๊ณผ๊ธฐ์ค€์€
Spinnaker์—์„œ ์ž๋™ํ™”๋œ ์นด๋‚˜๋ฆฌ์•„ ๋ถ„์„์€ ์—ฌ๋Ÿฌ ์ธก์ •ํ•ญ๋ชฉ์—์„œ ํ†ต๊ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ์ˆ˜ ๋ฒ”์œ„๋Š” 0~100 ์‚ฌ์ด์ด๋ฉฐ, ๊ธฐ์ค€๊ณผ ์นด๋‚˜๋ฆฌ์•„ ์‚ฌ์ด์˜ ๋น„๊ต๋ฅผ ํ†ต๊ณผ ๋˜๋Š” ์‹คํŒจํ•œ ์ธก์ •ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ ๊ทธ๋ฃน์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์— ์ธก์ •ํ•ญ๋ชฉ์„ ๋ฐฐ์น˜ํ•˜๋ฉด ์ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ์ ์ˆ˜์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ์™€ ๊ฐ™์ด ๋‹จ์ผ ์ธก์ •ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ ์ˆ˜๋Š” 0(์‹คํŒจ) ๋˜๋Š” 100(ํ†ต๊ณผ)๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : https://cloud.google.com/solutions/automated-canary-analysis-kubernetes-engine-spinnaker

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-14 แ„‹แ…ฉแ„’แ…ฎ 1 37 47

์œ„์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋Ÿผ ์นด๋‚˜๋ฆฌ๊ฐ€ ๋ถ„์„ ์™„๋ฃŒ๋œ ํ›„์—, ๋” ๋†’์€ successRate (90) ๊ฐ’์„ ๋ฐ›์•„์„œ ์ƒˆ๋กญ๊ฒŒ pod ๋“ค์ด ๋ฐฐํฌ๊ฐ€ ๋˜์—ˆ๋‹ค.

# ์นด๋‚˜๋ฆฌ ์‹คํ—˜ 1

์ตœ์ดˆ sampleapp ์„ successRate : 70 ์œผ๋กœ ์ฃผ๊ณ  ๋ฐฐํฌํ•˜์˜€๊ณ ,
๋‘๋ฒˆ์งธ๋กœ successRate : 60 ์œผ๋กœ ์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋‹ˆ ๋ถ„์„์‹คํŒจํ•˜๋ฉด์„œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ฃฝ์–ด๋ฒ„๋ ธ๋‹ค.
์„ธ๋ฒˆ์งธ๋กœ successRate : 90 ์œผ๋กœ ์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋‹ˆ ๋ถ„์„์„ฑ๊ณต๊ณผ ๋™์‹œ์— successRate : 90์œผ๋กœ
prod pod ๋“ค์ด ๋ฐฐํฌ๊ฐ€ ๋˜์—ˆ๋‹ค.
์ด ์ƒํƒœ์—์„œ successRate : 80 ์„ ์ฃผ์–ด์„œ ์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜๋‹ค.

์ด๋Ÿฐ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š” Marginal(ํ•œ๊ณ„): 75 , Pass(ํ†ต๊ณผ): 95 ๋ฅผ ์ฃผ์—ˆ๋Š”๋ฐ
์ด ๊ฐ’์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์ธ ํ•˜๋ ค๋Š” ์ด์œ ์ด๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-14 แ„‹แ…ฉแ„’แ…ฎ 1 49 19

๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์‹คํŒจํ•˜์˜€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํŒŒ์ดํ”„ ๋ผ์ธ์ด ์ค‘๊ฐ„์— ์ฃฝ์–ด๋ฒ„๋ฆฌ๋ฉด์„œ ์ƒˆ๋กœ ์ƒ๊ธด pod ๋“ค์„ delete ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šคํ…Œ์ด์ง€๊ฐ€ ์‹คํŒจํ•ด๋„ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-14 แ„‹แ…ฉแ„’แ…ฎ 2 05 09 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-14 แ„‹แ…ฉแ„’แ…ฎ 2 05 49

# ์นด๋‚˜๋ฆฌ ์‹คํ—˜ 2

์ด๋ฒˆ ์‹คํ—˜์€ ์ตœ์ดˆ sampleapp ์„ successRate : 40 ์œผ๋กœ ์ฃผ๊ณ  ๋ฐฐํฌํ•œ ํ›„์—
์นด๋‚˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ successRate : 60 ์œผ๋กœ ์‹คํ–‰์„ ํ•ด ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

์—ญ์‹œ๋‚˜ Marginal(ํ•œ๊ณ„): 75 , Pass(ํ†ต๊ณผ): 95 ๊ฐ’์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-14 แ„‹แ…ฉแ„’แ…ฎ 2 35 24

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์„ฑ๊ณต ํ•˜์˜€๋‹ค.
ํ†ต๊ณผ๊ธฐ์ค€์€ ์ธก์ •์น˜๊ฐ€ 1๊ฐœ์ผ๋•Œ๋Š” ๊ธฐ์กด๊ฐ’๋ณด๋‹ค ๋†’์œผ๋ฉด ์„ฑ๊ณต์œผ๋กœ ์น˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

# ๊ฒฐ๋ก 

์นด๋‚˜๋ฆฌ ๋ถ„์„์˜ ํ†ต๊ณผ ๊ธฐ์ค€์€ canary config ์—์„œ ์ž‘์„ฑํ•˜์˜€๋˜ ๊ฐ’์„ ๋”ฐ๋ฅธ๋‹ค.
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-03-14 แ„‹แ…ฉแ„’แ…ฎ 2 44 44

์ด๋ฏธ์ง€์—์„œ ๋ณด๋“ฏ์ด rate_requests ๋กœ ๋‚˜์˜ค๋Š” ๊ฐ’์ด increase ํ•˜์˜€์„๋•Œ ์‹คํŒจ๋กœ ์นœ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์—์„œ rate_requests{app="sampleapp"} ๊ฐ’์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜์˜€๋“ฏ์ด
y ์ถ•์ด ์—๋Ÿฌ์œจ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ์œจ์ด ์ฆ๊ฐ€ํ•˜๋ฉด ๋ถ„์„์ด ์‹คํŒจ๋กœ ๋–จ์–ด์ง„๋‹ค.

์Šคํ”ผ๋‹ˆ์ปค site ์—์„œ Marginal๊ณผ Pass ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
Marginal(ํ•œ๊ณ„) : If a canary run has a score below than this threshold, then the whole canary fails. Pass(ํ†ต๊ณผ): The last canary run of the analysis must score higher than this threshold for the whole analysis to be considered successful. Otherwise it fails.

๊ฒฐ๊ณผ์ ์œผ๋กœ 1๊ฐœ์˜ ์ธก์ •ํ•ญ๋ชฉ์€ 0์  or 100์ ์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋‘๊ฐœ์˜ ์„ค์ •๊ฐ’์ด ํฌ๊ฒŒ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค.

์ฐธ๊ณ  : https://www.spinnaker.io/guides/user/canary/best-practices/

Clone this wiki locally