αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Istio+Kiali αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž˜αžΎαž›αžƒαžΎαž‰αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž’αžαŸ’αžαž”αž‘αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡αŸ”

  1. αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 1: Gitlab CI
  2. αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 2: αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ Argo
  3. (αž’αžαŸ’αžαž”αž‘β€‹αž“αŸαŸ‡)
  4. αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αžŠαŸ„αž™αž”αŸ’αžšαžΎ Jenkins-X Istio Flagger

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary

αž™αžΎαž„αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αž’αžΆαž“ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž–αž“αŸ’αž™αž›αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αž›αžΈαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž’αž“αž»αžœαžαŸ’αžαž–αž½αž€αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αž“αž’αžΆαž“ Kubernetes αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ”

ធ៊ីស៊ីធូ

αž αžΎαž™αž™αžΎαž„αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαžŠαŸ„αž™αž€αžΆαžšαž’αžΆαž“αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž’αŸ’αž“αž€αžŠαžΉαž„αžšαž½αž…αž αžΎαž™αžαžΆ Istio αž‡αžΆαž’αŸ’αžœαžΈαŸ” αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸαž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž’αŸ†αž–αžΈαžœαžΆαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž–αžΆαž€αŸ’αž™αžŸαŸ’αž“αžΎαžŸαž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž•αžαž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αž’αž»αž„αž–αžΈαžšαŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αž·αž„ istio-αž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈαŸ”

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž‡αžΆαž˜αž½αž™ frontend-nginx αž“αž·αž„ backend python pods αŸ” αž•αž nginx αž“αžΉαž„αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαžŸαŸ†αžŽαžΎαž“αžΈαž˜αž½αž™αŸ—αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈαŸ” αž–αŸαžαŸŒαž˜αžΆαž“β€‹αž›αž˜αŸ’αž’αž·αžβ€‹αž’αžΆαž…β€‹αžšαž€β€‹αž”αžΆαž“β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž™αŸ‰αžΆαž˜β€‹αžŠαžΌαž…β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜αŸ–

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž’αŸ’αžœαžΎαžαžΆαž˜αž‚αŸ†αžšαžΌαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž αžΎαž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„αž“αŸαŸ‡αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αžŸαžΌαž˜αž˜αžΎαž› αž‚αž˜αŸ’αžšαŸ„αž„αž’αžΆαž“αžαŸ’αž‰αž»αŸ†.

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ†αž”αžΌαž„

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αžƒαžΎαž‰αžαžΆ pods αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž˜αžΆαž“αžαŸ‚ 2 containers αž“αŸ„αŸ‡αž‚αžΊ Istio sidecar αž‘αžΎαž”αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž αžΎαž™αž™αžΎαž„αž€αŸαžƒαžΎαž‰ Istio Gateway Loadbalancer αž“αŸ…αž€αŸ’αž“αž»αž„ namespace istio-system:

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž…αžšαžΆαž…αžšαžŽαŸ

αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž”αŸ’αžšαžΎ IP αžαžΆαž„αž€αŸ’αžšαŸ„αž˜β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž…αžšαžΆαž…αžšαžŽαŸβ€‹αžŠαŸ‚αž›β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‘αž‘αž½αž›β€‹αžŠαŸ„αž™ frontend pods αž“αž·αž„β€‹αž”αž‰αŸ’αž‡αžΌαž“β€‹αž”αž“αŸ’αžβ€‹αž‘αŸ… pods αžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ–

while true; do curl -s --resolve 'frontend.istio-test:80:35.242.202.152' frontend.istio-test; sleep 0.1; done

αž™αžΎαž„αž€αŸαž“αžΉαž„αž”αž“αŸ’αžαŸ‚αž˜αž•αž„αžŠαŸ‚αžšαŸ” frontend.istio-test αž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžš hosts αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž˜αžΎαž› Mesh αžαžΆαž˜αžšαž™αŸˆ Kiali

αž™αžΎαž„αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„ Istio αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„ Tracing, Grafana, Prometheus αž“αž·αž„ Kiali (αžŸαžΌαž˜αž˜αžΎαž›αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αž)αŸ” αž‚αž˜αŸ’αžšαŸ„αž„αž’αžΆαž“αžαŸ’αž‰αž»αŸ†) αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎ Kiali αžαžΆαž˜αžšαž™αŸˆαŸ–

istioctl dashboard kiali # admin:admin

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

Kiali αž˜αžΎαž›αžƒαžΎαž‰αž…αžšαžΆαž…αžšαžŽαŸαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαžΆαž˜αžšαž™αŸˆ Mesh

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰ 100% αž“αŸƒαž…αžšαžΆαž…αžšαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αž αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‘αŸ…αž€αžΆαž“αŸ‹αž•αžαž•αžαžαžΆαž„αž˜αž»αžαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αž›αžΆαž€ v1 αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΌαž€αžŸαŸŠαžΈ nginx αžŸαžΆαž˜αž‰αŸ’αž‰αžŠαŸ‚αž›αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ αžŠαŸ‚αž›αž“αžΆαŸ†αž–αž½αž€αž‚αŸαž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ” αž‡αžΆαž˜αž½αž™αžŸαŸ’αž›αžΆαž€ v1.

Kiali αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž›αŸ’αž’αž‡αžΆαž˜αž½αž™ Istio αž“αž·αž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž„αŸ’αž αžΆαž‰ Mesh αž”αŸ’αžšαž’αž”αŸ‹αŸ” αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary

αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹αž™αžΎαž„αž˜αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ k8s αž–αžΈαžšαžšαž½αž…αž αžΎαž™ αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ v1 αž“αž·αž„αž˜αž½αž™αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ v2αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž”αŸ‹ Istio αž±αŸ’αž™αž”αž‰αŸ’αž‡αžΌαž“αž—αžΆαž‚αžšαž™αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαžŸαŸ†αžŽαžΎαž‘αŸ… v2.

αž‡αŸ†αž αžΆαž“αž‘αžΈ 1: 10%

αž αžΎαž™αž’αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαž‘αž˜αŸ’αž„αž“αŸ‹αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ VirtualService istio.yaml:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
  - match:
    - {}
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 90
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 10

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž™αžΎαž„αžƒαžΎαž‰αžαžΆ 10% αž“αŸƒαžŸαŸ†αžŽαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ… v2.

αž‡αŸ†αž αžΆαž“αž‘αžΈ 2: 50%

αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αžœαžΆαžŠαž›αŸ‹ 50%αŸ–

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
...
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 50
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 50

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž‡αŸ†αž αžΆαž“αž‘αžΈ 3: 100%

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž–αŸαž‰αž›αŸαž‰ αž αžΎαž™αž…αžšαžΆαž…αžšαžŽαŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαžΌαžšαž‘αž·αžŸαž‘αŸ… v2αŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αžŸαžΆαž€αž›αŸ’αž”αž„ Canary αžŠαŸ„αž™αžŠαŸƒ

αž§αž”αž˜αžΆαžαžΆαž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž•αŸ’αž‰αžΎ 2% αž“αŸƒαžŸαŸ†αžŽαžΎαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ v10 αŸ” αž…αž»αŸ‡αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„ v2 αžŠαŸ„αž™αžŠαŸƒ αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αžšαŸ†αž–αžΉαž„αž‘αž»αž€?

αž™αžΎαž„αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž…αŸ’αž”αžΆαž”αŸ‹αž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αž–αž·αžŸαŸαžŸαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αž‹αž˜αž€αžαžΆ HTTPαŸ–

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
  - match:
    - headers:
        canary:
          exact: "canary-tester"
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 100
  - match:
    - {}
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 90
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 10

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎ curl αž™αžΎαž„αž’αžΆαž…αž”αž„αŸ’αžαŸ†αžŸαŸ†αžŽαžΎ v2 αžŠαŸ„αž™αž•αŸ’αž‰αžΎαž”αž‹αž˜αž€αžαžΆ:

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αžŸαŸ†αžŽαžΎαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž”αž‹αž˜αž€αžαžΆαž“αžΉαž„αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αžšαž»αž‰αžŠαŸ„αž™αžŸαž˜αžΆαž˜αžΆαžαŸ’αžš 1/10αŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

Canary αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž–αžΈαžš

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž–αž·αž…αžΆαžšαžŽαžΆαž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸ‚αž›αž™αžΎαž„αž˜αžΆαž“αž€αŸ†αžŽαŸ‚ v2 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαž“αž·αž„αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž–αžΈαžš αž™αžΎαž„αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαžΆ 10% αž“αŸƒαž…αžšαžΆαž…αžšαžŽαŸαž‚αž½αžšαžαŸ‚αž‘αŸ… v2αŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž™αžΎαž„αžƒαžΎαž‰αžαžΆ frontend v1 αž“αž·αž„ v2 αž‘αžΆαŸ†αž„αž–αžΈαžšαž…αžšαžΆαž…αžšαž‘αŸ…αž˜αž»αžαž€αŸ’αž“αž»αž„αžŸαž˜αžΆαž˜αžΆαžαŸ’αžšαž“αŸƒ 1/10 αž‘αŸ… backend v1 αž“αž·αž„ v2 αŸ”

αž…αž»αŸ‡αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž…αžšαžΆαž…αžšαžŽαŸαž–αžΈ frontend-v2 αž‘αŸ… backend-v2 αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ v1? αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžŸαž˜αžΆαž˜αžΆαžαŸ’αžš 1/10 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αž αžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž…αžšαžΆαž…αžšαžŽαŸαž‘αž‘αž½αž›αž”αžΆαž“αž‘αŸ…αž€αžΆαž“αŸ‹ backend-v2 αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž…αžšαž…αžΆ sourceLabels :

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
...
  - match:
    - sourceLabels:
        app: frontend
        version: v2
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 100

αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes # 3: Istio

αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž Canary αžŠαŸ„αž™αžŠαŸƒ

Π’ αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αŸ” αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αžŠαŸ„αž™αžŠαŸƒ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ k8s αž–αžΈαžšαž•αž„αžŠαŸ‚αžšαŸ” αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαž˜αžΆαž˜αžΆαžαŸ’αžšαž“αŸƒαžŸαŸ†αžŽαžΎαžŠαŸ„αž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž™αŸ‰αžΆαž„αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαŸ”

Istio αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžŸαž˜αžΆαž˜αžΆαžαŸ’αžšαž“αŸƒαžŸαŸ†αžŽαžΎαžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαž–αžΈαž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎ HPAs (Horizontal Pod Autoscalers) αž αžΎαž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαž˜αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Canary αž“αŸ„αŸ‡αž‘αŸαŸ”

αž›αž‘αŸ’αž’αž•αž›

Istio αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž›αŸ’αž’αžŽαžΆαžŸαŸ‹ αž αžΎαž™αž€αžΆαžšαž”αŸ’αžšαžΎαžœαžΆαžšαž½αž˜αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ Kiali αž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŠαŸαž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž…αŸ†αžŽαžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Spinnaker αž‡αžΆαž˜αž½αž™ Istio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜ αž“αž·αž„ Canary analytics αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