-
Notifications
You must be signed in to change notification settings - Fork 2
Spinnaker canary usage
์ฐธ๊ณ URL
https://ddii.dev/kubernetes/spinnaker-advanced-3/#
์์ ์ฐธ๊ณ URL ์ ์ญ์ฑ ๋ฐ๋ผํ๋ฉด์ ์นด๋๋ฆฌ ๋ํ๋ก์ด์ ๋ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ์ดํดํ๊ณ ,
ํ์ฌ ๋ฒ์ ์์ ์ ์์ ์ผ๋ก ๋์ํ๋์ง๋ฅผ ํ
์คํธ ํ์๋ค.
์ค์น ๋ฒ์ halyard 1.12.5 kubernetes 1.11
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
์์๊ฐ์ด ์
ํ
ํ ๋ฐฐํฌ์ ์ ์์ ์ผ๋ก spin-kayenta pod ๊ฐ ์๊ธฐ๋ ๊ฒ์ ํ์ธ ํ ์์์๋ค.
๋ํ Config ํญ๋ชฉ์ Canary ๊ฐ ์์ฑ๋์๋ค.

ํ์ฌ 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"
injector ๋ฅผ ๋๋ฆฌ์ง ์์ผ๋ฉด ํธ์ถ๋๋ ๊ฐ์ด ์๊ธฐ๋๋ฌธ์ successRate ๊ฐ์ 75 ์๋๋ก ์ค๋ Pass ๋ก ๊ฐ์ด ๋์๋ฒ๋ฆฐ๋ค.


์์ prometheus ํ๋ฉด์ ๋ณด๋ฉด ์์์๋ฏ์ด
์นด๋๋ฆฌ ์งํ์ค์ canary, baseline ์ pod ๋ฅผ ์์ฑํ์ฌ์
ํด๋น ์๋น์ค๋ฅผ ํธ์ถํ์์๋ ์ด ๋๊ฐ์ pod ๋ก ์ฐ๊ฒฐ์ ํ์ฌ score ๋ฅผ ์ธก์ ํ๊ณ ,
์นด๋๋ฆฌ๋ก ์ง์ ํด ๋์ ์๊ฐ์ด ์ง๋ฌ์๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ด์ด๋๊ณ , ํด๋น pod ๋ ์ญ์ ๋๋ค.

์ฐ์ ์นด๋๋ฆฌ ํ์ดํ ๋ผ์ธ์ ์คํํ๊ธฐ ์ ์ 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

์์ ์ด๋ฏธ์ง ์ฒ๋ผ ์นด๋๋ฆฌ๊ฐ ๋ถ์ ์๋ฃ๋ ํ์, ๋ ๋์ successRate (90) ๊ฐ์ ๋ฐ์์ ์๋กญ๊ฒ pod ๋ค์ด ๋ฐฐํฌ๊ฐ ๋์๋ค.
์ต์ด sampleapp ์ successRate : 70 ์ผ๋ก ์ฃผ๊ณ ๋ฐฐํฌํ์๊ณ ,
๋๋ฒ์งธ๋ก successRate : 60 ์ผ๋ก ์นด๋๋ฆฌ ํ์ดํ๋ผ์ธ์ ์คํํ๋ ๋ถ์์คํจํ๋ฉด์ ํ์ดํ๋ผ์ธ์ด ์ฃฝ์ด๋ฒ๋ ธ๋ค.
์ธ๋ฒ์งธ๋ก successRate : 90 ์ผ๋ก ์นด๋๋ฆฌ ํ์ดํ๋ผ์ธ์ ์คํํ๋ ๋ถ์์ฑ๊ณต๊ณผ ๋์์ successRate : 90์ผ๋ก
prod pod ๋ค์ด ๋ฐฐํฌ๊ฐ ๋์๋ค.
์ด ์ํ์์ successRate : 80 ์ ์ฃผ์ด์ ์นด๋๋ฆฌ ํ์ดํ๋ผ์ธ์ ์คํ์ํค๋ฉด ์ด๋ป๊ฒ ๋ ์ง ํ
์คํธ๋ฅผ ํด๋ณด์๋ค.
์ด๋ฐ์๊ฐ์ ํ๊ฒ ๋ ์ด์ ๋ Marginal(ํ๊ณ): 75 , Pass(ํต๊ณผ): 95 ๋ฅผ ์ฃผ์๋๋ฐ
์ด ๊ฐ์ด ์ํฅ์ ๋ฏธ์น๋์ง ํ์ธ ํ๋ ค๋ ์ด์ ์ด๋ค.

๊ฒฐ๊ณผ์ ์ผ๋ก๋ ์คํจํ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ดํ ๋ผ์ธ์ด ์ค๊ฐ์ ์ฃฝ์ด๋ฒ๋ฆฌ๋ฉด์ ์๋ก ์๊ธด pod ๋ค์ delete ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์คํ
์ด์ง๊ฐ ์คํจํด๋ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ ์ค์ ์ ํด์ค์ผ ํ๋ค.


์ด๋ฒ ์คํ์ ์ต์ด sampleapp ์ successRate : 40 ์ผ๋ก ์ฃผ๊ณ ๋ฐฐํฌํ ํ์
์นด๋๋ฆฌ ํ์ดํ๋ผ์ธ์ successRate : 60 ์ผ๋ก ์คํ์ ํด ๋ณด๋ ๊ฒ์ด๋ค.
์ญ์๋ Marginal(ํ๊ณ): 75 , Pass(ํต๊ณผ): 95 ๊ฐ์ด ์ํฅ์ ๋ฏธ์น๋์ง ํ ์คํธ๋ฅผ ํ๊ธฐ ์ํจ์ด๋ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ฑ๊ณต ํ์๋ค.
ํต๊ณผ๊ธฐ์ค์ ์ธก์ ์น๊ฐ 1๊ฐ์ผ๋๋ ๊ธฐ์กด๊ฐ๋ณด๋ค ๋์ผ๋ฉด ์ฑ๊ณต์ผ๋ก ์น๋ ๊ฒ์ ํ์ธ ํ ์ ์์๋ค.
์นด๋๋ฆฌ ๋ถ์์ ํต๊ณผ ๊ธฐ์ค์ canary config ์์ ์์ฑํ์๋ ๊ฐ์ ๋ฐ๋ฅธ๋ค.
์ด๋ฏธ์ง์์ ๋ณด๋ฏ์ด 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/