Istio е удобна алатка за поврзување, обезбедување и следење на дистрибуирани апликации. Istio користи различни технологии за извршување и управување со софтвер во обем, вклучувајќи контејнери за пакување на кодот на апликацијата и зависности за распоредување, а Kubernetes за управување со тие контејнери. Затоа, за да работите со Istio мора да знаете како функционира апликација со повеќе услуги базирани на овие технологии без Истио. Ако овие алатки и концепти веќе ви се познати, слободно прескокнете го ова упатство и одете директно на делот Инсталирање на Istio на Google Kubernetes Engine (GKE) или инсталирање на екстензија Истио на ГКЕ.
Ова е водич чекор-по-чекор каде што ќе го поминеме целиот процес од изворниот код до контејнерот GKE за да ви дадеме основно разбирање за овие технологии преку пример. Исто така, ќе видите како Istio ја користи моќта на овие технологии. Ова претпоставува дека не знаете ништо за контејнери, Kubernetes, сервисни мрежи или Istio.
задачи
Во ова упатство, ќе ги завршите следните задачи:
Учење едноставна апликација hello world со повеќе услуги.
Стартувај ја апликацијата од изворниот код.
Пакување на апликацијата во контејнери.
Создавање кластер Kubernetes.
Распоредување на контејнери во кластер.
Пред да започнете
Следете ги упатствата за да го овозможите Kubernetes Engine API:
Во ова упатство, можете да го користите Cloud Shell, кој ја подготвува виртуелната машина g1-small во Google Compute Engine со Linux базиран на Debian или компјутер со Linux или macOS.
Опција А: Користење Cloud Shell
Придобивки од користењето на Cloud Shell:
Околини за развој на Python 2 и Python 3 (вклучувајќи виртуелен) се целосно конфигурирани.
Алатки за командна линија gcloud, докер, оди и кубектел, кои ќе ги користиме се веќе инсталирани.
Примерочната апликација е напишана во Python и се состои од две компоненти кои комуницираат со користење ОДМОР:
сервер: едноставен сервер со една крајна точка ДОБИЈ, /, кој печати „здраво свет“ на конзолата.
натоварувач: скрипта што испраќа сообраќај до сервер, со конфигуриран број на барања во секунда.
Водење апликација од изворниот код
За да ја истражите апликацијата примерок, стартувајте ја во Cloud Shell или на вашиот компјутер.
1) Во каталогот istio-samples/sample-apps/helloserver трчај сервер:
python3 server/server.py
При стартување сервер се прикажува следново:
INFO:root:Starting server...
2) Отворете друг терминален прозорец за испраќање барања сервер. Ако користите Cloud Shell, кликнете на иконата за додавање за да отворите друга сесија.
3) Испратете барање до сервер:
curl http://localhost:8080
серверот одговори:
Hello World!
4) Од директориумот каде што сте го преземале примерокот на кодот, одете во директориумот што го содржи натоварувач:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Од мрежна перспектива, целата апликација работи на еден домаќин (локален компјутер или виртуелна машина Cloud Shell). Затоа можете да користите localhostда испрати барања до сервер.
10) Да застане натоварувач и сервер, внесете Ctrl-c во секој терминален прозорец.
11) Во терминалниот прозорец натоварувач деактивирајте ја виртуелната средина:
deactivate
Пакување апликација во контејнери
За да ја извршите апликацијата на GKE, треба да ја спакувате примерната апликација − сервер и натоварувач - во Контејнерите. Контејнер е начин да се пакува апликација за да се изолира од нејзината околина.
За да спакувате апликација во контејнер, ви треба dockerfile. dockerfile е текстуална датотека која ги дефинира командите за вградување на изворниот код на апликацијата и неговите зависности во Докер слика. Откако ќе се изгради, ја поставувате сликата во регистар на контејнер како што е Docker Hub или Регистар на контејнери.
Примерот веќе има dockerfile за сервер и натоварувач со сите потребни команди за собирање слики. Подолу - dockerfile за сервер:
FROM python:3-slim as base
FROM base as builder
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
g++
&& rm -rf /var/lib/apt/lists/*
# Enable unbuffered logging
FROM base as final
ENV PYTHONUNBUFFERED=1
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
wget
WORKDIR /helloserver
# Grab packages from builder
COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/
# Add the application
COPY . .
EXPOSE 8080
ENTRYPOINT [ "python", "server.py" ]
Тим ОД python:3-тенок како основа му кажува на Докер да го користи најновото Слика од Python 3 како основа.
Тим КОПИРАЈ. . ги копира изворните датотеки во тековниот работен директориум (само во нашиот случај server.py) во датотечен систем на контејнерот.
ВЛЕЗНА ТОЧКА ја дефинира командата што се користи за стартување на контејнерот. Во нашиот случај, оваа команда е речиси иста како онаа што ја користевте за да ја извршите server.py од изворниот код.
Тим ИЗЛОЕТЕ укажува на тоа сервер чека податоци преку пристаништето 8080. Овој тим не е обезбедува пристаништа. Ова е некаква документација што е потребна за отворање на пристаништето 8080 при стартување на контејнерот.
Подготовка за контејнеризирање на вашата апликација
1) Поставете ги следните променливи на околината. Заменете PROJECT_ID на вашиот проект ID на GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Користење на вредности PROJECT_ID и GCR_REPO ја означувате сликата на Docker кога ја создавате и ја туркате во приватен регистар на контејнер.
2) Поставете го стандардниот проект GCP за алатката за командна линија gcloud.
gcloud config set project $PROJECT_ID
3) Поставете ја стандардната зона за алатката за командна линија gcloud.
gcloud config set compute/zone us-central1-b
4) Проверете дали е овозможена услугата Container Registry во проектот GCP.
Прегледајте го списокот со слики во складиштето и потврдете дека сликите се поставени:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Командата ги прикажува имињата на новопоставените слики:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Креирање на кластер GKE.
Овие контејнери може да се извршуваат на виртуелна машина Cloud Shell или на компјутер со командата докерски трчаат. Но, во производствена средина, потребен ви е начин за централно оркестрирање на контејнерите. На пример, потребен ви е систем кој гарантира дека контејнерите секогаш работат и ви треба начин да ги зголемите и вртите дополнителни примероци на контејнери доколку сообраќајот се зголеми.
За да стартувате контејнеризирани апликации што можете да ги користите ГКЕ. GKE е платформа за оркестрација на контејнери која ги собира виртуелните машини во кластер. Секоја виртуелна машина се нарекува јазол. Кластерите GKE се засноваат на системот за управување со кластери Kubernetes со отворен код. Kubernetes обезбедува механизми за интеракција со кластерот.
Тим gcloud создава веќе подготвен кластер во проектот GCP и стандардната зона што ја наведовте. За да го стартувате Istio, препорачуваме да имате најмалку 4 јазли и виртуелна машина n1-стандард-2.
Тимот го создава кластерот за неколку минути. Кога кластерот е подготвен, командата ќе даде вакво нешто сообщение.
2) Обезбедете акредитиви во алатката за командна линија кубектелда го користите за управување со кластерот:
3) Сега можете да комуницирате со Kubernetes преку кубектел. На пример, следнава команда може да го дознае статусот на јазлите:
kubectl get nodes
Командата произведува листа на јазли:
NAME STATUS ROLES AGE VERSION
gke-istoready-default-pool-dbeb23dc-1vg0 Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-36z5 Ready <none> 100s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-fj7s Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-wbjw Ready <none> 99s v1.13.6-gke.13
Клучни концепти на Kubernetes
Дијаграмот покажува апликација на GKE:
Пред да распоредите контејнери во GKE, научете ги клучните концепти на Kubernetes. Има линкови на самиот крај доколку сакате да дознаете повеќе.
Јазли и кластери. Во GKE, јазол е виртуелна машина. На други Kubernetes платформи, јазол може да биде компјутер или виртуелна машина. Кластерот е збирка јазли што може да се сметаат за единствена единица каде што распоредувате контејнеризирана апликација.
Мешунки. Во Кубернетес, контејнерите работат во мешунки. Под во Кубернетес е неделива единица. Во Pod има еден или повеќе контејнери. Распоредувате контејнери за сервер и натоварувач во посебни мешунки. Кога има неколку контејнери во подлогата (на пример, сервер за апликации и прокси-сервер), контејнерите се управуваат како единствен ентитет и споделуваат ресурси со подлоги.
Распоредувања. Во Kubernetes, распоредувањето е објект што е збирка од идентични подлоги. Распоредувањето лансира повеќекратни копии на мешунки дистрибуирани низ јазлите на кластерот. Распоредувањето автоматски ги заменува подлогите што не успеале или не реагираат.
Услуга Кубернетес. Кога се извршува кодот на апликацијата во GKE, врската помеѓу натоварувач и сервер. Кога започнавте услуги на виртуелна машина или работна површина Cloud Shell, испраќавте барања до сервер во localhost: 8080. Откако ќе се распоредат во GKE, подовите се извршуваат на достапните јазли. Стандардно, немате контрола врз кој јазол работи подлогата, така што вие мешунки нема постојани IP адреси.
За да добиете IP адреса за сервер, треба да дефинирате мрежна апстракција на врвот на мешунките. Тоа е она што е Услуга Кубернетес. Услугата Kubernetes обезбедува постојана крајна точка за множество парчиња. Има неколку видови на услуги. сервер користи LoadBalancer, кој обезбедува надворешна IP адреса за контакт сервер од надвор од кластерот.
Kubernetes исто така има вграден DNS систем кој доделува имиња на DNS (на пример, helloserver.default.cluster.local) услуги. Благодарение на ова, мешунките во кластерот комуницираат со други места во кластерот на постојана адреса. Името на DNS не може да се користи надвор од кластерот, како на пример во Cloud Shell или на компјутер.
Кубернетес се манифестира
Кога ја извршувавте апликацијата од изворот, ја користевте императивната команда python3
server.py
Императив имплицира глагол: „направи го ова“.
Kubernetes користи декларативен модел. Ова значи дека ние не му кажуваме на Кубернети што точно да прави, туку ја опишуваме посакуваната состојба. На пример, Kubernetes започнува и запира подлоги колку што е потребно за да се осигура дека вистинската состојба на системот се совпаѓа со саканата состојба.
Ја покажувате саканата состојба во манифестациите или датотеките ЈАМЛ. Датотеката YAML содржи спецификации за еден или повеќе објекти на Кубернет.
Примерот содржи датотека YAML за сервер и натоварувач. Секоја датотека YAML ја одредува посакуваната состојба на објектот за распоредување и услугата Kubernetes.
метаподатоци.име го одредува името на распоредувањето.
Прво поле спец содржи опис на посакуваната состојба.
спец.реплики го означува саканиот број на мешунки.
Дел спец.шаблон дефинира шаблон за pod. Има поле во спецификацијата на pod слика, што го одредува името на сликата што треба да се извади од регистарот на контејнери.
LoadBalancer: Клиентите испраќаат барања до IP адресата на балансерот на оптоварување, која има постојана IP адреса и е достапна надвор од кластерот.
targetPort: како што се сеќавате, тимот EXPOSE 8080 в dockerfile не обезбеди пристаништа. Вие го обезбедувате пристаништето 8080за да можете да го контактирате контејнерот сервер надвор од кластерот. Во нашиот случај hellosvc.default.cluster.local:80 (кратко име: hellosvc) одговара на пристаништето 8080 Под IP-адреси helloserver.
пристаниште: Ова е бројот на портата каде што другите услуги во кластерот ќе испраќаат барања.
loadgen.yaml
Предмет на распоредување на loadgen.yaml изгледа како сервер.yaml. Разликата е во тоа што објектот за распоредување содржи дел завист. Ги дефинира потребните променливи на животната средина натоварувач и кои сте ги инсталирале кога ја извршувате апликацијата од изворот.
Време натоварувач не прифаќа дојдовни барања, за теренот тип означен ClusterIP. Овој тип обезбедува постојана IP адреса што може да ја користат услугите во кластерот, но оваа IP адреса не е изложена на надворешни клиенти.
Замени PROJECT_ID на вашиот проект ID на GCP.
9) Зачувај и затвори loadgen.yaml, затворете го уредувачот на текст.
10) Распоредете ја датотеката YAML на Kubernetes:
kubectl apply -f loadgen.yaml
По успешното завршување, командата го произведува следниов код:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Проверете го статусот на мешунките:
kubectl get pods
Командата го покажува статусот:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Извлечете дневници на апликации од подлогата натоварувач. Заменете POD_ID до идентификаторот од претходниот одговор.
kubectl logs loadgenerator-POD_ID
13) Добијте надворешни IP адреси hellosvc:
kubectl get service
Одговорот на командата изгледа отприлика вака:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hellosvc LoadBalancer 10.81.15.158 192.0.2.1 80:31127/TCP 33m
kubernetes ClusterIP 10.81.0.1 <none> 443/TCP 93m
loadgensvc ClusterIP 10.81.15.155 <none> 80/TCP 4m52s
14) Испратете барање до hellosvc: замени EXTERNAL_IP на надворешна IP адреса hellosvc.
curl http://EXTERNAL_IP
Ајде да го земеме Истио
Веќе имате распоредена апликација на GKE. натоварувач може да користи Kubernetes DNS (hellosvc:80) за испраќање барања до сервери можете да испраќате барања до сервер со надворешна IP адреса. Иако Kubernetes има многу функции, недостасуваат некои информации за услугите:
Како комуницираат услугите? Какви се односите помеѓу услугите? Како тече сообраќајот помеѓу услугите? Дали сте свесни за тоа натоварувач испраќа барања до сервер, но замислете дека не знаете ништо за апликацијата. За да одговориме на овие прашања, ајде да го погледнеме списокот со подлоги што работат во GKE.
Метрика. Колку долго сервер одговара на дојдовното барање? Колку барања во секунда се примаат од серверот? Дали дава пораки за грешка?
Безбедносни информации. Сообраќај помеѓу натоварувач и сервер само поминува низ HTTP или од страна на mTLS?
Истио одговара на сите овие прашања. За да го направите ова, Istio поставува прокси за странична кола пратеник во секоја мешунка. Проксито Envoy го пресретнува целиот дојдовен и појдовен сообраќај до контејнерите на апликациите. Тоа значи дека сервер и натоварувач добиваат преку sidecar proxy Envoy, и целиот сообраќај од натоварувач к сервер оди преку полномошникот Енвој.
Врските помеѓу полномошниците на Envoy формираат сервисна мрежа. Сервисната мрежна архитектура обезбедува слој на контрола на врвот на Kubernetes.
Бидејќи проксите на Envoy работат во нивните сопствени контејнери, Istio може да се инсталира на врвот на кластерот GKE без речиси никакви промени во кодот на апликацијата. Но, направивте одредена работа за да ја подготвите вашата апликација да биде управувана од Istio:
Услуги за сите контејнери. До распоредувањата сервер и натоварувач врзани за услугата Кубернетес. Дури и натоварувач, кој не прима дојдовни барања, постои услуга.
Пристаништата во услугите мора да имаат имиња. Иако сервисните порти може да се остават неименувани во GKE, Istio бара од вас да наведете име на порта во согласност со неговиот протокол. Во датотеката YAML портата за сервер наречен httpбидејќи серверот го користи протоколот HTTP... Ако Сервис користени gRPC, би го именувале пристаништето грпц.
Распоредувањата се означени. Затоа, можете да ги користите функциите за управување со сообраќајот на Istio, како што е поделба на сообраќајот помеѓу верзии на истата услуга.
Инсталирање на Istio
Постојат два начина да се инсталира Istio. Може овозможете Istio на екстензијата GKE или инсталирајте ја верзијата со отворен код на Istio на кластерот. Со Istio на GKE, можете лесно да управувате со инсталациите и надградбите на Istio во текот на животниот циклус на кластерот GKE. Ако сакате најновата верзија на Istio или поголема контрола врз конфигурацијата на контролната табла на Istio, инсталирајте ја верзијата со отворен код наместо екстензијата Istio на GKE. За да одлучите за пристапот, прочитајте ја статијата Дали ми треба Istio на GKE?.
Изберете опција, прегледајте го соодветниот водич и следете ги инструкциите за да го инсталирате Istio на вашиот кластер. Ако сакате да го користите Istio со вашата ново распоредена апликација, овозможете имплементација на страничната лента за именскиот простор стандардно.
Чистење
За да избегнете наплата на вашата сметка на Google Cloud Platform за ресурсите што ги користевте во ова упатство, избришете го кластерот на контејнери штом ќе го инсталирате Istio и ќе си играте со апликацијата примерок. Ова ќе ги отстрани сите ресурси на кластерот, како што се компјутерски примероци, дискови и мрежни ресурси.