ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2

ื”ืขืจื”. ืชืจื’ื•ื: ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืกื“ืจื” ื–ื• ื”ื•ืงื“ืฉื” ืœื”ืฆื’ืช ื™ื›ื•ืœื•ืช Istio ื•ื”ื“ื’ืžืชืŸ ื‘ืคืขื•ืœื”. ื›ืขืช ื ื“ื‘ืจ ืขืœ ื”ื™ื‘ื˜ื™ื ืžื•ืจื›ื‘ื™ื ื™ื•ืชืจ ืฉืœ ื”ืชืฆื•ืจื” ื•ื”ืฉื™ืžื•ืฉ ื‘ืจืฉืช ื”ืฉื™ืจื•ืช ื”ื–ื•, ื•ื‘ืคืจื˜, ืขืœ ื ื™ืชื•ื‘ ืžื›ื•ื•ืŸ ื•ื ื™ื”ื•ืœ ืชืขื‘ื•ืจืช ืจืฉืช.

ืื ื• ื’ื ืžื–ื›ื™ืจื™ื ืœืš ืฉื”ืžืืžืจ ืžืฉืชืžืฉ ื‘ืชืฆื•ืจื•ืช (ืžื ื™ืคืกื˜ื™ื ืขื‘ื•ืจ Kubernetes ื•-Istio) ืžื”ืžืื’ืจ istio-mastery.

ื ื™ื”ื•ืœ ืชืขื‘ื•ืจื”

ืขื Istio, ื™ื›ื•ืœื•ืช ื—ื“ืฉื•ืช ืžื•ืคื™ืขื•ืช ื‘ืืฉื›ื•ืœ ื›ื“ื™ ืœืกืคืง:

  • ื ื™ืชื•ื‘ ื‘ืงืฉื•ืช ื“ื™ื ืžื™ื•ืช: ื”ืฉืงื•ืช ืงื ืจื™ื•ืช, ื‘ื“ื™ืงื•ืช A/B;
  • ืื™ื–ื•ืŸ ืขื•ืžืกื™ื: ืคืฉื•ื˜ ื•ืขืงื‘ื™, ืžื‘ื•ืกืก ืขืœ hashes;
  • ื”ืชืื•ืฉืฉื•ืช ืœืื—ืจ ื ืคื™ืœื•ืช: ืคืกืง ื–ืžืŸ, ื ื™ืกื™ื•ื ื•ืช ื—ื•ื–ืจื™ื, ืžืคืกืงื™ื;
  • ื”ื›ื ืกืช ืชืงืœื•ืช: ืขื™ื›ื•ื‘ื™ื, ื‘ื™ื˜ื•ืœ ื‘ืงืฉื•ืช ื•ื›ื•'.

ื‘ื”ืžืฉืš ื”ืžืืžืจ, ื™ื›ื•ืœื•ืช ืืœื• ื™ื•ืžื—ืฉื• ื‘ืืžืฆืขื•ืช ื”ืืคืœื™ืงืฆื™ื” ืฉื ื‘ื—ืจื” ื›ื“ื•ื’ืžื” ื•ืžื•ืฉื’ื™ื ื—ื“ืฉื™ื ื™ื•ืฆื’ื• ืœืื•ืจืš ื”ื“ืจืš. ื”ืจืขื™ื•ืŸ ื”ืจืืฉื•ืŸ ื›ื–ื” ื™ื”ื™ื” DestinationRules (ื›ืœื•ืžืจ ื›ืœืœื™ื ืœื’ื‘ื™ ื”ื ืžืขืŸ ืฉืœ ืชืขื‘ื•ืจื”/ื‘ืงืฉื•ืช - ืชืจื’ื•ื ื‘ืงื™ืจื•ื‘), ื‘ืขื–ืจืชื ืื ื• ืžืคืขื™ืœื™ื ื‘ื“ื™ืงื•ืช A/B.

