Canary Deployment Kubernetes #3: Istio

Istio+Kiali izmantoÅ”ana kanāru izvietoÅ”anas palaiÅ”anai un vizualizēŔanai

Canary Deployment Kubernetes #3: Istio

Å Ä« cikla raksti

  1. Canary Deployment Kubernetes #1: Gitlab CI
  2. Kanāru izvietoŔana Kubernetes #2: Argo Rollouts
  3. (Ŕis raksts)
  4. Kanāru izvietoŔana, izmantojot Jenkins-X Istio Flagger

Kanāru izvietoŔana

Ceram, ka jūs lasījāt pirmo daļu, kurā mēs īsi izskaidrojām, kas ir kanāru izvietojumi un parādījām, kā to īstenot ar standarta Kubernetes resursiem.

Istio

Un mēs pieņemam, ka, lasot Å”o rakstu, jÅ«s jau zināt, kas ir Istio. Ja nē, varat par to izlasÄ«t Å”eit.

TestēŔanas lietotne

Canary Deployment Kubernetes #3: Istio

Katrs pods satur divus konteinerus: mūsu lietotne un istio-proxy.

Mēs izmantosim vienkārÅ”u testēŔanas lietotni ar pods frontend-nginx un backend uz python. Pods ar nginx vienkārÅ”i pāradresēs katru pieprasÄ«jumu uz podu ar backend un darbosies kā proxy. SÄ«kāku informāciju varat skatÄ«t nākamajos yaml failos:

TestēŔanas lietotnes palaiÅ”ana patstāvÄ«gi

Ja vēlaties sekot manam piemēram un izmantot Å”o testēŔanas lietotni patstāvÄ«gi, skatiet projekta lasāmviela.

Sākotnējā izvietoÅ”ana

Palaižot pirmo izvietoÅ”anu, mēs redzam, ka mÅ«su lietotnes podiem ir tikai 2 konteineri, tātad Istio sidecar vēl tikai tiek iekļauts:

Canary Deployment Kubernetes #3: Istio

Un mēs arī redzam Istio Gateway Loadbalancer telpā istio-system:

Canary Deployment Kubernetes #3: Istio

Satiksmes izveide

Mēs izmantosim nākamo IP, lai ģenerētu satiksmi, kuru frontend podi pieņems un novirzīs uz backend podiem:

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

Mēs arī pievienosim frontend.istio-test mūsu hosts failam.

Mreža skatīŔana caur Kiali

Mēs esam uzstādÄ«juÅ”i testēŔanas lietotni un Istio kopā ar Tracing, Grafana, Prometheus un Kiali (sÄ«kāk skat. projekta lasāmviela). Tāpēc mēs varam izmantot Kiali caur:

istioctl dashboard kiali # admin:admin

Canary Deployment Kubernetes #3: Istio

Kiali vizualizē paÅ”reizējo satiksmi caur Mrežu

Kā redzam, 100% satiksmes nonāk frontend pakalpojumā, pēc tam uz frontend podu ar etiketēm v1, jo mēs izmantojam vienkārÅ”u nginx proxy, kas novirza pieprasÄ«jumus uz backend pakalpojumu, kas savukārt novirza tos uz backend podiem ar etiketēm v1.

Kiali lieliski darbojas kopā ar Istio un nodroÅ”ina ārkārtÄ«gi labu risinājumu Mrežas vizualizēŔanai. VienkārÅ”i lieliski.

Kanāru izvietoŔana

Mūsu backend jau satur divus k8s izvietojumus, vienu v1 un vienu v2. Tagad mums vienkārŔi jāsaka Istio novirzīt noteiktu procentu pieprasījumu uz v2.

Solījums 1: 10%

Un viss, kas mums jādara, ir pielāgot VirtualService svarus. 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 Kubernetes #3: Istio

Redzam, ka 10% pieprasījumu tiek novirzīti uz v2.

2. solis: 50%

Un tagad pietiekami vienkārŔi palielināt to līdz 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 Kubernetes #3: Istio

3. solis: 100%

Tagad Canary izvietojums var tikt uzskatīts par pabeigtu un viss satiksme tiek novirzīta uz v2:

Canary Deployment Kubernetes #3: Istio

Canary testēŔana manuāli

Pieņemsim, ka mēs tagad uz aizmuguri v2 nosūtām 10% no visiem pieprasījumiem. Ko darīt, ja vēlamies manuāli pārbaudīt v2, lai pārliecinātos, ka viss darbojas kā gaidīts?

Mēs varam pievienot Ä«paÅ”u atbilstoÅ”u noteikumu, kas balstÄ«ts uz HTTP virsrakstiem:

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

Tagad, izmantojot curl, mēs varam piespiest pieprasīt v2, nosūtot virsrakstu:

Canary Deployment Kubernetes #3: Istio

Pieprasījumi bez virsraksta joprojām tiks pārvaldīti ar attiecību 1/10:

Canary Deployment Kubernetes #3: Istio

Canary divām atkarīgām versijām

Tagad mēs aplÅ«kosim gadÄ«jumu, kad mums ir versija v2 gan priekŔējai, gan aizmugures daļai. Abiem mēs norādÄ«jām, ka 10% satiksmes jāiet v2:

Canary Deployment Kubernetes #3: Istio

Redzam, ka priekŔējā versija v1 un v2 abi pārsÅ«ta satiksmi attiecÄ«bā 1/10 uz aizmugurējo v1 un v2.

Un ko darÄ«t, ja mums vajadzētu pārsÅ«tÄ«t satiksmi no frontend-v2 tikai uz backend-v2, jo tas nav savietojams ar v1? Tādēļ mēs iestatÄ«sim attiecÄ«bu 1/10 priekŔējai daļai, kas kontrolē, kāda satiksme nonāk backend-v2, izmantojot saskaņoÅ”anu pēc 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

Rezultātā mēs iegÅ«stam to, kas nepiecieÅ”ams:

Canary Deployment Kubernetes #3: Istio

AtŔķirības no manuālā Canary pieejas

No pirmajā daļā mēs manuāli veicām Canary izvietojumu, izmantojot divas k8s izvietojumus. Tur mēs pārvaldījām pieprasījumu attiecību, mainot repliku skaitu. Šī pieeja darbojas, taču tai ir nopietnas trūkumus.

Istio ļauj noteikt pieprasÄ«jumu attiecÄ«bu neatkarÄ«gi no repliku skaita. Tas nozÄ«mē, piemēram, ka mēs varam izmantot HPA (Horizontal Pod Autoscalers — horizontālo podu automātisko mērogoÅ”anu) un to nav nepiecieÅ”ams konfigurēt atbilstoÅ”i paÅ”reizējai Canary izvietojuma stāvoklim.

Rezultāts

Istio darbojas lieliski, un, izmantojot to kopā ar Kiali, iegūstam ļoti jaudīgu kombināciju. Nākamais manā intereŔu sarakstā ir kombinācija Spinnaker ar Istio automatizācijas un Canary analīzei.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster