Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Истифодаи Istio+Kiali барои оғоз ва визуализатсияи ҷойгиркунии Canary

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Мақолаҳо дар ин силсила

  1. Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI
  2. Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо
  3. (Ин мақола)
  4. Ҷойгиркунии Canary бо истифода аз Jenkins-X Istio Flagger

Ҷойгиркунии Канария

Умедворем, ки шумо хонед қисми аввал, ки дар он мо ба таври мухтасар фаҳмонидем, ки ҷойгиркунии Canary чист ва нишон додем, ки чӣ гуна онҳоро бо истифода аз захираҳои стандартии Kubernetes татбиқ кардан мумкин аст.

Истио

Ва мо тахмин мезанем, ки бо хондани ин мақола шумо аллакай медонед, ки Истио чист. Агар не, пас шумо метавонед дар бораи он хонед дар ин ҷо.

Ариза барои санҷишҳо

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Ҳар як подк ду контейнер дорад: замимаи мо ва истио-прокси.

Мо як барномаи оддии санҷиширо бо pods-ҳои frontend-nginx ва backend python истифода хоҳем кард. Подшоҳи nginx танҳо ҳар як дархостро ба подкоҳи пушти сар равона мекунад ва ҳамчун прокси кор мекунад. Тафсилотро дар ямлҳои зерин пайдо кардан мумкин аст:

Барномаи санҷиширо худатон иҷро кунед

Агар шумо хоҳед, ки ба намунаи ман пайравӣ кунед ва ин барномаи санҷиширо худатон истифода баред, нигаред лоиҳаи ман.

Ҷойгиркунии ибтидоӣ

Вақте ки мо аввалин Deployment-ро оғоз мекунем, мо мебинем, ки қуттиҳои замимаи мо танҳо 2 контейнер доранд, яъне Istio sidecar ҳоло амалӣ карда мешавад:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Ва мо инчунин дар фазои ном Istio Gateway Loadbalancer мебинем istio-system:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Насли трафик

Мо IP-и зеринро барои тавлиди трафик истифода хоҳем кард, ки аз ҷониби подкастҳои фронталӣ қабул карда мешаванд ва ба подкастҳои пушти сар фиристода мешаванд:

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

Мо низ илова мекунем frontend.istio-test ба файли ҳостҳои мо.

Mesh тавассути Kiali тамошо кунед

Мо замимаи санҷишӣ ва Истиоро дар якҷоягӣ бо Tracing, Grafana, Prometheus ва Kiali насб кардем (барои тафсилот ба поён нигаред). лоиҳаи ман). Аз ин рӯ, мо метавонем Kiali-ро тавассути:

istioctl dashboard kiali # admin:admin

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Киали трафики ҷорӣро тавассути Mesh тасаввур мекунад

Тавре ки мо мебинем, 100% трафик ба хидмати фронталӣ ва сипас ба подкастҳои фронталӣ бо нишони v1 меравад, зеро мо прокси оддии nginx-ро истифода мебарем, ки дархостҳоро ба хидмати пуштибонии масир равона мекунад ва дар навбати худ онҳоро ба подкастҳои пушти сар мегузаронад. бо нишони v1.

Kiali бо Истио хуб кор мекунад ва ҳалли қуттии Mesh-ро пешниҳод мекунад. Танҳо олӣ.

Ҷойгиркунии Канария

Пойгоҳи мо аллакай ду ҷойгиркунии k8s дорад, яке барои v1 ва дигаре барои v2. Ҳоло мо бояд танҳо ба Истио бигӯем, ки фоизи муайяни дархостҳоро ба v2 ирсол кунад.

Қадами 1: 10%

Ва танҳо ба мо лозим аст, ки вазни VirtualService -ро танзим кунем истио.ямл:

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

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Мо мебинем, ки 10% дархостҳо ба v2 равона карда шудаанд.

Қадами 2: 50%

Ва ҳоло танҳо ба 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

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Қадами 3: 100%

Акнун ҷойгиркунии Canary метавонад пурра ҳисобида шавад ва тамоми трафик ба v2 равона карда мешавад:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Санҷиши Canary дастӣ

Фарз мекунем, ки мо ҳоло 2% ҳамаи дархостҳоро ба пуштибонии v10 мефиристем. Чӣ мешавад, агар мо мехоҳем v2-ро дастӣ санҷем, то боварӣ ҳосил кунем, ки ҳама чиз тавре ки мо интизор будем кор мекунад?

Мо метавонем қоидаҳои махсуси мувофиқро дар асоси сарлавҳаҳои 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

Ҳоло бо истифода аз curl мо метавонем дархости v2-ро тавассути фиристодани сарлавҳа маҷбур кунем:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Дархостҳо бидуни сарлавҳа то ҳол аз рӯи таносуби 1/10 иҷро карда мешаванд:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Канария барои ду версияи вобаста

Акнун мо вариантеро баррасӣ хоҳем кард, ки дар он мо версияи v2 барои ҳам фронт ва ҳам пуштибон дорем. Барои ҳарду, мо муайян кардем, ки 10% трафик бояд ба v2 равад:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Мо мебинем, ки frontend v1 ва v2 ҳам трафики пеширо бо таносуби 1/10 ба паси v1 ва v2.

Чӣ мешавад, агар ба мо лозим буд, ки трафикро аз frontend-v2 танҳо ба backend-v2 интиқол диҳем, зеро он бо v1 мувофиқ нест? Барои ин, мо таносуби 1/10-ро барои фронт муқаррар мекунем, ки он чӣ гуна трафикро бо истифода аз гуфтушунид ба backend-v2 ворид мекунад. 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

Дар натиҷа, мо чизҳои заруриро мегирем:

Ҷойгиркунии Канария дар Кубернетес # 3: Истио

Тафовут аз равиши дастӣ Canary

В қисми якум Мо ҷойгиркунии Canary-ро дастӣ анҷом додем, инчунин бо истифода аз ду ҷойгиркунии k8s. Дар он ҷо мо таносуби дархостҳоро тавассути тағир додани шумораи репликаҳо назорат мекардем. Ин усул кор мекунад, аммо камбудиҳои ҷиддӣ дорад.

Истио имкон медиҳад, ки таносуби дархостҳо новобаста аз шумораи репликаҳо муайян карда шавад. Ин маънои онро дорад, ки масалан, мо метавонем HPAs (Horizontal Pod Autoscalers) -ро истифода барем ва мувофиқи ҳолати кунунии густариши Canary танзим кардан лозим нест.

Натиҷа

Истио аъло кор мекунад ва истифодаи он дар якҷоягӣ бо Kiali як комбинатсияи хеле пурқувватро месозад. Оянда дар рӯйхати манфиатҳои ман якҷоя кардани Spinnaker бо Istio барои автоматизатсия ва таҳлили Canary мебошад.

Манбаъ: will.com

Илова Эзоҳ