Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Kanareykalarni joylashtirishni ishga tushirish va vizualizatsiya qilish uchun Istio + Kiali-dan foydalanish

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Ushbu turkumdagi maqolalar

  1. Kubernetesda kanareykalarni joylashtirish β„–1: Gitlab CI
  2. Kubernetesda kanareykalarni joylashtirish β„–2: Argo Rollouts
  3. (Ushbu maqola)
  4. Jenkins-X Istio Flagger yordamida Canary Deployment

Kanareykalarni joylashtirish

O'qiysiz degan umiddamiz birinchi qism, bu erda biz Kanareykalarni joylashtirish nima ekanligini qisqacha tushuntirdik va standart Kubernetes resurslaridan foydalangan holda ularni qanday amalga oshirishni ko'rsatdik.

Istio

Va biz ushbu maqolani o'qish orqali siz Istio nima ekanligini allaqachon bilasiz deb o'ylaymiz. Agar yo'q bo'lsa, unda siz bu haqda o'qishingiz mumkin shu yerda.

Sinovlar uchun ariza

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Har bir pod ikkita konteynerdan iborat: bizning ilovamiz va istio-proksi.

Biz frontend-nginx va backend python pods bilan oddiy sinov ilovasidan foydalanamiz. Nginx pod har bir so'rovni orqa qismga yo'naltiradi va proksi sifatida ishlaydi. Tafsilotlarni quyidagi yamllarda topish mumkin:

Sinov ilovasini o'zingiz ishga tushirish

Agar siz mening misolimga ergashmoqchi bo'lsangiz va ushbu test dasturidan o'zingiz foydalanmoqchi bo'lsangiz, qarang Readme loyihasi.

Dastlabki joylashtirish

Birinchi Deploymentni ishga tushirganimizda, biz ilovamizning podslarida faqat 2 ta konteyner borligini ko'ramiz, ya'ni Istio sidecar endigina amalga oshirilmoqda:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Shuningdek, biz nomlar maydonida Istio Gateway Loadbalancer-ni ko'ramiz istio-system:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Trafikni shakllantirish

Biz old panellar tomonidan qabul qilinadigan va orqa panellarga yo'naltiriladigan trafikni yaratish uchun quyidagi IP-dan foydalanamiz:

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

Biz ham qo'shamiz frontend.istio-test xostlar faylimizga.

Kiali orqali Mesh-ni ko'ring

Biz test dasturini va Istio-ni Tracing, Grafana, Prometey va Kiali bilan birga o'rnatdik (batafsil ma'lumot uchun pastga qarang). Readme loyihasi). Shuning uchun biz Kiali-dan foydalanishimiz mumkin:

istioctl dashboard kiali # admin:admin

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Kiali Mesh orqali joriy trafikni tasavvur qiladi

Ko'rib turganimizdek, trafikning 100% frontend xizmatiga, keyin v1 yorlig'i bo'lgan frontend pod'larga ketadi, chunki biz so'rovlarni backend xizmatiga yo'naltiruvchi oddiy nginx proksi-serveridan foydalanmoqdamiz, bu esa o'z navbatida ularni backend podslariga yo'naltiradi. v1 yorlig'i bilan.

Kiali Istio bilan ajoyib ishlaydi va qutidagi Mesh renderlash yechimini taqdim etadi. Shunchaki ajoyib.

Kanareykalarni joylashtirish

Bizning serverimizda allaqachon ikkita k8s joylashuvi mavjud, biri v1 va biri v2 uchun. Endi biz Istio-ga so'rovlarning ma'lum foizini v2 ga yuborishni aytishimiz kerak.

1-qadam: 10%

Va biz qilishimiz kerak bo'lgan yagona narsa - VirtualService vaznini sozlash 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

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Biz so'rovlarning 10% v2 ga yo'naltirilganligini ko'ramiz.

2-qadam: 50%

Va endi uni 50% ga oshirish kifoya:

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

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

3-qadam: 100%

Endi Canary-ni joylashtirish tugallangan deb hisoblanishi mumkin va barcha trafik v2 ga yo'naltiriladi:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Kanareykani qo'lda sinab ko'rish

Aytaylik, biz barcha so'rovlarning 2 foizini v10 serveriga yuboramiz. Hammasi biz kutgandek ishlashiga ishonch hosil qilish uchun v2 ni qo'lda sinab ko'rmoqchi bo'lsak-chi?

HTTP sarlavhalariga asoslangan maxsus mos qoidani qo'shishimiz mumkin:

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

Endi curl yordamida biz sarlavhani yuborish orqali v2 so'rovini majburlashimiz mumkin:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Sarlavhasiz so'rovlar hali ham 1/10 nisbatiga asoslanadi:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Ikki qaram versiyalar uchun kanareyka

Endi biz old va backend uchun v2 versiyasiga ega bo'lgan variantni ko'rib chiqamiz. Ikkalasi uchun biz trafikning 10% v2 ga o'tishi kerakligini aniqladik:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Biz v1 va v2 frontendlari v1 va v10 backendlariga 1/2 nisbatda oldingi trafikni ko'ramiz.

Trafikni frontend-v2 dan faqat backend-v2 ga yo'naltirishimiz kerak bo'lsa-chi, chunki u v1 bilan mos kelmaydi? Buni amalga oshirish uchun biz frontend uchun 1/10 nisbatini o'rnatamiz, u muzokaralar yordamida backend-v2 ga qanday trafik kelishini boshqaradi. 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

Natijada biz kerakli narsani olamiz:

Kubernetesda kanareykalarni joylashtirish β„–3: Istio

Qo'lda Kanareyka yondashuvidan farqlari

Π’ birinchi qism Biz Canary joylashtirishni qo'lda, shuningdek ikkita k8s joylashtirishdan foydalangan holda amalga oshirdik. U erda biz replikalar sonini o'zgartirish orqali so'rovlar nisbatini nazorat qildik. Ushbu yondashuv ishlaydi, lekin jiddiy kamchiliklarga ega.

Istio replikalar sonidan qat'iy nazar so'rovlar nisbatini aniqlash imkonini beradi. Bu, masalan, biz HPA (Gorizontal Pod Autoscalers) dan foydalanishimiz mumkinligini va Canary joylashuvining joriy holatiga ko'ra sozlanishi shart emasligini anglatadi.

Xulosa

Istio ajoyib ishlaydi va uni Kiali bilan birgalikda ishlatish juda kuchli kombinatsiyani yaratadi. Mening qiziqishlarim ro'yxatidan keyingi navbatda Spinnakerni avtomatlashtirish va Canary analitikasi uchun Istio bilan birlashtirish.

Manba: www.habr.com

a Izoh qo'shish