ื‘ื“ื™ืงืช A/B: DestinationRules ื‘ืคื•ืขืœ

ื‘ื“ื™ืงืช A/B ืžืฉืžืฉืช ื‘ืžืงืจื™ื ื‘ื”ื ืงื™ื™ืžื•ืช ืฉืชื™ ื’ืจืกืื•ืช ืฉืœ ืืคืœื™ืงืฆื™ื” (ื‘ื“ืจืš ื›ืœืœ ื”ืŸ ืฉื•ื ื•ืช ืžื‘ื—ื™ื ื” ื•ื™ื–ื•ืืœื™ืช) ื•ืื ื—ื ื• ืœื ื‘ื˜ื•ื—ื™ื ื‘-100% ืื™ื–ื• ืžื”ืŸ ืชืฉืคืจ ืืช ื—ื•ื•ื™ืช ื”ืžืฉืชืžืฉ. ืœื›ืŸ, ืื ื• ืžืจื™ืฆื™ื ืืช ืฉืชื™ ื”ื’ืจืกืื•ืช ื‘ื• ื–ืžื ื™ืช ื•ืื•ืกืคื™ื ืžื“ื“ื™ื.

ื›ื“ื™ ืœืคืจื•ืก ืืช ื”ื’ืจืกื” ื”ืฉื ื™ื™ื” ืฉืœ ื”-frontend, ื”ื ื“ืจืฉืช ืœื”ื“ื’ืžืช ื‘ื“ื™ืงื•ืช A/B, ื”ืคืขืœ ืืช ื”ืคืงื•ื“ื” ื”ื‘ืื”:

$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created

ืžื ื™ืคืกื˜ ื”ืคืจื™ืกื” ืฉืœ ื”ื’ืจืกื” ื”ื™ืจื•ืงื” ืฉื•ื ื” ื‘ืฉื ื™ ืžืงื•ืžื•ืช:

  1. ื”ืชืžื•ื ื” ืžื‘ื•ืกืกืช ืขืœ ืชื’ ืื—ืจ - istio-green,
  2. ืœืชืจืžื™ืœื™ื ื™ืฉ ืชื•ื•ื™ืช version: green.

ืžื›ื™ื•ื•ืŸ ืฉืœืฉืชื™ ื”ืคืจื™ืกื•ืช ื™ืฉ ืชื•ื•ื™ืช app: sa-frontend,ื‘ืงืฉื•ืช ืžื ื•ืชื‘ื•ืช ืขืœ ื™ื“ื™ ืฉื™ืจื•ืช ื•ื™ืจื˜ื•ืืœื™ sa-external-services ืœืฉื™ืจื•ืช sa-frontend, ื™ื•ืคื ื” ืœื›ืœ ื”ืžื•ืคืขื™ื ืฉืœื• ื•ื”ืขื•ืžืก ื™ื•ืคืฅ ื“ืจืš ืืœื’ื•ืจื™ืชื ืขื’ื•ืœ, ืžื” ืฉื™ื•ื‘ื™ืœ ืœืžืฆื‘ ื”ื‘ื:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2
ื”ืงื‘ืฆื™ื ื”ืžื‘ื•ืงืฉื™ื ืœื ื ืžืฆืื•

ืงื‘ืฆื™ื ืืœื” ืœื ื ืžืฆืื• ืžื›ื™ื•ื•ืŸ ืฉื”ื ื ืงืจืื™ื ื‘ืฆื•ืจื” ืฉื•ื ื” ื‘ื’ืจืกืื•ืช ืฉื•ื ื•ืช ืฉืœ ื”ื™ื™ืฉื•ื. ื‘ื•ืื• ื ื•ื•ื“ื ืืช ื–ื”:

$ 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, ื”ืžื‘ืงืฉ ื’ืจืกื” ืื—ืช ืฉืœ ืงื‘ืฆื™ื ืกื˜ื˜ื™ื™ื, ื™ื›ื•ืœ ืœื”ื™ืฉืœื— ืขืœ ื™ื“ื™ ืžืื–ืŸ ื”ืขื•ืžืก ืœ-pods ืฉื™ืฉ ืœื”ื ื’ืจืกื” ืื—ืจืช, ืฉื‘ื”ื, ืžืกื™ื‘ื•ืช ื‘ืจื•ืจื•ืช, ืงื‘ืฆื™ื ื›ืืœื” ืื™ื ื ืงื™ื™ืžื™ื. ืœื›ืŸ, ืขืœ ืžื ืช ืฉื”ืืคืœื™ืงืฆื™ื” ืชืขื‘ื•ื“, ืขืœื™ื ื• ืœื”ื’ื“ื™ืจ ื”ื’ื‘ืœื”: "ืื•ืชื” ื’ืจืกื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืฉื™ืจืชื” index.html ืฆืจื™ื›ื” ืœืฉืจืช ื‘ืงืฉื•ืช ืขื•ืงื‘ื•ืช".

ื ื’ื™ืข ืœืฉื ืขื ืื™ื–ื•ืŸ ืขื•ืžืกื™ื ืขืงื‘ื™ ืžื‘ื•ืกืก hash (ืื™ื–ื•ืŸ ืขื•ืžืกื™ Hash ืขืงื‘ื™)... ื‘ืžืงืจื” ื”ื–ื” ื‘ืงืฉื•ืช ืžืื•ืชื• ืœืงื•ื— ื ืฉืœื—ื•ืช ืœืื•ืชื• ืžื•ืคืข ืื—ื•ืจื™, ืฉืขื‘ื•ืจื• ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžืืคื™ื™ืŸ ืžื•ื’ื“ืจ ืžืจืืฉ - ืœื“ื•ื’ืžื”, ื›ื•ืชืจืช HTTP. ืžื™ื•ืฉื ื‘ืืžืฆืขื•ืช DestinationRules.

ื—ื•ืงื™ ื™ืขื“

ืœืื—ืจ VirtualService ืฉืœื— ื‘ืงืฉื” ืœืฉื™ืจื•ืช ื”ืจืฆื•ื™, ื‘ืืžืฆืขื•ืช DestinationRules ื ื•ื›ืœ ืœื”ื’ื“ื™ืจ ืžื“ื™ื ื™ื•ืช ืฉืชื—ื•ืœ ืขืœ ืชืขื‘ื•ืจื” ื”ืžื™ื•ืขื“ืช ืœืžื•ืคืขื™ื ืฉืœ ืฉื™ืจื•ืช ื–ื”:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2
ื ื™ื”ื•ืœ ืชื ื•ืขื” ืขื ืžืฉืื‘ื™ Istio

ืฉื™ื ืœื‘: ื”ื”ืฉืคืขื” ืฉืœ ืžืฉืื‘ื™ Istio ืขืœ ืชืขื‘ื•ืจืช ื”ืจืฉืช ืžื•ืฆื’ืช ื›ืืŸ ื‘ืฆื•ืจื” ืงืœื” ืœื”ื‘ื ื”. ืœื™ืชืจ ื“ื™ื•ืง, ื”ื”ื—ืœื˜ื” ืœืื™ื–ื” ืžื•ืคืข ืœืฉืœื•ื— ืืช ื”ื‘ืงืฉื” ืžืชืงื‘ืœืช ืขืœ ื™ื“ื™ ื”ืฉืœื™ื— ื‘-Ingress Gateway ื”ืžื•ื’ื“ืจ ื‘-CRD.

