๋ฉ๋ชจ. ๋ฒ์ญ:
๋ํ ์ด ๊ธฐ์ฌ์์๋ ์ ์ฅ์์ ๊ตฌ์ฑ(Kubernetes ๋ฐ Istio์ ๋ํ ๋งค๋ํ์คํธ)์ ์ฌ์ฉํ๋ค๋ ์ ์ ์๊ธฐ์์ผ ๋๋ฆฝ๋๋ค.
๊ตํต ๊ด๋ฆฌ
Istio๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์ ์ ๊ณตํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ํด๋ฌ์คํฐ์ ๋ํ๋ฉ๋๋ค.
- ๋์ ์์ฒญ ๋ผ์ฐํ : ์นด๋๋ฆฌ์ ์ถ์, A/B ํ ์คํธ
- ๋ก๋ ๋ฐธ๋ฐ์ฑ: ํด์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋จ์ํ๊ณ ์ผ๊ด์ ์ ๋๋ค.
- ๋์ ํ ํ๋ณต: ์๊ฐ ์ด๊ณผ, ์ฌ์๋, ํ๋ก ์ฐจ๋จ๊ธฐ;
- ๊ฒฐํจ ์ฝ์ : ์ง์ฐ, ์์ฒญ ์ค๋จ ๋ฑ
๊ธฐ์ฌ๊ฐ ๊ณ์๋๋ฉด์ ์ ํํ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ก ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ค๋ช
ํ๊ณ ๊ทธ ๊ณผ์ ์์ ์๋ก์ด ๊ฐ๋
์ ์๊ฐํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌํ ์ฒซ ๋ฒ์งธ ๊ฐ๋
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. DestinationRules
(์ฆ, ํธ๋ํฝ/์์ฒญ ์์ ์์ ๋ํ ๊ท์น - ๋๋ต์ ์ธ ๋ฒ์ญ), ์ด๋ฅผ ํตํด A/B ํ
์คํธ๋ฅผ ํ์ฑํํฉ๋๋ค.
A/B ํ ์คํธ: ์ค์ ๋ก DestinationRules
A/B ํ ์คํธ๋ ๋ ๊ฐ์ง ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ (๋ณดํต ์๊ฐ์ ์ผ๋ก ๋ค๋ฆ)์ด ์๊ณ ์ด๋ค ๋ฒ์ ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ์ง 100% ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ ๋ฒ์ ์ ๋์์ ์คํํ๊ณ ์งํ๋ฅผ ์์งํฉ๋๋ค.
A/B ํ ์คํธ ์์ฐ์ ํ์ํ ๋ ๋ฒ์งธ ๋ฒ์ ์ ํ๋ฐํธ์๋๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์.
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created
"๊ทธ๋ฆฐ ๋ฒ์ "์ ๋ฐฐํฌ ๋งค๋ํ์คํธ๋ ๋ ๊ฐ์ง ์์น์์ ๋ค๋ฆ ๋๋ค.
- ์ด๋ฏธ์ง๋ ๋ค๋ฅธ ํ๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
istio-green
, - ํฌ๋์๋ ๋ผ๋ฒจ์ด ์์ต๋๋ค.
version: green
.
๋ ๋ฐฐํฌ ๋ชจ๋ ๋ผ๋ฒจ์ด ์์ผ๋ฏ๋ก app: sa-frontend
,๊ฐ์ ์๋น์ค๋ก ๋ผ์ฐํ
๋ ์์ฒญ sa-external-services
์๋น์ค๋ฅผ ์ํด sa-frontend
, ๋ชจ๋ ์ธ์คํด์ค๋ก ๋ฆฌ๋๋ ์
๋๊ณ ๋ก๋๋ ๋ค์์ ํตํด ๋ถ์ฐ๋ฉ๋๋ค.
์์ฒญํ ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค
์ด๋ฌํ ํ์ผ์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฒ์ ์ ๋ฐ๋ผ ์ด๋ฆ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํ์ธํด ๋ด ์๋ค:
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.c7071b22.css
/static/js/main.059f8e9c.js
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.f87cd8c9.css
/static/js/main.f7659dbb.js
์ฆ, index.html
ํ ๋ฒ์ ์ ์ ์ ํ์ผ์ ์์ฒญํ๋ ๋ ๋ก๋ ๋ฐธ๋ฐ์์ ์ํด ๋ค๋ฅธ ๋ฒ์ ์ด ์๋ ํฌ๋๋ก ์ ์ก๋ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ถ๋ช
ํ ์ด์ ๋ก ๊ทธ๋ฌํ ํ์ผ์ด ์กด์ฌํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ํ ์ฌํญ์ ์ค์ ํด์ผ ํฉ๋๋ค.index.html์ ์ ๊ณตํ ๋์ผํ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ ์์ฒญ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.".
์ผ๊ด๋ ํด์ ๊ธฐ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํตํด ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ฒ ์ต๋๋ค. (์ผ๊ด์ ์ธ ํด์ ๋ก๋ ๋ฐธ๋ฐ์ฑ). ์ด ๊ฒฝ์ฐ ๋์ผํ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋์ผํ ๋ฐฑ์๋ ์ธ์คํด์ค๋ก ์ ์ก๋ฉ๋๋ค., ์ฌ์ ์ ์๋ ์์ฑ(์: HTTP ํค๋)์ด ์ฌ์ฉ๋ฉ๋๋ค.โDestinationRules๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์์ต๋๋ค.
๋ชฉ์ ์ง๊ท์น
ํ ๊ฐ์์๋น์ค ์ํ๋ ์๋น์ค์ ์์ฒญ์ ๋ณด๋์ต๋๋ค. DestinationRules๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์๋น์ค์ ์ธ์คํด์ค๋ก ํฅํ๋ ํธ๋ํฝ์ ์ ์ฉ๋ ์ ์ฑ ์ ์ ์ํ ์ ์์ต๋๋ค.
Istio ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ํธ๋ํฝ ๊ด๋ฆฌ
์ฃผ์: ์ฌ๊ธฐ์์๋ ๋คํธ์ํฌ ํธ๋ํฝ์ ๋ํ Istio ๋ฆฌ์์ค์ ์ํฅ์ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ์ ์ํฉ๋๋ค. ์ ํํ๊ฒ ๋งํ๋ฉด ์์ฒญ์ ๋ณด๋ผ ์ธ์คํด์ค์ ๋ํ ๊ฒฐ์ ์ CRD์ ๊ตฌ์ฑ๋ Ingress ๊ฒ์ดํธ์จ์ด์ Envoy์ ์ํด ์ด๋ฃจ์ด์ง๋๋ค.
๋์ ๊ท์น์ ์ฌ์ฉํ๋ฉด ์ผ๊ด๋ ํด์๋ฅผ ์ฌ์ฉํ๊ณ ๋์ผํ ์๋น์ค ์ธ์คํด์ค๊ฐ ๋์ผํ ์ฌ์ฉ์์๊ฒ ์๋ตํ๋๋ก ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋ค์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค(
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-frontend
spec:
host: sa-frontend
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: version # 1
1 - HTTP ํค๋์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํด์๊ฐ ์์ฑ๋ฉ๋๋ค. version
.
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ์ ์ฉํฉ๋๋ค.
$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created
์ด์ ์๋ ๋ช
๋ น์ ์คํํ๊ณ ํค๋๋ฅผ ์ง์ ํ ๋ ์ฌ๋ฐ๋ฅธ ํ์ผ์ ์ป์๋์ง ํ์ธํ์ญ์์ค. version
:
$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
์ฃผ์: ํค๋์ ๋ค๋ฅธ ๊ฐ์ ์ถ๊ฐํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ํ
์คํธํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก DestinationRules๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์์ญ์์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ์กฐํ์ธ์.
VirtualService๋ฅผ ๋ ์์ธํ ์ฐ๊ตฌํ๊ธฐ ์ ์ ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ "๊ทธ๋ฆฐ ๋ฒ์ "๊ณผ ํด๋น ํธ๋ํฝ ๋ฐฉํฅ ๊ท์น์ ์ญ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
$ kubectl delete -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions โsa-frontend-greenโ deleted
$ kubectl delete -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io โsa-frontendโ deleted
๋ฏธ๋ฌ๋ง: ์ค์ ๊ฐ์ ์๋น์ค
๊ทธ๋ฆผ์ (โ์ฐจํโ) ๋๋ ๋ฏธ๋ฌ๋ง (โ๋ฏธ๋ฌ๋งโ) ์ต์ข ์ฌ์ฉ์์๊ฒ ์ํฅ์ ์ฃผ์ง ์๊ณ ํ๋ก๋์ ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด ์ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ ๋ ๋ฒ์งธ ์ธ์คํด์ค์ ์์ฒญ์ ๋ณต์ (โ๋ฏธ๋ฌ๋งโ)ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ด ๋๋ค. ๊ฐ๋จํ ๋งํด์, ์ด๋ ๋๋ฃ๊ฐ ๊ฐ์ฅ ์ค์ํ ๋ฌธ์ ๋ฅผ ์ ํํ๊ณ ๋๊ตฌ๋ ์ค์ ๋ก ๊ฒํ ํ ์ ์์ ์ ๋๋ก ๊ฑฐ๋ํ ๋จผ์ง ๋ฉ์ด๋ฆฌ ํํ๋ก ๋์ด์ค๊ธฐ ์์ฒญ์ ํ๋ ๋์ ๋๋ค.
์ด ์๋๋ฆฌ์ค๋ฅผ ์ค์ ๋ก ํ
์คํธํ๊ธฐ ์ํด ๋ฒ๊ทธ๊ฐ ์๋ SA-Logic์ ๋ ๋ฒ์งธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค(buggy
) ๋ค์ ๋ช
๋ น์ ์คํํ์ฌ:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created
์ด์ ๋ช
๋ น์ ์คํํ์ฌ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋ค์๊ณผ ๊ฐ์์ง ํ์ธํ๊ฒ ์ต๋๋ค. app=sa-logic
๋ํ ํด๋น ๋ฒ์ ์ ๋ผ๋ฒจ์ด ์์ต๋๋ค.
$ kubectl get pods -l app=sa-logic --show-labels
NAME READY LABELS
sa-logic-568498cb4d-2sjwj 2/2 app=sa-logic,version=v1
sa-logic-568498cb4d-p4f8c 2/2 app=sa-logic,version=v1
sa-logic-buggy-76dff55847-2fl66 2/2 app=sa-logic,version=v2
sa-logic-buggy-76dff55847-kx8zz 2/2 app=sa-logic,version=v2
์๋น์ค sa-logic
๋ผ๋ฒจ์ด ์๋ ํฌ๋๋ฅผ ๋์์ผ๋ก ํจ app=sa-logic
, ๋ฐ๋ผ์ ๋ชจ๋ ์์ฒญ์ ๋ชจ๋ ์ธ์คํด์ค์ ๋ถ์ฐ๋ฉ๋๋ค.
...ํ์ง๋ง ์ฐ๋ฆฌ๋ ์์ฒญ์ด v1 ์ธ์คํด์ค๋ก ์ ์ก๋๊ณ v2 ์ธ์คํด์ค๋ก ๋ฏธ๋ฌ๋ง๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ VirtualService๋ฅผ DestinationRule๊ณผ ๊ฒฐํฉํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ ๊ท์น์ VirtualService์ ํ์ ์งํฉ๊ณผ ํน์ ํ์ ์งํฉ์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
๋์ ๊ท์น์์ ํ์ ์งํฉ ์ ์
ํ์ ์งํฉ (ํ์ ์งํฉ) ๋ค์ ๊ตฌ์ฑ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค(
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-logic
spec:
host: sa-logic # 1
subsets:
- name: v1 # 2
labels:
version: v1 # 3
- name: v2
labels:
version: v2
- ์ฃผ์ธ (
host
) ์ด ๊ท์น์ ๊ฒฝ๋ก๊ฐ ์๋น์ค๋ฅผ ํฅํ๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉ๋๋๋ก ์ ์ํฉ๋๋ค.sa-logic
; - ์ ๋ชฉ(
name
) ํ์ ์งํฉ์ ํ์ ์งํฉ ์ธ์คํด์ค๋ก ๋ผ์ฐํ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. - ๋ผ๋ฒจ(
label
)๋ ์ธ์คํด์ค๊ฐ ํ์ ์งํฉ์ ์ผ๋ถ๊ฐ ๋๊ธฐ ์ํด ์ผ์นํด์ผ ํ๋ ํค-๊ฐ ์์ ์ ์ํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ์ ์ฉํฉ๋๋ค.
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created
์ด์ ํ์ ์งํฉ์ด ์ ์๋์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด sa-logic์ ๋ํ ์์ฒญ์ ๊ท์น์ ์ ์ฉํ๋๋ก VirtualService๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ํ์ ์งํฉ์ผ๋ก ๋ผ์ฐํ
๋จ
v1
, - ํ์ ์งํฉ์ผ๋ก ๋ฏธ๋ฌ๋ง๋จ
v2
.
๋ค์ ์ ์ธ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๊ณํ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค(
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
mirror:
host: sa-logic
subset: v2
์ฌ๊ธฐ์๋ ์ค๋ช ์ด ํ์ํ์ง ์์ผ๋ฏ๋ก ์ค์ ๋ก ์๋ํ๋ ๋ชจ์ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic created
๋ค์ ๋ช ๋ น์ ํธ์ถํ์ฌ ๋ก๋๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
Grafana์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ฒ๊ทธ๊ฐ ์๋ ๋ฒ์ (buggy
)์ ์์ฒญ์ ~60%์ ๋ํด ์คํจ๋ฅผ ์ด๋ํ์ง๋ง ์คํ ์ค์ธ ์๋น์ค์์ ์๋ตํ ๋ ์ด๋ฌํ ์คํจ ์ค ์ด๋ ๊ฒ๋ ์ต์ข
์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
๋ค์ํ ๋ฒ์ ์ sa-logic ์๋น์ค์ ๋ํ ์ฑ๊ณต์ ์ธ ์๋ต
์ฌ๊ธฐ์๋ ๋จผ์ VirtualService๊ฐ ์๋น์ค์ Envoy์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ์ดํด๋ณด์์ต๋๋ค. sa-web-app
์์ฒญ์ ํ๋ค sa-logic
, VirtualService๋ฅผ ํตํด ์์ฒญ์ v1 ํ์ ์งํฉ์ผ๋ก ๋ผ์ฐํ
ํ๊ณ ์์ฒญ์ ์๋น์ค์ v2 ํ์ ์งํฉ์ผ๋ก ๋ฏธ๋ฌ๋งํ๋๋ก ๊ตฌ์ฑ๋ ์ฌ์ด๋์นด Envoy๋ฅผ ํต๊ณผํฉ๋๋ค. sa-logic
.
์ฌ๋ฌ๋ถ์ ์ด๋ฏธ ๊ฐ์ ์๋น์ค๊ฐ ๋จ์ํ๋ค๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค. ๋ค์ ์น์ ์์๋ ์ด ์ ํ์ด ์ ๋ง ํ๋ฅญํ๋ค๋ ์ ์ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์นด๋๋ฆฌ์ ์ถ์
Canary ๋ฐฐํฌ๋ ์์์ ์ฌ์ฉ์์๊ฒ ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ถ์ํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ๋ฆด๋ฆฌ์ค์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๊ณ ๊ทธ ํ์์ผ ์ด๋ฏธ ํด๋น (๋ฆด๋ฆฌ์ค์) ํ์ง์ ํ์ ์ ๊ฐ๊ณ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.ะพ๋ ๋ง์ ์ฒญ์ค.
์นด๋๋ฆฌ์ ๋กค์์์ ์์ฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๊ณ์ํด์ ํ์ ์ธํธ๋ก ์์
ํ ๊ฒ์
๋๋ค. buggy
ั sa-logic
.
์ฌ์ํ ์ผ๋ก ์๊ฐ์ ๋ญ๋นํ์ง ๋ง๊ณ ์ฌ์ฉ์์ 20%๋ฅผ ๋ฒ๊ทธ๊ฐ ์๋ ๋ฒ์ ์ผ๋ก ์ฆ์ ๋ณด๋ด๊ณ (์ด๋ ์นด๋๋ฆฌ์ ์ถ์๋ฅผ ๋ํ๋) ๋๋จธ์ง 80%๋ ์ผ๋ฐ ์๋น์ค๋ก ๋ณด๋ด๋๋ก ํฉ์๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ค์ VirtualService(
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
weight: 80 # 1
- destination:
host: sa-logic
subset: v2
weight: 20 # 1
1์ ๋ฌด๊ฒ(weight
) - ์์ ์ ๋๋ ์์ ์์ ํ์ ์งํฉ์ผ๋ก ์ ๋ฌ๋๋ ์์ฒญ์ ๋น์จ์ ์ง์ ํฉ๋๋ค.
์ด์ VirtualService ๊ตฌ์ฑ์ ์
๋ฐ์ดํธํด ๋ณด๊ฒ ์ต๋๋ค. sa-logic
๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ญ์์ค.
$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic configured
... ๊ทธ๋ฌ๋ฉด ์ผ๋ถ ์์ฒญ์ด ์คํจ๋ก ์ด์ด์ง๋ ๊ฒ์ ์ฆ์ ํ์ธํ ์ ์์ต๋๋ค.
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}'
--silent -w "Time: %{time_total}s t Status: %{http_code}n"
-o /dev/null; sleep .1; done
Time: 0.153075s Status: 200
Time: 0.137581s Status: 200
Time: 0.139345s Status: 200
Time: 30.291806s Status: 500
VirtualServices๋ ์นด๋๋ฆฌ์ ๋กค์์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฌธ์ ์ ์ ์ฌ์ ์ํฅ์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ 20%๋ก ์ขํ์ต๋๋ค. ์์ฃผ ๋ฉ์ง! ์ด์ ์ฝ๋๊ฐ ํ์คํ์ง ์์ ๊ฒฝ์ฐ(์ฆ, ํญ์...) ๋ฏธ๋ฌ๋ง ๋ฐ ์นด๋๋ฆฌ์ ๋กค์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๊ฐ ์ด๊ณผ ๋ฐ ์ฌ์๋
๊ทธ๋ฌ๋ ๋ฒ๊ทธ๊ฐ ํญ์ ์ฝ๋์์ ๋๋๋ ๊ฒ์ ์๋๋๋ค. "์ ๋ชฉ๋ก์์
๋ฐ๋ชจ๋ฅผ ์ํด ๋์ผํ ๋ฌธ์ ๋ฒ์ ์ ๊ณ์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. sa-logic
(buggy
), ๋ฌด์์ ์ค๋ฅ๋ก ๋คํธ์ํฌ์ ๋ถ์์ ์ฑ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
๋ฒ๊ทธ๊ฐ ์๋ ์๋น์ค๊ฐ ์๋ตํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆด ํ๋ฅ ์ด 1/3์ด๊ณ , ๋ด๋ถ ์๋ฒ ์ค๋ฅ๋ก ๋๋ ํ๋ฅ ์ด 1/3์ด๋ฉฐ, ํ์ด์ง๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฐํ๋ ํ๋ฅ ์ด 1/3์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ํฅ์ ์ํํ๊ณ ์ฌ์ฉ์์ ์ถ์ ๋ ์ข๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- ์๋น์ค๊ฐ ์๋ตํ๋ ๋ฐ 8์ด ์ด์ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ์๊ฐ ์ด๊ณผ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์์ฒญ์ด ์คํจํ๋ฉด ๋ค์ ์๋ํ์ธ์.
๊ตฌํ์ ์ํด ๋ค์ ๋ฆฌ์์ค ์ ์๋ฅผ ์ฌ์ฉํฉ๋๋ค(
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
weight: 50
- destination:
host: sa-logic
subset: v2
weight: 50
timeout: 8s # 1
retries:
attempts: 3 # 2
perTryTimeout: 3s # 3
- ์์ฒญ ์๊ฐ ์ด๊ณผ๋ 8์ด๋ก ์ค์ ๋ฉ๋๋ค.
- ์์ฒญ์ 3๋ฒ ์ฌ์๋๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์๋ต ์๊ฐ์ด 3์ด๋ฅผ ์ด๊ณผํ๋ฉด ๊ฐ ์๋๋ ์คํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ด๋ ์ฌ์ฉ์๊ฐ 8์ด ์ด์ ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์๊ณ ์คํจํ ๊ฒฝ์ฐ ์๋ต์ ์ป๊ธฐ ์ํด XNUMX๋ฒ์ ์๋ก์ด ์๋๋ฅผ ํ์ฌ ์ฑ๊ณต์ ์ธ ์๋ต ๊ฐ๋ฅ์ฑ์ ๋์ด๊ธฐ ๋๋ฌธ์ ์ต์ ํ๋ ๊ฒ์ ๋๋ค.
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ๋ ๊ตฌ์ฑ์ ์ ์ฉํฉ๋๋ค.
$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured
๊ทธ๋ฆฌ๊ณ ์ฑ๊ณต์ ์ธ ์๋ต ์๊ฐ ์์์ ์ฆ๊ฐํ์์ Grafana ๊ทธ๋ํ์์ ํ์ธํ์ญ์์ค.
์๊ฐ ์ด๊ณผ ๋ฐ ์ฌ์๋ ์ถ๊ฐ ํ ์ฑ๊ณต์ ์ธ ์๋ต ํต๊ณ ๊ฐ์
๋ค์ ์น์
์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ (๋๋ ์คํ๋ ค ๊ธฐ์ฌ์ ๋ค์ ๋ถ๋ถ์ผ๋ก ์ด๋ํฉ๋๋ค. ์๋ํ๋ฉด ์ฌ๊ธฐ์๋ ๋ ์ด์ ์ค์ ์คํ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ต ๋ฒ์ญ์
๋๋ค.), ์ญ์ sa-logic-buggy
๋ค์ ๋ช
๋ น์ ์คํํ์ฌ VirtualService๋ฅผ ์คํํฉ๋๋ค.
$ kubectl delete deployment sa-logic-buggy
deployment.extensions โsa-logic-buggyโ deleted
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io โsa-logicโ deleted
ํ๋ก ์ฐจ๋จ๊ธฐ ๋ฐ ๊ฒฉ๋ฒฝ ํจํด
์ฐ๋ฆฌ๋ ์์ฒด ๋ณต๊ตฌ๋ฅผ ๋ฌ์ฑํ ์ ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ๋ ๊ฐ์ง ์ค์ํ ํจํด์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. (์๊ฐ ์น์ ) ์๋น์ค.
ํ๋ก ์ฐจ๋จ๊ธฐ ("ํ๋ก ์ฐจ๋จ๊ธฐ") ๋น์ ์์ผ๋ก ๊ฐ์ฃผ๋๋ ์๋น์ค ์ธ์คํด์ค๋ก ๋ค์ด์ค๋ ์์ฒญ์ ์ข
๋ฃํ๊ณ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ํด๋น ์๋น์ค์ ์ ์ ์ธ์คํด์ค๋ก ๋ฆฌ๋๋ ์
๋๋ ๋์ ์ด๋ฅผ ๋ณต์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค(์ฑ๊ณต์ ์ธ ์๋ต ๋น์จ์ด ์ฆ๊ฐํจ). (์ฐธ๊ณ : ํจํด์ ๋ํ ๋ ์์ธํ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์นธ๋ง์ด ("๋ถํ ") ์๋น์ค ์ฅ์ ๊ฐ ์ ์ฒด ์์คํ
์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๊ฒฉ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋น์ค B๊ฐ ์ค๋จ๋๊ณ ๋ค๋ฅธ ์๋น์ค(์๋น์ค B์ ํด๋ผ์ด์ธํธ)๊ฐ ์๋น์ค B์ ์์ฒญ์ ํ์ฌ ์ค๋ ๋ ํ์ด ์์ง๋๊ณ ๋ค๋ฅธ ์์ฒญ์ ์๋น์คํ ์ ์๊ฒ ๋ฉ๋๋ค(์๋น์ค B์ ์์ฒญ์ด ์๋๋๋ผ๋). (์ฐธ๊ณ : ํจํด์ ๋ํ ๋ ์์ธํ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฌํ ํจํด์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ฐพ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ฒ ์ต๋๋ค.
๋ฒ์ญ๊ฐ์ ์ถ์
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- "Istio๋ฅผ ์ฌ์ฉํ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋์๊ฐ๊ธฐ":
1๋ถ(์ฃผ์ ๊ธฐ๋ฅ ์๊ฐ) ,ํํธ 3(์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ) ; - ยซ
Conduit - Kubernetes์ฉ ๊ฒฝ๋ ์๋น์ค ๋ฉ์ "; - ยซ
์๋น์ค ๋ฉ์๋ ๋ฌด์์ด๋ฉฐ [๋ง์ดํฌ๋ก์๋น์ค๊ฐ ํฌํจ๋ ํด๋ผ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ] ์๋น์ค ๋ฉ์๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ".
์ถ์ฒ : habr.com