Забелешка. превод.: Во првиот дел Оваа серија беше посветена на воведување на способностите на Istio и нивно демонстрирање на дело. Сега ќе зборуваме за посложени аспекти на конфигурацијата и употребата на оваа услуга мрежа, а особено за фино наместеното рутирање и управувањето со мрежниот сообраќај.
Исто така, ве потсетуваме дека статијата користи конфигурации (манифестации за Кубернетес и Истио) од складиштето истио-мајсторство.
Управување со сообраќајот
Со Istio, новите способности се појавуваат во кластерот за да обезбедат:
Динамично насочување на барањето: ротирања на канари, A/B тестирање;
Балансирање на товарот: едноставен и конзистентен, базиран на хашови;
Закрепнување по падови: тајмаути, повторни обиди, прекинувачи;
Вметнување дефекти: одложувања, отфрлени барања итн.
Како што продолжува написот, овие способности ќе бидат илустрирани користејќи ја избраната апликација како пример и ќе се воведат нови концепти на патот. Првиот таков концепт ќе биде DestinationRules(т.е. правила за примачот на сообраќај/барања - прибл. превод), со чија помош го активираме A/B тестирањето.
А/Б тестирање: Правила за дестинација во пракса
A/B тестирањето се користи во случаи кога има две верзии на апликација (обично тие се визуелно различни) и не сме 100% сигурни која од нив ќе го подобри корисничкото искуство. Затоа, ги извршуваме двете верзии истовремено и собираме метрика.
За да ја распоредите втората верзија на предниот дел, потребна за демонстрација на A/B тестирање, извршете ја следнава команда:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created
Манифестот за распоредување за зелената верзија се разликува на две места:
Сликата е заснована на друга ознака - istio-green,
Мешунките имаат етикета version: green.
Бидејќи и двете распоредувања имаат ознака app: sa-frontend,барањата насочени од виртуелната услуга sa-external-services за сервис sa-frontend, ќе биде пренасочен кон сите негови примероци и оптоварувањето ќе се дистрибуира низ круг-робин алгоритам, што ќе доведе до следнава ситуација:
Бараните датотеки не беа пронајдени
Овие датотеки не беа пронајдени бидејќи се именувани поинаку во различни верзии на апликацијата. Ајде да се увериме во ова:
Тоа значи дека index.html, барајќи една верзија на статични датотеки, може да се испрати од балансерот на оптоварување до подлоги кои имаат различна верзија, каде што, од очигледни причини, такви датотеки не постојат. Затоа, за да може апликацијата да работи, треба да поставиме ограничување:истата верзија на апликацијата што опслужуваше index.html треба да опслужува последователни барања".
Ќе стигнеме таму со конзистентно балансирање на оптоварување базирано на хаш (Конзистентно балансирање на хаш). Во овој случај барањата од ист клиент се испраќаат до истиот заден пример, за што се користи претходно дефинирано својство - на пример, HTTP заглавие. Имплементиран со користење на DestinationRules.
Правила за дестинација
По Виртуелна услуга испративме барање до саканата услуга, со помош на DestinationRules можеме да дефинираме политики што ќе се применуваат на сообраќајот наменет за примери на оваа услуга:
Управување со сообраќајот со ресурсите на Истио
Имајте на ум: Влијанието на ресурсите на Istio врз мрежниот сообраќај е претставено овде на начин што е лесно разбирлив. Поточно, одлуката до која инстанца да се испрати барањето ја донесува пратеникот во влезната порта конфигурирана во CRD.
Со Правилата за дестинација, можеме да го конфигурираме балансирањето на оптоварувањето да користи конзистентни хашови и да се осигураме дека истиот пример на услуга одговара на истиот корисник. Следнава конфигурација ви овозможува да го постигнете ова (destinationrule-sa-frontend.yaml):
Имајте на ум: За да додадете различни вредности во заглавието и да ги тестирате резултатите директно во прелистувачот, можете да користите ова проширување на Хром (Или со ова за Firefox - прибл. превод.).
Општо земено, DestinationRules има повеќе способности во областа на балансирање на оптоварување - проверете за детали во официјална документација.
Пред дополнително да го проучуваме VirtualService, ајде да ја избришеме „зелената верзија“ на апликацијата и соодветното правило за насока на сообраќајот со извршување на следните команди:
Засенчување („заштитување“) или Mirroring („отсликување“) се користи во случаи кога сакаме да тестираме промена во производството без да влијаеме на крајните корисници: за да го направиме тоа, ги дуплираме („огледало“) барањата до втор степен каде што се направени саканите промени и ги разгледуваме последиците. Едноставно кажано, ова е кога вашиот колега го избира најкритичното прашање и прави барање за повлекување во форма на толку огромна грутка нечистотија што никој всушност не може да го прегледа.
За да го тестираме ова сценарио во акција, ајде да создадеме втор пример на SA-Logic со грешки (buggy) со извршување на следнава команда:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created
И сега да ја извршиме командата за да се увериме дека сите инстанци со app=sa-logic Тие исто така имаат етикети со соодветните верзии:
Услуги sa-logic цели мешунки со етикета app=sa-logic, така што сите барања ќе бидат дистрибуирани меѓу сите инстанци:
... но сакаме барањата да се испраќаат до примерите на v1 и да се пресликаат на примероците на v2:
Ова ќе го постигнеме преку VirtualService во комбинација со DestinationRule, каде правилата ќе ги одредат подмножествата и маршрутите на VirtualService до одредено подмножество.
Дефинирање на подмножества во правилата за дестинација
Домаќин (host) дефинира дека ова правило важи само за случаи кога трасата оди кон услугата sa-logic;
Наслови (name) подмножества се користат при рутирање на инстанци на подмножества;
Етикета (label) ги дефинира паровите клуч-вредност со кои инстанците мора да одговараат за да станат дел од подмножеството.
Примени ја конфигурацијата со следнава команда:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created
Сега кога подмножествата се дефинирани, можеме да продолжиме и да го конфигурираме VirtualService да применува правила на барањата за sa-logic, така што тие:
Не е потребно објаснување овде, па ајде да го видиме на дело:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic created
Ајде да го додадеме оптоварувањето со повикување на следнава команда:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
Да ги погледнеме резултатите во Графана, каде што може да се види дека верзијата со багови (buggy) резултира со неуспех за ~ 60% од барањата, но ниту еден од овие неуспеси не влијае на крајните корисници бидејќи на нив одговара услуга која работи.
Успешни одговори на различни верзии на услугата sa-logic
Овде за прв пат видовме како VirtualService се применува на пратениците на нашите услуги: кога sa-web-app упатува барање до sa-logic, минува низ страничната кола Envoy, која - преку VirtualService - е конфигурирана да го насочува барањето до подмножеството v1 и да го пресликува барањето до подмножеството v2 на услугата sa-logic.
Знам, можеби веќе мислите дека Виртуелните услуги се едноставни. Во следниот дел, ќе го прошириме тоа велејќи дека тие се исто така навистина одлични.
Распоредување на канари
Canary Deployment е процес на воведување нова верзија на апликација за мал број корисници. Се користи за да се увериме дека нема проблеми во издавањето и само после тоа, веќе уверени во неговиот (издание) квалитет, дистрибуирајте го на други корисници.опоголема публика.
За да го демонстрираме распоредувањето на канаринци, ќе продолжиме да работиме со подмножество buggy у sa-logic.
Да не губиме време на ситници и веднаш да испратиме 20% од корисниците на верзијата со грешки (ова ќе го претставува нашето пуштање на канаринци), а останатите 80% до нормалната услуга. За да го направите ова, користете ја следнава виртуелна услуга (sa-logic-подмножества-canary-vs.yaml):
... и веднаш ќе видиме дека некои барања водат до неуспеси:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}'
--silent -w "Time: %{time_total}s t Status: %{http_code}n"
-o /dev/null; sleep .1; done
Time: 0.153075s Status: 200
Time: 0.137581s Status: 200
Time: 0.139345s Status: 200
Time: 30.291806s Status: 500
VirtualServices овозможуваат пуштање на канари: во овој случај, го намаливме потенцијалното влијание на проблемите на 20% од базата на корисници. Прекрасно! Сега, во секој случај кога не сме сигурни во нашиот код (со други зборови - секогаш...), можеме да користиме mirroring и canary rollouts.
Истекнувања и повторни обиди
Но, грешките не секогаш завршуваат во кодот. Во списокот од „8 Заблуди за дистрибуираното пресметување„На прво место е погрешното верување дека „мрежата е сигурна“. Во реалноста мрежата Нема сигурен, и поради оваа причина ни требаат тајмаути (тајмаути) и се обидува повторно (се обидува повторно).
За демонстрација ќе продолжиме да ја користиме истата проблематична верзија sa-logic (buggy), и ќе ја симулираме несигурноста на мрежата со случајни неуспеси.
Дозволете нашата услуга со грешки да има 1/3 шанси да одземе предолго за да одговори, 1/3 шанси да заврши со внатрешна грешка на серверот и 1/3 шанси успешно да ја врати страницата.
За да го ублажиме влијанието на ваквите проблеми и да го подобриме животот за корисниците, можеме:
додадете тајмаут ако на услугата и требаат подолго од 8 секунди за да одговори,
Времето на истекот на барањето е поставено на 8 секунди;
Барањата се повторуваат 3 пати;
И секој обид се смета за неуспешен ако времето на одговор надминува 3 секунди.
Ова е оптимизација бидејќи корисникот нема да мора да чека повеќе од 8 секунди и ќе направиме три нови обиди да добиеме одговор во случај на неуспех, зголемувајќи ја шансата за успешен одговор.
Примени ја ажурираната конфигурација со следнава команда:
И проверете во графиконите на Графана дека бројот на успешни одговори е зголемен погоре:
Подобрувања во статистиката за успешни одговори по додавање на тајмаути и повторни обиди
Пред да преминете на следниот дел (или подобро, на следниот дел од статијата, бидејќи во ова нема да има повеќе практични експерименти - прибл. превод.), избриши sa-logic-buggy и VirtualService со извршување на следните команди:
Зборуваме за два важни шеми во архитектурата на микросервис кои ви овозможуваат да постигнете само-обновување (само-лекување) услуги.
Прекинувач на електрично коло("прекинувач на електрично коло") се користи за прекинување на барањата кои доаѓаат до пример на услуга која се смета за нездрава и ја обновува додека барањата на клиентот се пренасочуваат кон здрави примероци на таа услуга (што го зголемува процентот на успешни одговори). (Забелешка: Подетален опис на моделот може да се најде, на пример, тука.)
Преграда(„партиција“) ги изолира дефектите на услугата да не влијаат на целиот систем. На пример, услугата Б е скршена и друга услуга (клиентот на услугата Б) поднесува барање до услугата Б, предизвикувајќи таа да го исцрпи својот базен на нишки и да не може да сервисира други барања (дури и ако тие не се од услугата Б). (Забелешка: Подетален опис на моделот може да се најде, на пример, тука.)
Ќе ги изоставам деталите за имплементацијата на овие обрасци бидејќи лесно се наоѓаат во нив официјална документација, а исто така навистина сакам да покажам автентикација и овластување, за што ќе се дискутира во следниот дел од статијата.