ááŸááºáá»ááºá áá¬áá¬ááŒááº:
áá±á¬ááºážáá«ážááẠrepository á០configurations ( Kubernetes ááŸáá·áº Istio á¡ááœáẠmanifests áá»á¬áž) ááᯠá¡áá¯á¶ážááŒá¯ááŒá±á¬ááºáž ááá·áºá¡á¬áž áá»áœááºá¯ááºááá¯á· ááááá±ážáá«áááºá
áááºážá ááºážáááºáž á á®áá¶ááá·áºááœá²ááŸá¯
Istio ááŒáá·áºá áá¶á·ááá¯ážáá±ážáááºá¡ááœáẠá¡á á¯á¡áá±ážááœáẠá áœááºážáááºá¡áá áºáá»á¬ážáá±á«áºáá¬áááº-
- ááá¯ááºážááá Ạáá±á¬ááºážááá¯ááŸá¯áááºážááŒá±á¬ááºáž: Canary ááŒáá·áºáá»áááŸá¯áá»á¬ážá A/B á ááºážáááºááŒááºážá
- Load áá»áááºááœááºáá»áŸá¬: hashes ááá¯á¡ááŒá±áá¶á ááá¯ážááŸááºážááŒá®áž ááá¯ááºáá®áá±á¬á
- ááŒá¯ááºáá»ááŒá®ážáá±á¬áẠááŒááºáááºáá°áá±á¬ááºáá±ážá¡áá»áááºáá¯ááºááŒááºážá áááºá ááºážááŒááºážá circuit breakers;
- á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠááá·áºááœááºážááŒááºážá- ááŸá±á¬áá·áºááŸá±ážááŸá¯á áá»áááºážááœá¬ážáá±á¬ áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá á áááºááá¯á·á
áá±á¬ááºážáá«ážááœáẠáááºáááºáá±á¬áºááŒáá¬ážáááºááŸáá·áºá¡áá»áŸ á€á
áœááºážáááºáá»á¬ážááᯠááœá±ážáá»ááºáá¬ážáá±á¬ á¡ááºááºáá®áá±ážááŸááºážááᯠá¡áá¯á¶ážááŒá¯á ááá°áá¬á¡ááŒá
Ạááá¯ááºáá±á¬áºáááºááŒá
áºááŒá®áž áááºážáá
áºáá»áŸá±á¬ááºááœáẠááá±á¬ááá¬ážá¡áá
áºáá»á¬ážááᯠááááºáááºáá«áááºá ááááá¯á¶ážáá±á¬ á¡áá°á¡áááŒá
áºáááá·áºáááºá DestinationRules
(ááá¯ááá¯áááºááŸá¬ á¡ááœá¬ážá¡áá¬/áá±á¬ááºážááá¯ááŸá¯áá»á¬áž áááºáá¶áááŸááá°ááŸáá·áºáááºáááºááá·áº á
ááºážáá»ááºážáá»á¬áž - ááá·áºááŸááºážááŒá± áá¬áá¬ááŒááºáá»ááºá)A/B á
ááºážáááºááŒááºážáá¡áá°á¡áá®ááŒáá·áºá
A/B á ááºážáááºááŒááºáž- áááºááœá±á·ááœáẠDestinationRules
A/B á ááºážáááºááŒááºážááᯠá¡ááºááá®áá±ážááŸááºážáá áºáá¯á áá¬ážááŸááºážááŸá áºáá»áá¯ážááŸá (áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áááºážááá¯á·ááẠá¡ááŒááºá¡á¬ážááŒáá·áº ááœá²ááŒá¬ážáááº) ááŸáá·áº áááºááá·áºá¡áá¬ááẠá¡áá¯á¶ážááŒá¯áá°á¡ááœá±á·á¡ááŒá¯á¶ááᯠááá¯ááá¯áá±á¬ááºážááœááºá á±áááºááᯠáá»áœááºá¯ááºááá¯á· 100% ááá±áá»á¬áá«á ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá¬ážááŸááºážááŸá áºáá»áá¯ážáá¯á¶ážááᯠáá áºááŒáá¯ááºááẠáá¯ááºáá±á¬ááºááŒá®áž áááºááá áºáá»á¬ážááᯠá á¯áá±á¬ááºážáá«áááºá
A/B á ááºážáááºááŸá¯ááá¯ááºááŒáááºá¡ááœáẠááá¯á¡ááºáá±á¬ Frontend á áá¯ááááá¬ážááŸááºážááᯠá¡áá¯á¶ážáá»ááẠá¡á±á¬ááºáá« command ááᯠrun áá«á
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created
á¡á áááºážáá±á¬ááºáá¬ážááŸááºážá¡ááœáẠááŒáá·áºáá»ááºááŸá¯ááẠáá±áá¬ááŸá áºáá¯ááœáẠááœá²ááŒá¬ážáááº-
- áá¯á¶ááẠááá°áá®áá±á¬ tag ááá¯á¡ááŒá±áá¶ááẠ-
istio-green
, - áá°ážáá»á¬ážááœáẠá¡ááœáŸááºážáá«ááŸááá«áááºá
version: green
.
ááŒáá·áºáá»ááºááŸá¯ááŸá
áºáá¯áá¯á¶ážááœáẠáá¶ááááºáá
áºáá¯ááŸááá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá app: sa-frontend
á virtual áááºáá±á¬ááºááŸá¯ááŒáá·áº áááºážááŒá±á¬ááºážááŒáá¬ážáá±á¬ áá±á¬ááºážááá¯áá»ááºáá»á¬áž 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
static ááá¯ááºáá»á¬ážá áá¬ážááŸááºážáá
áºáá¯á¡á¬áž áá±á¬ááºážááá¯ááŒááºážááŒáá·áºá ááá°áá®áá±á¬ áá¬ážááŸááºážááŸáááá·áº pods áá»á¬ážáá¶ááá¯á· load balancer á០áá±ážááá¯á·ááá¯ááºáááºá áááºááŸá¬ážáá±á¬ á¡ááŒá±á¬ááºážáá»á¬ážááŒá±á¬áá·áºá ááá¯ááá¯á·áá±á¬ááá¯ááºáá»á¬áž áááŸááá«á ááá¯á·ááŒá±á¬áá·áº áá»áŸá±á¬ááºááœáŸá¬áá»á¬áž á¡áá¯ááºáá¯ááºááá¯ááºááẠááá·áºáááºáá»ááºáá
áºáᯠáááºááŸááºááẠááá¯á¡ááºáááº-"index.html áááºáá±á¬ááºááŸá¯áá±ážáá±á¬ á¡ááá®áá±ážááŸááºážá áá°áá®áá±á¬áá¬ážááŸááºážááẠáá±á¬ááºáááºááœá²áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá±á¬ááºááœááºáá±ážááá·áºáááºá"á
áááááºáááºáž hash-based load balancing ááŒáá·áº ááá¯áá±áá¬ááᯠáá±á¬ááºáá«áááºá (áá áºááááºáááºáž Hash Loadbalancing)... áá®ááá á¹á ááŸá¬ áá°áá®áá±á¬ client á០áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠáá°áá®áá±á¬ backend instance ááá¯á· áá±ážááá¯á·áá«áááºáááŒáá¯áááºáááºááŸááºáá¬ážáá±á¬ ááá¯ááºááá¯ááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áá¬ážááá·áºá¡ááœáẠ- á¥ááᬠHTTP áá±á«ááºážá á®ážáá áºáá¯á DestinationRules ááᯠá¡áá¯á¶ážááŒá¯á á¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá
ááœá¬ážááá·áºáá±áᬠá ááºážáááºážáá»á¬áž
áááºážááŒá®ážáá±á¬áẠVirtualService DestinationRules ááᯠá¡áá¯á¶ážááŒá¯á á¡ááá¯ááŸááá±á¬ áááºáá±á¬ááºááŸá¯ááá¯á· áá±á¬ááºážááá¯áá»ááºáá áºáᯠáá±ážááá¯á·ááŒá®ážá á€áááºáá±á¬ááºááŸá¯á á¥ááá¬áá»á¬ážá¡ááœáẠáŠážáááºáá¬ážáá±á¬ á¡ááœá¬ážá¡áá¬á¡ááœáẠá¡áá¯á¶ážááŒá¯ááá·áº áá°áá«ááá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· áááºááŸááºááá¯ááºáááº-
Istio á¡áááºážá¡ááŒá
áºáá»á¬ážááŒáá·áº áááºážááŒá±á¬ááºážá
á®áá¶ááá·áºááœá²ááŸá¯
ááœá±á¬ááá¯â ááœááºáááºá¡ááœá¬ážá¡áá¬á¡áá±á«áº Istio á¡áááºážá¡ááŒá áºáá»á¬ážá áááºáá±á¬ááºááŸá¯ááᯠáá¬ážáááºáááœááºáá°áá±á¬áááºážáááºážááŒáá·áº á€áá±áá¬ááœáẠáááºááŒáá¬ážáááºá áááá»á áœá¬ááŒá±á¬ááá»áŸáẠCRD ááœááºááá·áºááœááºážáá¬ážáá±á¬ Ingress Gateway ááŸá áá¶ááááºá០áá±á¬ááºážááá¯áá»ááºááᯠáá±ážááá¯á·ááẠáááºááá·áºá¥ááá¬ááᯠáá±ážááá¯á·ááááºááᯠáááá»á áœá¬áá¯á¶ážááŒááºáááºá
Destination Rules ááŒáá·áºá áá°áá®áá±á¬ hashe áá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááẠload balancing ááᯠconfigure ááá¯ááºááŒá®áž áá°áá®áá±á¬ service instance ááẠáá°áá®áá±á¬ user ááá¯áá¯á¶á·ááŒááºááŒá±á¬ááºážáá±áá»á¬á
á±áá«áááºá á¡á±á¬ááºáá«ááœá²á·á
ááºážáá¯á¶ááẠááá·áºá¡á¬áž áááºážááá¯á¡á±á¬ááºááŒááºáááºááœáá·áºááŒá¯ááẠ(
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-frontend
spec:
host: sa-frontend
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: version # 1
1 - HTTP header á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á hash ááᯠáá¯ááºáá±ážáá«áááºá version
.
á¡á±á¬ááºáá« command ááŒáá·áº configuration ááá¯á¡áá¯á¶ážááŒá¯áá«-
$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created
ááᯠá¡á±á¬ááºáá« command ááᯠrun ááŒá®áž header ááᯠáááºááŸááºáá±á¬á¡áá« ááŸááºáááºáá±á¬ ááá¯ááºáá»á¬áž áááŸáááŒá±á¬ááºáž áá±áá»á¬áá«á
á±á version
:
$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
ááœá±á¬ááá¯: header ááœáẠááá°áá®áá±á¬áááºááá¯ážáá»á¬ážááá·áºáááºááŸáá·áº browser ááœáẠááá¯ááºááá¯ááºááááºáá»á¬ážááᯠá
ááºážáááºáááºá áááºáá¯á¶ážááá¯ááºáááºá
áá±áá°áá»á¡á¬ážááŒáá·áºá DestinationRules ááẠload balancing á§áááá¬ááœááºááá¯ááá¯áá¯ááºáá±á¬ááºááá¯ááºá
áœááºážááŸáááẠ- á¡áá±ážá
áááºááá¯á
á
áºáá±ážáá«á
VirtualService ááᯠáááºáá¶ááá±á·áá¬áá®á á¡á±á¬ááºáá« command áá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒááºážááŒáá·áº á¡ááá®áá±ážááŸááºážá "á¡á áááºážáá±á¬ááºáá¬ážááŸááºáž" ááŸáá·áº áááºááá¯ááºáᬠáá¬ááºáááºážááŒá±á¬ááºáž á ááºážáááºážááᯠáá»ááºááŒáá«á áá¯á·á
$ 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
Mirroring- áááºááœá±á·ááœáẠVirtual Services
á¡áááẠ("á¡áá¬á¡áá¶") ááá¯á·ááá¯áẠááŒá±ážáá¯á¶ááŒááºááŒááºážá ("ááŸááºááŒá±á¬ááºáž") á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡áá±á«áº áááááá¯ááºá á±áá² áá¯ááºáá¯ááºááŸá¯ááŒá±á¬ááºážáá²ááŸá¯ááᯠá ááºážáááºááá¯ááá·áºááá á¹á áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áááº- áááºážááá¯áá¯ááºáá±á¬ááºáááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠ("ááŒá±ážáá¯á¶") áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠááá¯áá»ááºáá±á¬á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááŒá¯áá¯ááºáá²á·ááá·áº áá¯áááá¥ááá¬áá áºáá¯ááá¯á· áá°ážáá°ááŒá®áž á¡áá»áá¯ážáááºáá»á¬ážááá¯ááŒáá·áºáá«á ááá¯ážááá¯ážááŸááºážááŸááºážááŒá±á¬ááá»áŸááºá áááºááá¯ááºáá±á¬áºááá¯ááºáááºááẠáááºážááᯠá¡ááŸááºááááºááŒááºáááºáá¯á¶ážáááºáááááá¯ááºáá±á¬ á€áá»áŸááŒá®ážáá¬ážáá±á¬á¡áá¯á¡áá áºáá¯á¶á á¶ááŒáá·áº ááœá²áááºáá±á¬ááºážááá¯ááŸá¯ááŒá¯áá¯ááºááá·áºá¡áá«ááœáẠáááºááá¯ááºáá±á¬áºááá¯ááºáááºááẠá¡áá±ážááŒá®ážáá¯á¶ážááŒá¿áá¬ááᯠááœá±ážáá»ááºááá¯ááºááŒááºážááŒá áºáááºá
áá¯ááºáá±á¬ááºáá»ááºááœáẠá€áá¬ááºáááºážááᯠá
ááºážáááºáááºá¡ááœáẠSA-Logic á áá¯áááá¥ááá¬ááᯠbugs ááŒáá·áº áááºáá®ážááŒáá«á
áá¯á· (buggy
á¡á±á¬ááºáá« command ááᯠrun ááŒááºážááŒáá·áº)
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created
ááá¯ááœáẠinstances á¡á¬ážáá¯á¶ážááᯠáá±áá»á¬á¡á±á¬áẠcommand ááᯠrun ááŒáá«á
áá¯á· 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 instances áá»á¬ážááá¯á· áá±ážááá¯á·ááŒá®áž v2 instances áá»á¬ážááá¯á· ááŒá±á¬ááºážááŒááºááŸááºá
á±ááá¯áááº-
á
ááºážáá»ááºážáá»á¬ážááẠVirtualService á áááºážááŒá±á¬ááºážááœá²áá»á¬ážááŸáá·áº áááºážááŒá±á¬ááºážáá»á¬ážááᯠáááºáááºááŸááºááŸááºááœá²áá
áºáá¯ááá¯á· áááºááŸááºáá±ážááá·áº DestinationRule ááŸáá·áº áá±á«ááºážá
ááºáá¬ážáá±á¬ VirtualService ááŸáááá·áº áááºážááᯠá¡á±á¬ááºááŒááºáá«áááºá
Destination á ááºážáá»ááºážáá»á¬ážááœáẠá¡ááá¯ááºážááœá²áá»á¬ážááᯠáááºááŸááºááŒááºážá
á¡ááá¯ááºážáá»á¬áž (á¡ááœá²áá»á¬áž) á¡á±á¬ááºáá« configuration á¡á¬ážááŒáá·áºáá¯á¶ážááŒááºááŒááẠ(
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
) á¡á á¯ááœá²á á¡á áááºá¡ááá¯ááºážáá áºáá¯ááŒá áºáá¬ááẠáá¬áááá»á¬ážááŸáá·áº ááá¯ááºáá®ááááºááŒá áºáá±á¬ áá±á¬á·áááºááá¯ážá¡ááœá²áá»á¬ážááᯠáááºááŸááºáááºá
á¡á±á¬ááºáá« command ááŒáá·áº configuration ááá¯á¡áá¯á¶ážááŒá¯áá«-
$ 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
á¡á±á¬ááºáá« command ááá¯áá±á«áºááá¯ááŒááºážááŒáá·áº load ááá¯ááá·áºááŒáá«á áá¯á·á
$ 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 ááᯠáááºááá¯á·á¡áá¯á¶ážáá»áááºááᯠáá»áœááºá¯ááºááá¯á· ááááá¯á¶ážááŒááºááœá±á·ááá¯ááºááááº- áááºá¡áá»ááẠsa-web-app
áá±á¬ááºážááá¯áá»ááºáá
áºáá¯ááŒá¯áá¯ááºáááºá sa-logic
á VirtualService ááŸáá
áºááá·áº - áá±á¬ááºážááá¯áá»ááºááᯠv1 á¡á
á¯ááœá²ááá¯á· áááºážááŒá±á¬ááºážááŒá±á¬ááºážáááºááŸáá·áº áááºáá±á¬ááºááŸá¯á v2 á¡ááœá²ááá¯á· áá±á¬ááºážááá¯áá»ááºá¡á¬áž ááŒááºááŒá±á¬ááºážááẠááŒááºáááºáá¬ážááá·áº sidecar Envoy ááŸáááá·áº ááŒááºáááºážáá«áááºá sa-logic
.
Virtual Services ááẠááá¯ážááŸááºážáááºáᯠááẠáááºáá±á¬ááºážáááºááá¯ááºááẠá áá±á¬ááºá¡ááá¯ááºážááŸá¬áá±á¬á· áá°ááá¯á·á ááááºáá±á¬ááºážáááºááá¯á· ááŒá±á¬ááŒááºážá¡á¬ážááŒáá·áº á¡á²áá«ááᯠá¡áá»ááºáá»á²á·ááŒá±á¬áá«áááºá
áááá¹ááá® ááŒáá·áºáá»ááá±áž
Canary Deployment ááẠá¡áá¯á¶ážááŒá¯áá°á¡áááºážá á¯áá¶ááá¯á· á¡ááºááá®áá±ážááŸááºážáá¬ážááŸááºážá¡áá áºááᯠááŒáá·áºáá»áááá·áºáá¯ááºáááºážá ááºááŒá áºáááºá áá¯ááºáá±ááŸá¯ááœáẠááŒá¿áá¬áááŸáááŒá±á¬ááºáž áá±áá»á¬á á±áááºá¡ááœáẠáááºážááᯠá¡áá¯á¶ážááŒá¯ááŒá®ážááŸáᬠáááºážá (ááŒáá·áºáá»áááŸá¯) á¡áááºá¡ááœá±ážááᯠáá¯á¶ááŒááºááŒá®áž á¡ááŒá¬ážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᶠááŒáá·áºáá±áá«áПáááááºáááºááŒá®ážá
Canary ááŒáá·áºáá»áááŸá¯áá»á¬ážááᯠááá¯ááºááŒáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááá¯ááºážááœá²áá
áºáá¯ááŒáá·áº áááºáááºáá¯ááºáá±á¬ááºááœá¬ážáá«áááºá buggy
Ñ sa-logic
.
á¡áá±ážá¡ááœáŸá¬ážááá
á¹á
áá»á¬ážááœáẠá¡áá»áááºáááŒá¯ááºážáá² áá¯á¶ážá
áœá²áá° 20% ááᯠbug áá»á¬ážááŒáá·áº áá¬ážááŸááºážááá¯á· áá»ááºááŒááºážááá¯á·áá« (áááºážá áá»áœááºá¯ááºááá¯á·á canary rollout ááᯠááá¯ááºá
á¬ážááŒá¯áááº) ááŸáá·áº áá»áẠ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
á¡á±á¬ááºáá« command ááŒáá·áº
$ 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 ááẠCanary ááŒáá·áºáá»áááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááº- á€ááá á¹á ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááŒá¿áá¬áá»á¬ážá ááŒá áºááá¯ááºááŒá±ááŸááá±á¬ áááºáá±á¬ááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áá°á¡ááŒá±áá¶á 20% ááá¯á· áá»ááºážááŒá±á¬ááºážááœá¬ážáá«áááºá á¡á¶á·ááŒááœááº! ááá¯á áá»áœááºá¯ááºááá¯á·ááá¯ááºááᯠááá±áá»á¬ááá·áºá¡áá«ááá¯ááºáž (áá áºáááºážá¡á¬ážááŒáá·áº - á¡ááŒá²áááºáž...)á áá»áœááºá¯ááºááá¯á·ááẠmirroring ááŸáá·áº canary rollouts ááá¯áá¯á¶ážááá¯ááºáááºá
á¡áá»áááºáá¯ááºááŒá®áž ááŒááºá ááºážáá«á
ááá¯á·áá±á¬áº bug áá»á¬ážááẠáá¯ááºááœáẠá¡ááŒá²ááá¯á¶ážáá«á á
á¬áááºážáá²ááŸá¬ "
ááá¯ááºááŒáááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá°áá®áá±á¬ááŒá¿áá¬áá¬ážááŸááºážááᯠáááºáááºá¡áá¯á¶ážááŒá¯áá«áááºá sa-logic
(buggy
) ááŸáá·áº áá»áœááºá¯ááºááá¯á·ááẠáá»áááºážáá»ááºááœááºááŸá¯áá»á¬ážááŒáá·áº ááœááºáááºá ááá¯á¶ááŒááºááá¯ááºááŸá¯ááᯠá¡áá¯áá°áá«áááºá
bug áá»á¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯ááẠáá¯á¶á·ááŒááºááẠ1/3 ááŒá¬ááŒáá·áºááá·áºá¡ááœáá·áºá¡áá±ážá Internal Server Error ááŸáá·áº á¡áá¯á¶ážáááºááẠ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 á áá¹ááá·áºááẠááá¯á á±á¬áá·áºááá¯ááºážááẠáááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº ááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážááŒá áºááŒá®áž áá»ááºááœááºááŸá¯áá»á¬ážááŸááá«á áá¯á¶á·ááŒááºááŸá¯á¡áá áºáá¯á¶ážááŒáááºááŒá¯áá¯ááºáᬠá¡á±á¬ááºááŒááºáá±á¬áá¯á¶á·ááŒááºááŸá¯á¡ááœáá·áºá¡áááºážááᯠááá¯ážááŒáá·áºáá±ážáááºááŒá áºáááºá
á¡á±á¬ááºáá« command ááŒáá·áº á¡ááºááááºáá¯ááºáá¬ážáá±á¬ ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááᯠá¡áá¯á¶ážááŒá¯áá«-
$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured
á¡áááºááœáẠá¡á±á¬ááºááŒááºáá±á¬ áá¯á¶á·ááŒááºááŸá¯á¡áá±á¡ááœáẠááá¯ážáá¬ááŒá±á¬ááºáž Grafana ááááºáá»á¬ážááᯠá á áºáá±ážáá«-
á¡áá»áááºáá¯ááºááŒááºážááŸáá·áº áááºáá«áááºáá« áá±á«ááºážááá·áºááŒá®ážáá±á¬áẠá¡á±á¬ááºááŒááºáá±á¬ áá¯á¶á·ááŒááºááŸá¯á
á¬áááºážááá¬ážáá»á¬ážááœáẠááá¯ážáááºááŸá¯áá»á¬áž
áá±á¬ááºá¡ááá¯ááºážááᯠáááºáááœá¬ážááẠ(áá«ááŸááá¯áẠáá±á¬ááºážáá«ážáá²á· áá±á¬ááºá¡ááá¯ááºážá¡ááœááºá áá¬ááŒá±á¬áá·áºáá²ááá¯áá±á¬á· áá®áá²ááŸá¬ áááºááœá±á·á
ááºážáááºááŸá¯ááœá± ááŸááá±á¬á·ááŸá¬ ááá¯ááºáá°áž - ááá·áºááŸááºážááŒá± áá¬áá¬ááŒááºáááºá), áá»áẠsa-logic-buggy
á¡á±á¬ááºáá« command áá»á¬ážááᯠrun ááŒááºážááŒáá·áº 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
Circuit Breaker ááŸáá·áº Bulkhead áá¯á¶á á¶áá»á¬áž
áá»áœááºá¯ááºááá¯á·ááẠááá·áºá¡á¬áž ááááááá¯ááºááᯠááŒááºáááºáá¬áááºáá°áá¬á á±ááẠááœáá·áºááŒá¯áá±ážáá±á¬ ááá¯ááºáááá¯áá¬ážáá áºáááá¯áá¬ááœáẠá¡áá±ážááŒá®ážáá±á¬áá¯á¶á á¶ááŸá áºáá¯á¡ááŒá±á¬ááºáž ááŒá±á¬áá±áá«áááºá (ááááááá¯ááºááᯠáá¯áááŒááºáž) áááºáá±á¬ááºááŸá¯áá»á¬ážá
ááá¯ááºáááºááá±á· ("áá¬ážáá
áºááŒááºáááááá¬") áá»ááºážáá¬áá±ážááá±á¬ááºážáᯠáá°ááá±á¬ áááºáá±á¬ááºááŸá¯áá
áºáá¯á á¥ááá¬áá
áºáá¯áᶠáá±á¬ááºááŸááá¬áá±á¬ áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáááºááá·áºáááºááŸáá·áº áá¯á¶ážá
áœá²áá°áá»á¬ážá áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠááá¯áááºáá±á¬ááºááŸá¯á áá±á¬ááºážááœááºáá±á¬á¡ááŒá±á¡áá±áá»á¬ážááá¯á· ááŒááºááœáŸááºážáá±áá»áááºááœáẠ(á¡á±á¬ááºááŒááºáá±á¬ áá¯á¶á·ááŒááºááŸá¯ áá¬ááá¯ááºááŸá¯ááºážááᯠááá¯ážá
á±áááº)á (ááŸááºáá»ááº- á¥ááá¬á¡á¬ážááŒáá·áº áá¯á¶á
á¶á á¡áá±ážá
áááºáá±á¬áºááŒáá»ááºááᯠááŸá¬ááœá±á·ááá¯ááºáááºá á¥ááá¬á
á ("á¡ááá¯ááºážááá¯ááºáž") áááºáá±á¬ááºááŸá¯ áá»áá¯á·ááœááºážáá»ááºáá»á¬ážááᯠá
áá
áºáá
áºáá¯áá¯á¶ážááᯠááááá¯ááºá
á±ááŒááºážá០ááœá²áá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá Service B áá»ááºááœá¬ážáᬠá¡ááŒá¬ážáááºáá±á¬ááºááŸá¯ (Service B á client) ááẠService B ááá¯á· áá±á¬ááºážááá¯áá»ááºáá
áºáá¯ááŒá¯áá¯ááºááŒá®áž áááºážááẠáááºážá thread pool ááá¯áá¯ááºáá¯á¶ážá
á±ááŒá®áž á¡ááŒá¬ážáá±á¬áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá±á¬ááºááœááºáá±ážááá¯ááºááŒááºáž (áááºážááá¯á·ááẠService B ááŸááá¯ááºáá»áŸááºáááº)á (ááŸááºáá»ááº- á¥ááá¬á¡á¬ážááŒáá·áº áá¯á¶á
á¶á á¡áá±ážá
áááºáá±á¬áºááŒáá»ááºááᯠááŸá¬ááœá±á·ááá¯ááºáááºá á¥ááá¬á
ááŸá¬ááœá±áááœááºáá°áá±á¬ááŒá±á¬áá·áº á€áá¯á¶á
á¶áá»á¬ážá á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáá»áœááºá¯ááºáá»ááºááŸááºáá¬ážáá«áááºá
PS áá¬áá¬ááŒááºááŸ
áá»áœááºá¯ááºááá¯á·áááá±á¬á·ááºááœááºáááºážáááºáá«
- "Istio ááŒáá·áº á¡áá±ážá
á¬ážáááºáá±á¬ááºááŸá¯áá»á¬ážááá¯á· ááŒááºááœá¬ážáááº"-
á¡ááá¯ááºáž 1 (á¡áááá¡ááºá¹áá«áááºáá»á¬ážááááºáááº) ,á¡ááá¯ááºáž á (á á áºááŸááºááŒá±á¬ááºážááŸáá·áº ááœáá·áºááŒá¯áá»ááº) ; - «
Conduit - Kubernetes á¡ááœáẠáá±á«á·áá«ážáá±á¬ áááºáá±á¬ááºááŸá¯ááœáẠ"; - «
áááºáá±á¬ááºááŸá¯ mesh ááá¯áᬠáá¬áá²á [ááá¯ááºáááá¯áááºáá±á¬ááºááŸá¯áá»á¬ážáá«áá±á¬ cloud application áá áºáá¯á¡ááœááº] áá¬ááŒá±á¬áá·áº ááá¯á¡ááºáá¬áá²á "á
source: www.habr.com