Canary Deployment sa Kubernetes #3: Istio

Gigamit ang Istio+Kiali aron maglansad ug mahanduraw ang usa ka pag-deploy sa Canary

Canary Deployment sa Kubernetes #3: Istio

Mga artikulo niini nga serye

  1. Canary Deployment sa Kubernetes #1: Gitlab CI
  2. Canary Deployment sa Kubernetes #2: Argo Rollouts
  3. (Kini nga artikulo)
  4. Canary Deployment gamit ang Jenkins-X Istio Flagger

Pag-deploy sa Canary

Kami nanghinaut nga imong basahon unang bahin, diin among gipatin-aw sa daklit kung unsa ang mga pag-deploy sa Canary ug gipakita kung giunsa kini ipatuman gamit ang sukaranan nga mga kapanguhaan sa Kubernetes.

Istio

Ug among gihunahuna nga pinaagi sa pagbasa niini nga artikulo nahibal-an na nimo kung unsa ang Istio. Kung dili, nan mahimo nimong basahon ang bahin niini dinhi.

Aplikasyon alang sa mga pagsulay

Canary Deployment sa Kubernetes #3: Istio

Ang matag pod adunay duha ka sudlanan: among aplikasyon ug istio-proxy.

Maggamit kami usa ka yano nga aplikasyon sa pagsulay nga adunay frontend-nginx ug backend python pods. Ang nginx pod mag-redirect lang sa matag hangyo ngadto sa backend pod ug magtrabaho isip proxy. Ang mga detalye makita sa mga musunod nga yaml:

Pagpadagan sa aplikasyon sa pagsulay sa imong kaugalingon

Kung gusto nimo sundon ang akong panig-ingnan ug gamiton kini nga aplikasyon sa pagsulay sa imong kaugalingon, tan-awa proyekto readme.

Inisyal nga Deployment

Sa dihang gilusad namo ang unang Deployment, among nakita nga ang mga pod sa among aplikasyon adunay 2 lang ka container, nga mao, ang Istio sidecar bag-o lang gipatuman:

Canary Deployment sa Kubernetes #3: Istio

Ug makita usab namo ang Istio Gateway Loadbalancer sa namespace istio-system:

Canary Deployment sa Kubernetes #3: Istio

Pagmugna sa trapiko

Gamiton namo ang mosunod nga IP aron makamugna og trapiko nga madawat sa mga frontend pod ug ipasa ngadto sa mga backend pod:

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

Dugangan usab namo frontend.istio-test sa among host file.

Tan-awa ang Mesh pinaagi sa Kiali

Gi-install namon ang aplikasyon sa pagsulay ug Istio kauban ang Pagsubay, Grafana, Prometheus ug Kiali (tan-awa sa ubos alang sa mga detalye). proyekto readme). Busa mahimo natong gamiton ang Kiali pinaagi sa:

istioctl dashboard kiali # admin:admin

Canary Deployment sa Kubernetes #3: Istio

Gitan-aw ni Kiali ang kasamtangan nga trapiko pinaagi sa Mesh

Sama sa atong makita, ang 100% sa trapiko moadto sa frontend nga serbisyo, dayon ngadto sa frontend pods nga adunay label nga v1, tungod kay naggamit kami og yano nga nginx proxy nga nag-redirect sa mga hangyo ngadto sa backend nga serbisyo, nga sa baylo nag-redirect kanila ngadto sa backend pods. nga adunay label v1.

Maayo ang pagtrabaho ni Kiali sa Istio ug naghatag usa ka boxed Mesh rendering solution. Lang dakung.

Pag-deploy sa Canary

Ang among backend aduna nay duha ka k8s deployment, usa para sa v1 ug usa para sa v2. Karon kinahanglan lang naton isulti si Istio nga ipasa ang usa ka piho nga porsyento sa mga hangyo sa v2.

Lakang 1: 10%

Ug ang kinahanglan namong buhaton mao ang pag-adjust sa gibug-aton sa VirtualService sa 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 Deployment sa Kubernetes #3: Istio

Nakita namon nga ang 10% sa mga hangyo gi-redirect sa v2.

Lakang 2: 50%

Ug karon igo na nga madugangan kini sa 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 Deployment sa Kubernetes #3: Istio

Lakang 3: 100%

Karon ang pag-deploy sa Canary mahimong makonsiderar nga kompleto ug ang tanan nga trapiko gi-redirect sa v2:

Canary Deployment sa Kubernetes #3: Istio

Pagsulay sa Canary nga mano-mano

Ingnon ta nga nagpadala kami karon og 2% sa tanan nga mga hangyo sa v10 backend. Unsa kaha kung gusto namon nga mano-mano ang pagsulay sa v2 aron masiguro nga ang tanan molihok sama sa among gipaabut?

Mahimo kaming makadugang usa ka espesyal nga lagda sa pagpares base sa mga ulohan sa 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

Karon gamit ang curl mahimo natong pugson ang usa ka v2 nga hangyo pinaagi sa pagpadala sa header:

Canary Deployment sa Kubernetes #3: Istio

Ang mga hangyo nga wala’y usa ka header gimaneho gihapon sa ratio nga 1/10:

Canary Deployment sa Kubernetes #3: Istio

Canary alang sa duha ka nagsalig nga bersyon

Karon atong tagdon ang kapilian diin kita adunay bersyon v2 alang sa frontend ug backend. Alang sa duha, among gipiho nga ang 10% sa trapiko kinahanglan moadto sa v2:

Canary Deployment sa Kubernetes #3: Istio

Nakita namon nga ang frontend v1 ug v2 pareho nga nagpasa sa trapiko sa ratio nga 1/10 sa backend v1 ug v2.

Unsa kaha kung kinahanglan namon nga ipasa ang trapiko gikan sa frontend-v2 hangtod sa backend-v2 tungod kay dili kini katugma sa v1? Aron mahimo kini, magbutang kami usa ka ratio nga 1/10 alang sa frontend, nga nagkontrol kung unsa ang makuha sa trapiko sa backend-v2 gamit ang negosasyon. 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

Ingon usa ka sangputanan, makuha namon ang among kinahanglan:

Canary Deployment sa Kubernetes #3: Istio

Mga kalainan gikan sa manwal nga Canary approach

Π’ ang una nga bahin Gipahigayon namo ang Canary deployment nga mano-mano, gamit usab ang duha ka k8s deployment. Didto among gikontrol ang ratio sa mga hangyo pinaagi sa pagbag-o sa gidaghanon sa mga replika. Kini nga pamaagi molihok, apan adunay seryoso nga mga kakulangan.

Gipaposible sa Istio ang pagtino sa ratio sa mga hangyo bisan unsa pa ang gidaghanon sa mga replika. Kini nagpasabot, pananglitan, nga kita makagamit sa HPAs (Horizontal Pod Autoscalers) ug dili kinahanglan nga i-configure sumala sa kasamtangan nga kahimtang sa Canary deployment.

Ang resulta

Maayo ang pagtrabaho ni Istio ug ang paggamit niini kauban ang Kiali naghimo alang sa usa ka kusgan kaayo nga kombinasyon. Sunod sa akong listahan sa mga interes mao ang paghiusa sa Spinnaker uban sa Istio alang sa automation ug Canary analytics.

Source: www.habr.com

Idugang sa usa ka comment