Istio – таратылған қолданбаларды қосуға, қорғауға және бақылауға арналған ыңғайлы құрал. Istio бағдарламалық құралды масштабта іске қосу және басқару үшін әртүрлі технологияларды пайдаланады, соның ішінде қолданба кодын бумалауға арналған контейнерлер мен орналастыруға тәуелділіктерді және сол контейнерлерді басқару үшін Kubernetes. Сондықтан, Istio-мен жұмыс істеу үшін сіз осы технологияларға негізделген бірнеше қызметтері бар қолданбаның қалай жұмыс істейтінін білуіңіз керек жоқ Istio. Егер бұл құралдар мен ұғымдар сізге бұрыннан таныс болса, бұл оқулықты өткізіп жіберіп, тікелей бөлімге өтіңіз. Google Kubernetes Engine (GKE) жүйесінде Istio орнату немесе кеңейтімді орнату Istio on GKE.
Бұл мысал арқылы осы технологиялар туралы негізгі түсінік беру үшін бастапқы кодтан GKE контейнеріне дейінгі бүкіл процесті аралайтын қадамдық нұсқаулық. Сондай-ақ, Istio осы технологиялардың күшін қалай пайдаланатынын көресіз. Бұл контейнерлер, Кубернеттер, қызмет көрсету торлары немесе Istio туралы ештеңе білмейсіз деп болжайды.
міндеттері
Бұл оқулықта сіз келесі тапсырмаларды орындайсыз:
Бірнеше қызметтері бар қарапайым Hello World қолданбасын үйрену.
Қолданбаны бастапқы кодтан іске қосыңыз.
Қолданбаны контейнерлерге орау.
Kubernetes кластерін жасау.
Контейнерлерді кластерге орналастыру.
Бастамас бұрын
Kubernetes Engine API қосу үшін нұсқауларды орындаңыз:
Бұл оқулықта виртуалды машинаны дайындайтын Cloud Shell қолданбасын пайдалануға болады Google Compute Engine жүйесіндегі g1-кіші Debian негізіндегі Linux немесе Linux немесе macOS компьютерімен.
А нұсқасы: Cloud Shell пайдалану
Cloud Shell пайдаланудың артықшылықтары:
Python 2 және Python 3 әзірлеу орталары (соның ішінде virtualenv) толығымен конфигурацияланған.
Пәрмен жолы құралдары gcloud, доккер, Git и кубектлБіз қолданатын , әлдеқашан орнатылған.
Үлгі қолданбаны зерттеу үшін оны 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 виртуалды машинасы) жұмыс істейді. Сондықтан сіз пайдалана аласыз жергіліктісұрауларды жіберу үшін сервер.
10) Тоқтау жүктеген и сервер, енгізіңіз Ctrl-c әрбір терминал терезесінде.
11) Терминал терезесінде жүктеген виртуалды ортаны өшіру:
deactivate
Қолданбаны контейнерлерге салу
Қолданбаны GKE жүйесінде іске қосу үшін үлгі қолданбаны бумалау керек − сервер и жүктеген - in контейнерлер. Контейнер қолданбаны ортасынан оқшаулау үшін оны бумалау тәсілі болып табылады.
Бағдарламаны контейнерге бумалау үшін сізге қажет Докер файлы. Докер файлы қолданбаның бастапқы кодын және оның тәуелділіктерін құру пәрмендерін анықтайтын мәтіндік файл Докер кескіні. Құрылғаннан кейін кескінді Docker Hub немесе сияқты контейнер тізіліміне жүктеп салыңыз Контейнер тізілімі.
Мысал бұрыннан бар Докер файлы үшін сервер и жүктеген суреттерді жинау үшін барлық қажетті командалармен. Төменде - Докер файлы үшін сервер:
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" ]
команда FROM python: 3-жіңішке негіз ретінде Docker соңғы нұсқасын пайдалануды ұсынады Python 3 суреті негіз ретінде.
команда КӨШІРУ. . бастапқы файлдарды ағымдағы жұмыс каталогына көшіреді (біздің жағдайда ғана server.py) контейнердің файлдық жүйесіне.
КІРУ НҮКТЕГІ контейнерді іске қосу үшін пайдаланылатын пәрменді анықтайды. Біздің жағдайда бұл пәрмен бұрын іске қосылған командамен бірдей дерлік server.py бастапқы кодтан.
команда ТАҢДАУ екенін көрсетеді сервер порт арқылы деректерді күтеді 8080. Бұл команда емес порттарды қамтамасыз етеді. Бұл портты ашу үшін қажет құжаттаманың бір түрі 8080 контейнерді іске қосқанда.
Қолданбаңызды контейнерлеуге дайындалуда
1) Келесі орта айнымалы мәндерін орнатыңыз. Ауыстыру PROJECT_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) Контейнер тізілімі қызметінің 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 жобасында және сіз көрсеткен әдепкі аймақта istioready кластерін жасайды. 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 - бұл бөлінбейтін бірлік. Pod бір немесе бірнеше контейнерді сақтайды. Сіз сервер контейнерлерін және жүктеген бөлек түйіршіктерде. Қоспада бірнеше контейнер болған кезде (мысалы, қолданба сервері және прокси сервер), контейнерлер жалғыз нысан ретінде басқарылады және қосқыш ресурстарын ортақ пайдаланады.
Орналастырулар. Kubernetes жүйесінде орналастыру - бұл бірдей подкасттардың жинағы болып табылатын нысан. Орналастыру кластер түйіндері бойынша таратылған қосқыштардың бірнеше көшірмелерін іске қосады. Орналастыру сәтсіз немесе жауап бермейтін подкасттарды автоматты түрде ауыстырады.
Kubernetes қызметі. GKE-де қолданба кодын іске қосқан кезде, арасындағы байланыс жүктеген и сервер. Cloud Shell виртуалды машинасында немесе жұмыс үстелінде қызметтерді бастаған кезде, сіз сұрауларды жібердіңіз сервер мекенжай бойынша localhost: 8080. GKE-ге орналастырылғаннан кейін подкасттар қол жетімді түйіндерде орындалады. Әдепкі бойынша, сіз подкасттың қай түйінде жұмыс істейтінін басқара алмайсыз, сондықтан сіз бүршіктер тұрақты IP мекенжайлары жоқ.
үшін IP мекенжайын алу үшін сервер, желілік абстракцияны тіректердің жоғарғы жағында анықтауыңыз керек. Бұл солай Kubernetes қызметі. Kubernetes қызметі қосқыштар жиынтығы үшін тұрақты соңғы нүктені қамтамасыз етеді. Бірнеше бар қызмет түрлері. сервер пайдаланады LoadBalancer, ол байланысу үшін сыртқы IP мекенжайын береді сервер кластердің сыртынан.
Kubernetes-те DNS атауларын тағайындайтын кіріктірілген DNS жүйесі де бар (мысалы, helloserver.default.cluster.local) қызметтер. Осының арқасында кластердегі қосқыштар тұрақты мекенжай бойынша кластердегі басқа подкасттармен байланысады. DNS атауын Cloud Shell немесе компьютер сияқты кластерден тыс пайдалану мүмкін емес.
Кубернетес көрсетеді
Қолданбаны көзден іске қосқанда, сіз императивті пәрменді қолдандыңыз python3
server.py
Бұйрық етістікті білдіреді: «мұны істе».
Кубернетес пайдаланады декларативті модель. Бұл дегеніміз, біз Кубернетеске нақты не істеу керектігін айтпаймыз, керісінше қалаған күйді сипаттаймыз. Мысалы, Кубернетес жүйенің нақты күйі қалаған күйге сәйкес келетініне көз жеткізу үшін қажет болғанда подкасттарды қосады және тоқтатады.
Манифесттерде немесе файлдарда қажетті күйді көрсетесіз ЯМЛ. YAML файлында бір немесе бірнеше Kubernetes нысандарының техникалық сипаттамалары бар.
Мысалда YAML файлы бар сервер и жүктеген. Әрбір YAML файлы орналастыру нысанының және Kubernetes қызметінің қажетті күйін көрсетеді.
Бірінші өріс ерекшелігі қажетті күйдің сипаттамасын қамтиды.
spec.replicas түйіршіктердің қажетті санын көрсетеді.
Бөлім spec.template подкаст үлгісін анықтайды. Қондырғы спецификациясында өріс бар бейне, ол Контейнер тізілімінен шығару қажет кескіннің атын көрсетеді.
LoadBalancer: Клиенттер сұрауларды тұрақты IP мекенжайы бар және кластерден тыс қол жеткізуге болатын жүктеме балансының IP мекенжайына жібереді.
мақсатты порт: естеріңізде болса, команда EXPOSE 8080 в Докер файлы порттарды бермеді. Сіз портты бересіз 8080контейнерге хабарласуыңыз үшін сервер кластерден тыс. Біздің жағдайда hellovc.default.cluster.local:80 (қысқа аты: hellovc) портқа сәйкес келеді 8080 Pod IP мекенжайлары сәлем сервері.
порт: Бұл кластердегі басқа қызметтер сұрауларды жіберетін порт нөмірі.
loadgen.yaml
Орналастыру нысаны loadgen.yaml ұқсайды server.yaml. Айырмашылық мынада, орналастыру нысанында бөлім бар ауд. Ол қажетті орта айнымалыларын анықтайды жүктеген және қолданбаны дереккөзден іске қосқан кезде орнатылған.
уақыт жүктеген өріс үшін кіріс сұрауларды қабылдамайды түрі көрсетілген ClusterIP. Бұл түр кластердегі қызметтер пайдалана алатын тұрақты IP мекенжайын қамтамасыз етеді, бірақ бұл IP мекенжайы сыртқы клиенттерге әсер етпейді.
Ауыстыру PROJECT_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 мекенжайларын алыңыз hellovc:
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) Сұраныс жіберу hellovc: ауыстырыңыз EXTERNAL_IP сыртқы IP мекенжайына hellovc.
curl http://EXTERNAL_IP
Истиоға келейік
Сізде GKE қолданбасы бұрыннан бар. жүктеген Kubernetes DNS пайдалана алады (hellovc: 80) сұрауларды жіберу үшін сервержәне сұрауларды жіберуге болады сервер сыртқы IP мекенжайы бойынша. Kubernetes көптеген мүмкіндіктерге ие болғанымен, қызметтер туралы кейбір ақпарат жетіспейді:
Қызметтер қалай өзара әрекеттеседі? Қызметтер арасында қандай байланыс бар? Қызметтер арасындағы трафик қалай жүреді? Сіз мұны білесіз бе жүктеген сұраныстарын жібереді сервер, бірақ қолданба туралы ештеңе білмейсіз деп елестетіңіз. Бұл сұрақтарға жауап беру үшін GKE жүйесіндегі іске қосылған қосқыштар тізімін қарастырайық.
Көрсеткіштер. Недеген ұзақ сервер кіріс сұрауға жауап береді? Сервер секундына қанша сұраныс алады? Ол қате туралы хабарларды береді ме?
Қауіпсіздік туралы ақпарат. арасындағы қозғалыс жүктеген и сервер жай ғана өтеді HTTP немесе mTLS?
Istio осы сұрақтардың бәріне жауап береді. Бұл әрекетті орындау үшін, Istio бүйірлік проксиді орналастырады өкілі әрбір қабықта. Envoy проксиі қолданба контейнерлеріне барлық кіріс және шығыс трафикті ұстайды. Бұл дегеніміз сервер и жүктеген бүйірлік прокси өкіл арқылы және барлық трафикті алыңыз жүктеген к сервер Өкіл прокси арқылы өтеді.
Envoy проксилері арасындағы қосылымдар қызмет торын құрайды. Қызмет торының архитектурасы Kubernetes жоғарғы жағында басқару қабатын қамтамасыз етеді.
Envoy прокси-серверлері өз контейнерлерінде жұмыс істейтіндіктен, Istio қолданбасын кодты өзгертусіз дерлік GKE кластерінің үстіне орнатуға болады. Бірақ сіз қолданбаңызды Istio басқаруына дайындау үшін біраз жұмыс жасадыңыз:
Барлық контейнерлерге арналған қызметтер. Орналастыруларға сервер и жүктеген Kubernetes қызметіне байланысты. Тіпті жүктеген, кіріс сұрауларын қабылдамайтын, қызмет бар.
Қызметтердегі порттардың атаулары болуы керек. Қызмет порттарын GKE-де атаусыз қалдыруға болатынына қарамастан, Istio көрсетуді талап етеді порт атауы оның хаттамасына сәйкес. YAML файлында порт сервер деп аталады HTTPсебебі сервер протоколды пайдаланады HTTP... Егер қызмет көрсету пайдаланылады gRPC, сіз портты атар едіңіз grpc.
Орналастырулар жалаушамен белгіленген. Сондықтан, сіз Istio трафикті басқару мүмкіндіктерін пайдалана аласыз, мысалы, трафикті бір қызметтің нұсқалары арасында бөлу.
Istio орнатылуда
Istio орнатудың екі жолы бар. мүмкін GKE кеңейтімінде Istio қосыңыз немесе Istio бағдарламасының ашық бастапқы нұсқасын орнатыңыз кластер бойынша. Istio on GKE көмегімен GKE кластерінің өмірлік циклі бойына Istio орнатулары мен жаңартуларын оңай басқара аласыз. Istio бағдарламасының соңғы нұсқасын немесе Istio басқару тақтасының конфигурациясын көбірек басқаруды қаласаңыз, Istio on GKE кеңейтімінің орнына ашық бастапқы нұсқаны орнатыңыз. Әдіс туралы шешім қабылдау үшін мақаланы оқыңыз Маған GKE-де Istio керек пе?.
Опцияны таңдап, сәйкес нұсқаулықты қарап шығыңыз және кластеріңізге Istio орнату үшін нұсқауларды орындаңыз. Istio қолданбасын жаңадан енгізілген қолданбамен пайдаланғыңыз келсе, бүйірлік жолды іске асыруға мүмкіндік береді аттар кеңістігі үшін Әдепкі.
Тазалау
Осы оқулықта пайдаланған ресурстар үшін Google Cloud Platform тіркелгісіне ақы алынбау үшін, Istio орнатып, үлгі қолданбасымен ойнағаннан кейін контейнер кластерін жойыңыз. Бұл есептеу даналары, дискілер және желі ресурстары сияқты барлық кластер ресурстарын жояды.