Penyebaran Canary ing Kubernetes # 3: Istio

Nggunakake Istio+Kiali kanggo miwiti lan nggambarake penyebaran Canary

Penyebaran Canary ing Kubernetes # 3: Istio

Artikel ing seri iki

  1. Penyebaran Canary ing Kubernetes # 1: Gitlab CI
  2. Penyebaran Canary ing Kubernetes # 2: Argo Rollouts
  3. (Wacana iki)
  4. Penyebaran Canary nggunakake Jenkins-X Istio Flagger

Penyebaran Canary

Muga-muga sampeyan maca pérangan pisanan, ing ngendi kita nerangake kanthi ringkes apa penyebaran Canary lan nuduhake carane ngleksanakake nggunakake sumber daya Kubernetes standar.

Istio

Lan kita nganggep yen maca artikel iki sampeyan wis ngerti apa Istio. Yen ora, sampeyan bisa maca babagan iki kene.

Aplikasi kanggo tes

Penyebaran Canary ing Kubernetes # 3: Istio

Saben pod ngemot rong wadhah: aplikasi kita lan istio-proxy.

Kita bakal nggunakake aplikasi test prasaja karo frontend-nginx lan backend python pods. Pod nginx mung bakal ngarahake saben panjalukan menyang pod backend lan bisa digunakake minangka proxy. Rincian bisa ditemokake ing yamls ing ngisor iki:

Mbukak aplikasi test dhewe

Yen sampeyan pengin ngetutake conto lan nggunakake aplikasi tes iki dhewe, waca proyek maca.

Panyebaran Awal

Nalika kita miwiti Deployment pisanan, kita weruh yen pods aplikasi kita mung duwe 2 wadhah, yaiku, sidecar Istio lagi wae dileksanakake:

Penyebaran Canary ing Kubernetes # 3: Istio

Lan kita uga ndeleng Istio Gateway Loadbalancer ing namespace istio-system:

Penyebaran Canary ing Kubernetes # 3: Istio

Generasi lalu lintas

Kita bakal nggunakake IP ing ngisor iki kanggo ngasilake lalu lintas sing bakal ditampa dening pod frontend lan diterusake menyang pod backend:

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

Kita uga bakal nambah frontend.istio-test menyang file host kita.

Ndeleng Mesh liwat Kiali

We nginstal aplikasi test lan Istio bebarengan karo Tracing, Grafana, Prometheus lan Kiali (ndeleng ngisor kanggo rincian). proyek maca). Mula kita bisa nggunakake Kiali liwat:

istioctl dashboard kiali # admin:admin

Penyebaran Canary ing Kubernetes # 3: Istio

Kiali nggambarake lalu lintas saiki liwat Mesh

Kaya sing bisa dideleng, 100% lalu lintas menyang layanan frontend, banjur menyang pod frontend kanthi label v1, amarga kita nggunakake proxy nginx prasaja sing ngarahake panjalukan menyang layanan backend, sing banjur ngarahake menyang pods backend. kanthi label v1.

Kiali kerjane apik karo Istio lan menehi solusi rendering Mesh kothak. Apik banget.

Penyebaran Canary

Backend kita wis duwe rong panyebaran k8, siji kanggo v1 lan siji kanggo v2. Saiki kita mung kudu ngandhani Istio supaya nerusake persentase panjaluk tartamtu menyang v2.

Langkah 1: 10%

Lan kabeh sing kudu kita lakoni yaiku nyetel bobot saka VirtualService ing 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

Penyebaran Canary ing Kubernetes # 3: Istio

Kita weruh manawa 10% panjalukan dialihake menyang v2.

Langkah 2: 50%

Lan saiki cukup kanggo nambah nganti 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

Penyebaran Canary ing Kubernetes # 3: Istio

Langkah 3: 100%

Saiki penyebaran Canary bisa dianggep lengkap lan kabeh lalu lintas dialihake menyang v2:

Penyebaran Canary ing Kubernetes # 3: Istio

Nguji Canary kanthi manual

Ayo kita saiki ngirim 2% kabeh panjalukan menyang v10 backend. Apa yen kita pengin nyoba v2 kanthi manual kanggo mesthekake yen kabeh bisa kaya sing dikarepake?

Kita bisa nambah aturan sing cocog khusus adhedhasar header 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

Saiki nggunakake curl kita bisa meksa panjalukan v2 kanthi ngirim header:

Penyebaran Canary ing Kubernetes # 3: Istio

Panjaluk tanpa header isih bakal didorong dening rasio 1/10:

Penyebaran Canary ing Kubernetes # 3: Istio

Canary kanggo rong versi gumantung

Saiki kita bakal nimbang pilihan ing ngendi kita duwe versi v2 kanggo frontend lan backend. Kanggo loro, kita nemtokake manawa 10% lalu lintas kudu menyang v2:

Penyebaran Canary ing Kubernetes # 3: Istio

Kita weruh manawa frontend v1 lan v2 loro lalu lintas maju kanthi rasio 1/10 kanggo backend v1 lan v2.

Apa yen kita kudu nerusake lalu lintas saka frontend-v2 mung menyang backend-v2 amarga ora kompatibel karo v1? Kanggo nindakake iki, kita bakal nyetel rasio 1/10 kanggo frontend, sing ngontrol lalu lintas menyang backend-v2 nggunakake negosiasi. 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

Akibaté, kita entuk apa sing kita butuhake:

Penyebaran Canary ing Kubernetes # 3: Istio

Bedane saka pendekatan Canary manual

В sisih pisanan Kita nindakake penyebaran Canary kanthi manual, uga nggunakake rong panyebaran k8. Ing kana kita ngontrol rasio panjalukan kanthi ngganti jumlah replika. Pendekatan iki bisa digunakake, nanging duwe cacat serius.

Istio ndadekake iku bisa kanggo nemtokake rasio panjalukan preduli saka nomer réplika. Iki tegese, contone, kita bisa nggunakake HPAs (Horizontal Pod Autoscalers) lan ora perlu dikonfigurasi miturut kahanan saiki penyebaran Canary.

Asile

Istio dianggo apik lan nggunakake bebarengan karo Kiali ndadekake kombinasi banget kuat. Sabanjure ing dhaptar kapentinganku yaiku nggabungake Spinnaker karo Istio kanggo otomatisasi lan analytics Canary.

Source: www.habr.com

Add a comment