Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

Ke hoʻohana nei iā Istio+Kiali e hoʻomaka a nānā i kahi hoʻolaha Canary

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

ʻatikala ma kēia moʻo

  1. Hoʻokomo ʻia ʻo Canary ma Kubernetes #1: Gitlab CI
  2. Hoʻokomo ʻia ʻo Canary ma Kubernetes #2: Argo Rollouts
  3. (Keia 'atikala)
  4. Hoʻohana ʻo Canary me ka hoʻohana ʻana iā Jenkins-X Istio Flagger

Hoʻokomo Canary

Manaʻo mākou e heluhelu ʻoe ʻāpana mua, kahi i wehewehe pōkole ai mākou i ke ʻano o nā hoʻolaha Canary a hōʻike i ka hoʻokō ʻana iā lākou me ka hoʻohana ʻana i nā kumuwaiwai Kubernetes maʻamau.

Istio

A ke manaʻo nei mākou ma ka heluhelu ʻana i kēia ʻatikala ua ʻike ʻoe i ka mea ʻo Istio. Inā ʻaʻole, a laila hiki iā ʻoe ke heluhelu e pili ana maanei.

Noi no na hoao

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

Loaʻa i kēlā me kēia pod nā pahu ʻelua: kā mākou noi a me istio-proxy.

E hoʻohana mākou i kahi noi hoʻāʻo maʻalahi me ka frontend-nginx a me backend python pods. E hoʻihoʻi hou ka nginx pod i kēlā me kēia noi i ka backend pod a hana ma ke ʻano he koho. Hiki ke loaʻa nā kikoʻī ma kēia mau yaml:

Ke holo nei i ka palapala ho'āʻo iā ʻoe iho

Inā makemake ʻoe e hahai i kaʻu hiʻohiʻona a hoʻohana i kēia noi hoʻāʻo iā ʻoe iho, ʻike papahana readme.

Hoʻokomo mua

Ke hoʻomaka nei mākou i ka Deployment mua, ʻike mākou he 2 mau pahu wale nō nā pods o kā mākou noi, ʻo ia hoʻi, ke hoʻokō ʻia nei ʻo Istio sidecar:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

A ʻike pū mākou iā Istio Gateway Loadbalancer ma ka inoa inoa istio-system:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

Hanau kaʻa

E hoʻohana mākou i ka IP aʻe e hana i nā kaʻa e loaʻa i nā pods frontend a hoʻouna ʻia i nā pods hope:

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

E hoʻohui pū mākou frontend.istio-test i kā mākou waihona hoʻokipa.

Nānā Mesh ma o Kiali

Hoʻokomo mākou i ka noi hoʻāʻo a me Istio me Tracing, Grafana, Prometheus a me Kiali (e ʻike i lalo no nā kikoʻī). papahana readme). No laila hiki iā mākou ke hoʻohana iā Kiali ma:

istioctl dashboard kiali # admin:admin

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

ʻIke ʻo Kiali i nā kaʻa o kēia manawa ma o Mesh

E like me kā mākou e ʻike ai, hele ka 100% o ke kaʻa i ka lawelawe frontend, a laila i nā pods frontend me ka lepili v1, no ka mea ke hoʻohana nei mākou i kahi proxy nginx maʻalahi e hoʻihoʻi hou i nā noi i ka lawelawe backend, a laila e hoʻihoʻi hou iā lākou i nā pods backend. me ka lepili v1.

Hana maikaʻi ʻo Kiali me Istio a hāʻawi i kahi hopena hoʻoheheʻe Mesh pahu. Nui wale.

Hoʻokomo Canary

Ua loaʻa i kā mākou backend ʻelua mau hoʻolālā k8, hoʻokahi no v1 a hoʻokahi no v2. I kēia manawa pono mākou e haʻi iā Istio e hoʻouna i kekahi hapa o nā noi i v2.

Ka Papa 1: 10%

A ʻo nā mea a pau e pono ai mākou e hoʻoponopono i ke kaumaha o ka VirtualService i loko isio.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

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

ʻIke mākou ua hoʻohuli hou ʻia ka 10% o nā noi i v2.

Ka Papa 2: 50%

A i kēia manawa ua lawa ka hoʻonui ʻana iā 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

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

Ka Papa 3: 100%

I kēia manawa hiki ke noʻonoʻo ʻia ka hoʻopau ʻana o Canary a hoʻohuli ʻia nā kaʻa āpau i v2:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

E ho'āʻo lima iā Canary

E ʻōlelo mākou e hoʻouna mākou i 2% o nā noi āpau i ka v10 backend. He aha inā makemake mākou e hoʻāʻo lima iā v2 e hōʻoia i ka holo ʻana o nā mea āpau e like me kā mākou e manaʻo ai?

Hiki iā mākou ke hoʻohui i kahi lula pili kūikawā e pili ana i nā poʻomanaʻo 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

I kēia manawa me ka curl hiki iā mākou ke koi i kahi noi v2 ma ka hoʻouna ʻana i ke poʻo:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

E alakaʻi ʻia nā noi me ke poʻo ʻole e ka ratio 1/10:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

ʻO Canary no nā mana hilinaʻi ʻelua

I kēia manawa, e noʻonoʻo mākou i ke koho i loaʻa iā mākou ka mana v2 no ka frontend a me ka hope. No nā mea ʻelua, ua kuhikuhi mākou he 10% o ke kaʻa e hele i v2:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

ʻIke mākou i kēlā frontend v1 a me v2 ʻelua i mua o ka neʻe ʻana ma ka ratio o 1/10 i hope v1 a me v2.

He aha inā inā pono mākou e hoʻouna i nā kaʻa mai frontend-v2 wale nō i backend-v2 no ka mea ʻaʻole kūpono ia me v1? No ka hana ʻana i kēia, e hoʻonoho mākou i kahi ratio 1/10 no ka frontend, nāna e hoʻokele i ka mea e hele ai i ka backend-v2 me ka hoʻohana ʻana i ke kūkākūkā. 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

ʻO ka hopena, loaʻa iā mākou ka mea e pono ai mākou:

Hoʻokomo ʻia ʻo Canary ma Kubernetes #3: Istio

Nā ʻokoʻa mai ka manual Canary approach

В ʻO ka hapa mua Ua hana lima mākou i ka hoʻolaha ʻana o Canary, me ka hoʻohana ʻana i ʻelua mau hoʻolālā k8. Ma laila mākou i hoʻomalu ai i ka lakio o nā noi ma ka hoʻololi ʻana i ka helu o nā replicas. Ke hana nei kēia ala, akā he mau drawbacks koʻikoʻi.

Hiki iā Istio ke hoʻoholo i ka ratio o nā noi me ka nānā ʻole i ka nui o nā replicas. ʻO kēia ke ʻano, no ka laʻana, hiki iā mākou ke hoʻohana i nā HPA (Horizontal Pod Autoscalers) a ʻaʻole pono e hoʻonohonoho ʻia e like me ke kūlana o kēia manawa o ka deployment Canary.

ʻO ka hopena

Hana maikaʻi ʻo Istio a hoʻohana pū me Kiali i kahi hui ikaika loa. ʻO ka mea aʻe ma kaʻu papa inoa o nā mea hoihoi e hui pū ana iā Spinnaker me Istio no ka automation a me nā analytics Canary.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka