Истифодаи Istio+Kiali барои оғоз ва визуализатсияи ҷойгиркунии Canary
Мақолаҳо дар ин силсила
Ҷойгиркунии Канария дар Кубернетес №1: Gitlab CI Ҷойгиркунии Канария дар Кубернетес # 2: Арго Роллотҳо - (Ин мақола)
- Ҷойгиркунии Canary бо истифода аз Jenkins-X Istio Flagger
Ҷойгиркунии Канария
Умедворем, ки шумо хонед
Истио
Ва мо тахмин мезанем, ки бо хондани ин мақола шумо аллакай медонед, ки Истио чист. Агар не, пас шумо метавонед дар бораи он хонед
Ариза барои санҷишҳо
Ҳар як подк ду контейнер дорад: замимаи мо ва истио-прокси.
Мо як барномаи оддии санҷиширо бо pods-ҳои frontend-nginx ва backend python истифода хоҳем кард. Подшоҳи nginx танҳо ҳар як дархостро ба подкоҳи пушти сар равона мекунад ва ҳамчун прокси кор мекунад. Тафсилотро дар ямлҳои зерин пайдо кардан мумкин аст:
Барномаи санҷиширо худатон иҷро кунед
Агар шумо хоҳед, ки ба намунаи ман пайравӣ кунед ва ин барномаи санҷиширо худатон истифода баред, нигаред
Ҷойгиркунии ибтидоӣ
Вақте ки мо аввалин Deployment-ро оғоз мекунем, мо мебинем, ки қуттиҳои замимаи мо танҳо 2 контейнер доранд, яъне Istio sidecar ҳоло амалӣ карда мешавад:
Ва мо инчунин дар фазои ном Istio Gateway Loadbalancer мебинем istio-system
:
Насли трафик
Мо 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 насб кардем (барои тафсилот ба поён нигаред).
istioctl dashboard kiali # admin:admin
Киали трафики ҷорӣро тавассути 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
Мо мебинем, ки 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: 100%
Акнун ҷойгиркунии Canary метавонад пурра ҳисобида шавад ва тамоми трафик ба v2 равона карда мешавад:
Санҷиши 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-ро тавассути фиристодани сарлавҳа маҷбур кунем:
Дархостҳо бидуни сарлавҳа то ҳол аз рӯи таносуби 1/10 иҷро карда мешаванд:
Канария барои ду версияи вобаста
Акнун мо вариантеро баррасӣ хоҳем кард, ки дар он мо версияи v2 барои ҳам фронт ва ҳам пуштибон дорем. Барои ҳарду, мо муайян кардем, ки 10% трафик бояд ба v2 равад:
Мо мебинем, ки 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
Дар натиҷа, мо чизҳои заруриро мегирем:
Тафовут аз равиши дастӣ Canary
В қисми якум Мо ҷойгиркунии Canary-ро дастӣ анҷом додем, инчунин бо истифода аз ду ҷойгиркунии k8s. Дар он ҷо мо таносуби дархостҳоро тавассути тағир додани шумораи репликаҳо назорат мекардем. Ин усул кор мекунад, аммо камбудиҳои ҷиддӣ дорад.
Истио имкон медиҳад, ки таносуби дархостҳо новобаста аз шумораи репликаҳо муайян карда шавад. Ин маънои онро дорад, ки масалан, мо метавонем HPAs (Horizontal Pod Autoscalers) -ро истифода барем ва мувофиқи ҳолати кунунии густариши Canary танзим кардан лозим нест.
Натиҷа
Истио аъло кор мекунад ва истифодаи он дар якҷоягӣ бо Kiali як комбинатсияи хеле пурқувватро месозад. Оянда дар рӯйхати манфиатҳои ман якҷоя кардани Spinnaker бо Istio барои автоматизатсия ва таҳлили Canary мебошад.
Манбаъ: will.com