Canary

Canary ๋ฆด๋ฆฌ์Šค๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ฒœ์ฒœํžˆ ๋…ธ์ถœ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ก ์˜ ๋ฐฐ๊ฒฝ์—๋Š” ์ฒ˜์Œ์— ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ง€์›ํ•จ์œผ๋กœ์จ, ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ 5%์˜ ์š”์ฒญ๋งŒ์ด ๋ฐœ๊ฒฌ๋˜์–ด ๋กค๋ฐฑ๋˜๊ธฐ ์ „์— ๋งค์šฐ ์ ์€ ๋น„์œจ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ Product catalog app ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋Œ์•„๊ฐ€์„œ proddetail-v2 ์„œ๋น„์Šค๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ, "XYZ.com"๊ณผ ๊ฐ™์€ ๋” ๋งŽ์€ ์ œํ’ˆ ์นดํƒˆ๋กœ๊ทธ ๊ณต๊ธ‰์—…์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

AWS App Mesh๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ proddetail-v2๋ฅผ canary ๋ฐฉ์‹์œผ๋กœ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

1. Canary ๋ฐฐํฌ

์ด์ œ Catalog Product Detail backend service์˜ ์ƒˆ ๋ฒ„์ „(๋ฒ„์ „ 2)์„ ๋ฐฐํฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Proddetail VirtualRouter๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ 90%๋ฅผ proddetail-v1 ์œผ๋กœ, 10%๋ฅผ proddetail-v2 ๋ฒ„์ „ 2๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ proddetail-v2์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋„๊ฐ€ ๋†’์•„์ง์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ %๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Catalog Detail V2 ์„œ๋น„์Šค๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
PROJECT_NAME=eks-app-mesh-demo
export APP_VERSION_2=2.0
for app in catalog_detail; do
  aws ecr describe-repositories --repository-name $PROJECT_NAME/$app >/dev/null 2>&1 || \
  aws ecr create-repository --repository-name $PROJECT_NAME/$app >/dev/null
  TARGET=$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$PROJECT_NAME/$app:$APP_VERSION_2
  cd apps/$app
  docker build -t $TARGET -f version2/Dockerfile .
  docker push $TARGET
done
cd ../../.

์•„๋ž˜์— ํ‘œ์‹œ๋œ canary.yaml ์„น์…˜์„ ๋ณด๋ฉด ์ƒˆ๋กœ์šด ์„œ๋น„์Šค proddetail-v2์— 10% ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด ์„œ๋น„์Šค proddetail-v1์— 90%์˜ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ proddetail-v2๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

envsubst < ./deployment/canary.yaml | kubectl apply -f -
kubectl get all -n prodcatalog-ns | grep 'proddetail2\|proddetail-v2'

2. Canary ํ…Œ์ŠคํŠธ

๋‹ค์‹œ browser ์ฐฝ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด, Catalog Detail proddetail-v1 Version 1 ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Canary Deployment ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํด๋ฆญํ•˜๋ฉด proddetail-V2 ๋กœ 10%, proddetail-V1 ์œผ๋กœ 90%์˜ ํŠธ๋ž˜ํ”ฝ์ด ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. proddetail-V2 ์— ๋Œ€ํ•ด์„œ XYZ.com ๋ฒค๋”๊ฐ€ ์ถ”๊ฐ€๋œ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VirtualRouter์˜ weigh๊ฐ’์„ ์กฐ์ ˆํ•˜์—ฌ V1๊ณผ V2๋กœ ๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ ์–‘์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‰ฝ๊ฒŒ V1์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณต๊ตฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated

Was this helpful?