ืขื Destination Rules, ืื ื• ื™ื›ื•ืœื™ื ืœื”ื’ื“ื™ืจ ืื™ื–ื•ืŸ ืขื•ืžืกื™ื ืœืฉื™ืžื•ืฉ ื‘-hash ืขืงื‘ื™ ื•ืœื”ื‘ื˜ื™ื— ืฉืื•ืชื• ืžื•ืคืข ืฉื™ืจื•ืช ืžื’ื™ื‘ ืœืื•ืชื• ืžืฉืชืžืฉ. ื”ืชืฆื•ืจื” ื”ื‘ืื” ืžืืคืฉืจืช ืœืš ืœื”ืฉื™ื’ ื–ืืช (destinationrule-sa-frontend.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: sa-frontend
spec:
  host: sa-frontend
  trafficPolicy:
    loadBalancer:
      consistentHash:
        httpHeaderName: version   # 1

1 - Hash ื™ื™ื•ื•ืฆืจ ืขืœ ืกืžืš ื”ืชื•ื›ืŸ ืฉืœ ื›ื•ืชืจืช ื”-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

ืฉื™ื ืœื‘: ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืขืจื›ื™ื ืฉื•ื ื™ื ื‘ื›ื•ืชืจืช ื•ืœื‘ื“ื•ืง ืืช ื”ืชื•ืฆืื•ืช ื™ืฉื™ืจื•ืช ื‘ื“ืคื“ืคืŸ, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื”ืจื—ื‘ื” ื–ื• ืœื›ืจื•ื (ืื• ืขื ื–ื” ืขื‘ื•ืจ Firefox - ื‘ืขืจืš. ืชืจื’ื•ื).

ื‘ืื•ืคืŸ ื›ืœืœื™, ืœ-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, ื›ืš ืฉื›ืœ ื”ื‘ืงืฉื•ืช ื™ื—ื•ืœืงื• ื‘ื™ืŸ ื›ืœ ื”ืžื•ืคืขื™ื:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2

... ืื‘ืœ ืื ื—ื ื• ืจื•ืฆื™ื ืฉื‘ืงืฉื•ืช ื™ื™ืฉืœื—ื• ืœืžื•ืคืขื™ v1 ื•ื™ืฉื•ืงืคื• ืœืžื•ืคืขื™ v2:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2

ื ืฉื™ื’ ื–ืืช ื‘ืืžืฆืขื•ืช VirtualService ื‘ืฉื™ืœื•ื‘ ืขื DestinationRule, ื›ืืฉืจ ื”ื›ืœืœื™ื ื™ืงื‘ืขื• ืืช ืงื‘ื•ืฆื•ืช ื”ืžืฉื ื” ื•ื”ืžืกืœื•ืœื™ื ืฉืœ ื”-VirtualService ืœืงื‘ื•ืฆืช ืžืฉื ื” ืกืคืฆื™ืคื™ืช.

ื”ื’ื“ืจืช ืงื‘ื•ืฆื•ืช ืžืฉื ื” ื‘ื›ืœืœื™ ื™ืขื“

ืงื‘ื•ืฆื•ืช ืžืฉื ื” (ืงื‘ื•ืฆื•ืช ืžืฉื ื”) ื ืงื‘ืขื™ื ืขืœ ื™ื“ื™ ื”ืชืฆื•ืจื” ื”ื‘ืื” (sa-logic-subsets-destinationrule.yaml):

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

  1. ืžื ื—ื” (host) ืžื’ื“ื™ืจ ืฉื›ืœืœ ื–ื” ื—ืœ ืจืง ืขืœ ืžืงืจื™ื ืฉื‘ื”ื ื”ืžืกืœื•ืœ ื”ื•ืœืš ืœื›ื™ื•ื•ืŸ ื”ืฉื™ืจื•ืช sa-logic;
  2. ื›ื•ืชืจื•ืช (name) ืขืจื›ื•ืช ืžืฉื ื” ืžืฉืžืฉื•ืช ื‘ืขืช ื ื™ืชื•ื‘ ืœืžื•ืคืขื™ ืžืฉื ื”;
  3. ืชื•ื•ื™ืช (label) ืžื’ื“ื™ืจ ืืช ืฆืžื“ื™ ื”ืžืคืชื—-ืขืจืš ืฉืžื•ืคืขื™ื ื—ื™ื™ื‘ื™ื ืœื”ืชืื™ื ื›ื“ื™ ืœื”ืคื•ืš ืœื—ืœืง ืžืงื‘ื•ืฆืช ื”ืžืฉื ื”.

ื”ื—ืœ ืืช ื”ืชืฆื•ืจื” ืขื ื”ืคืงื•ื“ื” ื”ื‘ืื”:

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created

ื›ืขืช, ืœืื—ืจ ืฉืงื‘ื•ืฆื•ืช ื”ืžืฉื ื” ืžื•ื’ื“ืจื•ืช, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืžืฉื™ืš ื•ืœื”ื’ื“ื™ืจ ืืช ื”-VirtualService ืœื”ื—ื™ืœ ื›ืœืœื™ื ืขืœ ื‘ืงืฉื•ืช ืœ-sa-logic ื›ืš ืฉื”ื:

  1. ืžื ื•ืชื‘ ืœืงื‘ื•ืฆืช ืžืฉื ื” v1,
  2. ืฉื™ืงื•ืฃ ืœืงื‘ื•ืฆืช ืžืฉื ื” v2.

ื”ืžื ื™ืคืกื˜ ื”ื‘ื ืžืืคืฉืจ ืœืš ืœื”ืฉื™ื’ ืืช ื”ืชื•ื›ื ื™ื•ืช ืฉืœืš (sa-logic-subsets-shadowing-vs.yaml):

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

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื”ืชื•ืฆืื•ืช ื‘ื’ืจืืคืื ื”, ืฉื ืชื•ื›ืœื• ืœืจืื•ืช ืฉื”ื’ืจืกื” ืขื ื‘ืื’ื™ื (buggy) ื’ื•ืจื ืœื›ื™ืฉืœื•ืŸ ืฉืœ ~60% ืžื”ื‘ืงืฉื•ืช, ืืš ืืฃ ืื—ื“ ืžื”ื›ืฉืœื™ื ื”ืœืœื• ืœื ืžืฉืคื™ืข ืขืœ ืžืฉืชืžืฉื™ ื”ืงืฆื” ืžื›ื™ื•ื•ืŸ ืฉื”ื ื ืขื ื™ื ืขืœ ื™ื“ื™ ืฉื™ืจื•ืช ืคื•ืขืœ.

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2
ืชื’ื•ื‘ื•ืช ืžื•ืฆืœื—ื•ืช ืฉืœ ื’ืจืกืื•ืช ืฉื•ื ื•ืช ืฉืœ ืฉื™ืจื•ืช sa-logic

ื›ืืŸ ืจืื™ื ื• ืœืจืืฉื•ื ื” ื›ื™ืฆื“ VirtualService ืžื•ื—ืœ ืขืœ ืฉืœื™ื—ื™ ื”ืฉื™ืจื•ืชื™ื ืฉืœื ื•: ืžืชื™ sa-web-app ืžื’ื™ืฉ ื‘ืงืฉื” ืœ sa-logic, ื”ื•ื ืขื•ื‘ืจ ื“ืจืš ื”-sidecar Envoy, ืืฉืจ - ื‘ืืžืฆืขื•ืช VirtualService - ืžื•ื’ื“ืจ ืœื ืชื‘ ืืช ื”ื‘ืงืฉื” ืœืชืช-ื”-v1 ื•ืœืฉืงืฃ ืืช ื”ื‘ืงืฉื” ืœืชืช-ื”-v2 ืฉืœ ื”ืฉื™ืจื•ืช sa-logic.

ืื ื™ ื™ื•ื“ืข, ืื•ืœื™ ืืชื” ื›ื‘ืจ ื—ื•ืฉื‘ ืฉืฉื™ืจื•ืชื™ื ื•ื™ืจื˜ื•ืืœื™ื™ื ื–ื” ืคืฉื•ื˜. ื‘ืกืขื™ืฃ ื”ื‘ื, ื ืจื—ื™ื‘ ืขืœ ื›ืš ื‘ื›ืš ืฉื”ื ื’ื ื‘ืืžืช ืžืขื•ืœื™ื.

ื”ืฉืงื•ืช ืงื ืจื™ื•ืช

Canary Deployment ื”ื•ื ืชื”ืœื™ืš ืฉืœ ื”ืฉืงืช ื’ืจืกื” ื—ื“ืฉื” ืฉืœ ืืคืœื™ืงืฆื™ื” ืœืžืกืคืจ ืงื˜ืŸ ืฉืœ ืžืฉืชืžืฉื™ื. ื”ื•ื ืžืฉืžืฉ ื›ื“ื™ ืœื•ื•ื“ื ืฉืื™ืŸ ื‘ืขื™ื•ืช ื‘ืžื”ื“ื•ืจื” ื•ืจืง ืœืื—ืจ ืžื›ืŸ, ื›ื‘ืจ ื‘ื”ื™ื•ืชื ื‘ื˜ื•ื—ื™ื ื‘ืื™ื›ื•ืชื• (ืฉืœ ื”ื”ืคืฆื”), ืœื”ืคื™ืฅ ืื•ืชื• ืœืžืฉืชืžืฉื™ื ืื—ืจื™ื.ะพืงื”ืœ ื’ื“ื•ืœ ื™ื•ืชืจ.

ื›ื“ื™ ืœื”ื“ื’ื™ื ื”ืฉืงื•ืช ืงื ืจื™ื•ืช, ื ืžืฉื™ืš ืœืขื‘ื•ื“ ืขื ืชืช-ืงื‘ื•ืฆื” buggy ัƒ sa-logic.

ื‘ื•ืื• ืœื ื ื‘ื–ื‘ื– ื–ืžืŸ ืขืœ ื–ื•ื˜ื•ืช ื•ื ืฉืœื— ืžื™ื“ 20% ืžื”ืžืฉืชืžืฉื™ื ืœื’ืจืกื” ืขื ื‘ืื’ื™ื (ื–ื” ื™ื™ื™ืฆื’ ืืช ื”ื”ืคืฆื” ื”ืงื ืจื™ืช ืฉืœื ื•), ื•ืืช 80% ื”ื ื•ืชืจื™ื ืœืฉื™ืจื•ืช ื”ืจื’ื™ืœ. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื”ืฉืชืžืฉ ื‘ืฉื™ืจื•ืช ื”ื•ื•ื™ืจื˜ื•ืืœื™ ื”ื‘ื (sa-logic-subsets-canary-vs.yaml):

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% ืžื‘ืกื™ืก ื”ืžืฉืชืžืฉื™ื. ื ึดืคืœึธื! ื›ืขืช, ื‘ื›ืœ ืžืงืจื” ืฉื‘ื• ืื™ื ื ื• ื‘ื˜ื•ื—ื™ื ื‘ืงื•ื“ ืฉืœื ื• (ื‘ืžื™ืœื™ื ืื—ืจื•ืช - ืชืžื™ื“...), ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืฉื™ืงื•ืฃ ื•ื‘-Canary rollouts.

ืคืกืงื™ ื–ืžืŸ ื•ื ื™ืกื™ื•ื ื•ืช ื—ื•ื–ืจื™ื

ืื‘ืœ ื‘ืื’ื™ื ืœื ืชืžื™ื“ ืžื’ื™ืขื™ื ืœืงื•ื“. ื‘ืจืฉื™ืžื” ืž"8 ืชืคื™ืกื•ืช ืฉื’ื•ื™ื•ืช ืœื’ื‘ื™ ืžื—ืฉื•ื‘ ืžื‘ื•ื–ืจ"ื‘ืžืงื•ื ื”ืจืืฉื•ืŸ ื”ื™ื ื”ืืžื•ื ื” ื”ืžื•ื˜ืขื™ืช ืฉ"ื”ืจืฉืช ืืžื™ื ื”". ื‘ืžืฆื™ืื•ืช ื”ืจืฉืช ืœื ืืžื™ืŸ, ื•ืžืกื™ื‘ื” ื–ื• ืื ื• ื–ืงื•ืงื™ื ืœืคืกืงื™ ื–ืžืŸ (ืคืกืงื™ ื–ืžืŸ) ื•ืžื ืกื” ืฉื•ื‘ (ืžื ืกื” ืฉื•ื‘).

ืœืฆื•ืจืš ื”ื“ื’ืžื” ื ืžืฉื™ืš ืœื”ืฉืชืžืฉ ื‘ืื•ืชื” ื’ืจืกืช ื‘ืขื™ื” sa-logic (buggy), ื•ื ื“ืžื•ืช ืืช ื—ื•ืกืจ ื”ืืžื™ื ื•ืช ืฉืœ ื”ืจืฉืช ืขื ื›ืฉืœื™ื ืืงืจืื™ื™ื.

ืชืŸ ืœืฉื™ืจื•ืช ืฉืœื ื• ืขื ื‘ืื’ื™ื ืกื™ื›ื•ื™ ืฉืœ 1/3 ืฉื™ื™ืงื— ื™ื•ืชืจ ืžื“ื™ ื–ืžืŸ ืœื”ื’ื™ื‘, ืกื™ื›ื•ื™ ืฉืœ 1/3 ืœื”ืกืชื™ื™ื ื‘ืฉื’ื™ืืช ืฉืจืช ืคื ื™ืžื™ืช ื•ืกื™ื›ื•ื™ ืฉืœ 1/3 ืœื”ื—ื–ื™ืจ ืืช ื”ื“ืฃ ื‘ื”ืฆืœื—ื”.

ื›ื“ื™ ืœืžืชืŸ ืืช ื”ื”ืฉืคืขื” ืฉืœ ื‘ืขื™ื•ืช ื›ืืœื” ื•ืœืฉืคืจ ืืช ื”ื—ื™ื™ื ืขื‘ื•ืจ ื”ืžืฉืชืžืฉื™ื, ืื ื• ื™ื›ื•ืœื™ื:

  1. ื”ื•ืกืฃ ืคืกืง ื–ืžืŸ ืื ืœืฉื™ืจื•ืช ืœื•ืงื— ื™ื•ืชืจ ืž-8 ืฉื ื™ื•ืช ืœื”ื’ื™ื‘,
  2. ื ืกื” ืฉื•ื‘ ืื ื”ื‘ืงืฉื” ื ื›ืฉืœืช.

ืœืฆื•ืจืš ื™ื™ืฉื•ื, ื ืฉืชืžืฉ ื‘ื”ื’ื“ืจืช ื”ืžืฉืื‘ ื”ื‘ืื” (sa-logic-retries-timeouts-vs.yaml):

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

  1. ื”ื–ืžืŸ ื”ืงืฆื•ื‘ ืœื‘ืงืฉื” ืžื•ื’ื“ืจ ืœ-8 ืฉื ื™ื•ืช;
  2. ื‘ืงืฉื•ืช ืžื ื•ืกื™ื ืฉื•ื‘ 3 ืคืขืžื™ื;
  3. ื•ื›ืœ ื ื™ืกื™ื•ืŸ ื ื—ืฉื‘ ืœืœื ืžื•ืฆืœื— ืื ื–ืžืŸ ื”ืชื’ื•ื‘ื” ืขื•ืœื” ืขืœ 3 ืฉื ื™ื•ืช.

ืžื“ื•ื‘ืจ ื‘ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืžื›ื™ื•ื•ืŸ ืฉื”ืžืฉืชืžืฉ ืœื ื™ืฆื˜ืจืš ืœื—ื›ื•ืช ื™ื•ืชืจ ืž-8 ืฉื ื™ื•ืช ื•ืื ื• ื ืขืฉื” ืฉืœื•ืฉื” ื ื™ืกื™ื•ื ื•ืช ื—ื“ืฉื™ื ืœืงื‘ืœ ืชื’ื•ื‘ื” ื‘ืžืงืจื” ืฉืœ ืชืงืœื•ืช, ืžื” ืฉืžื’ื“ื™ืœ ืืช ื”ืกื™ื›ื•ื™ ืœืชื’ื•ื‘ื” ืžื•ืฆืœื—ืช.

ื”ื—ืœ ืืช ื”ืชืฆื•ืจื” ื”ืžืขื•ื“ื›ื ืช ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” ื”ื‘ืื”:

$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

ื•ื‘ื“ืงื• ื‘ื’ืจืคื™ื ืฉืœ Grafana ืฉืžืกืคืจ ื”ืชื’ื•ื‘ื•ืช ื”ืžื•ืฆืœื—ื•ืช ื’ื“ืœ ืœืžืขืœื”:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 2
ืฉื™ืคื•ืจื™ื ื‘ืกื˜ื˜ื™ืกื˜ื™ืงื” ืฉืœ ืชื’ื•ื‘ื” ืžื•ืฆืœื—ืช ืœืื—ืจ ื”ื•ืกืคืช ืคืกืงื™ ื–ืžืŸ ื•ื ื™ืกื™ื•ื ื•ืช ื—ื•ื–ืจื™ื

ืœืคื ื™ ืฉื ืขื‘ื•ืจ ืœืกืขื™ืฃ ื”ื‘ื (ืื• ืœื™ืชืจ ื“ื™ื•ืง, ืœื—ืœืง ื”ื‘ื ืฉืœ ื”ืžืืžืจ, ื›ื™ ื‘ื–ื” ืœื ื™ื”ื™ื• ื™ื•ืชืจ ื ื™ืกื•ื™ื™ื ืžืขืฉื™ื™ื - ื‘ืขืจืš ืชืจื’ื•ื), ืœืžื—ื•ืง 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 ืžืงื•ืœืงืœ ื•ืฉื™ืจื•ืช ืื—ืจ (ืœืงื•ื— ืฉืœ ืฉื™ืจื•ืช ื‘') ืžื’ื™ืฉ ื‘ืงืฉื” ืœืฉื™ืจื•ืช ื‘', ืžื” ืฉื’ื•ืจื ืœื• ืœืžืฆื•ืช ืืช ืžืื’ืจ ื”ืฉืจืฉื•ืจื™ื ืฉืœื• ื•ืœื ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœืชืช ืฉื™ืจื•ืช ื‘ื‘ืงืฉื•ืช ืื—ืจื•ืช (ื’ื ืื ื”ืŸ ืœื ืžืฉื™ืจื•ืช ื‘'). (ื”ืขืจื”: ื ื™ืชืŸ ืœืžืฆื•ื ืชื™ืื•ืจ ืžืคื•ืจื˜ ื™ื•ืชืจ ืฉืœ ื”ืชื‘ื ื™ืช, ืœืžืฉืœ, ื›ืืŸ.)

ืืฉืžื™ื˜ ืืช ืคืจื˜ื™ ื”ื™ื™ืฉื•ื ืฉืœ ื“ืคื•ืกื™ื ืืœื” ืžื›ื™ื•ื•ืŸ ืฉืงืœ ืœืžืฆื•ื ืื•ืชื ืชื™ืขื•ื“ ืจืฉืžื™, ื•ืื ื™ ื’ื ืžืื•ื“ ืจื•ืฆื” ืœื”ืจืื•ืช ืื™ืžื•ืช ื•ื”ืจืฉืื”, ืขืœื™ื”ื ื ื“ื•ืŸ ื‘ื—ืœืง ื”ื‘ื ืฉืœ ื”ืžืืžืจ.

ื .ื‘ ืžื”ืžืชืจื’ื

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”