Istio-ն հարմար գործիք է բաշխված հավելվածների միացման, ապահովման և մոնիտորինգի համար: Istio-ն օգտագործում է մի շարք տեխնոլոգիաներ՝ ծրագրային ապահովման մասշտաբով գործարկելու և կառավարելու համար, ներառյալ կոնտեյներներ՝ կիրառական ծածկագրերը փաթեթավորելու և տեղակայման համար կախվածությունները, և Kubernetes-ը՝ այդ բեռնարկղերը կառավարելու համար: Հետևաբար, Istio-ի հետ աշխատելու համար դուք պետք է իմանաք, թե ինչպես է աշխատում այս տեխնոլոգիաների վրա հիմնված բազմաթիվ ծառայություններով հավելվածը առանց Իստիո. Եթե այս գործիքներն ու հասկացությունները արդեն ծանոթ են ձեզ, ազատ զգալ բաց թողեք այս ձեռնարկը և անմիջապես անցեք բաժին Istio-ի տեղադրում Google Kubernetes Engine-ում (GKE) կամ ընդլայնման տեղադրում Իստիո GKE-ի վրա.
Սա քայլ առ քայլ ուղեցույց է, որտեղ մենք կանցնենք ողջ գործընթացի միջով սկզբնական կոդից մինչև GKE կոնտեյներ՝ օրինակի միջոցով ձեզ այս տեխնոլոգիաների հիմնական ըմբռնումը տալու համար: Դուք նաև կտեսնեք, թե ինչպես է Istio-ն օգտագործում այս տեխնոլոգիաների ուժը: Սա ենթադրում է, որ դուք ոչինչ չգիտեք բեռնարկղերի, Kubernetes-ի, սպասարկման ցանցերի կամ Istio-ի մասին:
խնդիրները
Այս ձեռնարկում դուք կկատարեք հետևյալ առաջադրանքները.
Սովորելով մի պարզ բարև աշխարհ հավելված՝ բազմաթիվ ծառայություններով:
Գործարկեք հավելվածը սկզբնական կոդից:
Հավելվածի փաթեթավորում տարաներով:
Kubernetes կլաստերի ստեղծում:
Կոնտեյներների տեղակայում կլաստերի մեջ:
Նախքան սկսելը
Հետևեք հրահանգներին՝ Kubernetes Engine API-ն միացնելու համար.
Այս ձեռնարկում կարող եք օգտագործել Cloud Shell-ը, որը պատրաստում է վիրտուալ մեքենան g1-small Google Compute Engine-ում Debian-ի վրա հիմնված Linux-ի կամ 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" ]
Թիմ Պիթոնից:3-բարակ որպես հիմք ասում է Docker-ին օգտագործել վերջինը Python 3 պատկեր որպես հիմք:
Թիմ ՊԱՏՃԱՌ. . պատճենում է աղբյուրի ֆայլերը ընթացիկ աշխատանքային գրացուցակում (միայն մեր դեպքում server.py) կոնտեյների ֆայլային համակարգին:
ՄՈՒՏՔԻ ԿԵՏ սահմանում է հրամանը, որն օգտագործվում է բեռնարկղը գործարկելու համար: Մեր դեպքում այս հրամանը գրեթե նույնն է, ինչ դուք գործարկում էիք server.py սկզբնական կոդից։
Թիմ ԲԱՑԱՀԱՅՏԵԼ ցույց է տալիս, որ սերվեր սպասում է տվյալների պորտի միջոցով 8080. Այս թիմը չէ ապահովում է նավահանգիստներ. Սա ինչ-որ փաստաթուղթ է, որն անհրաժեշտ է նավահանգիստը բացելու համար 8080 կոնտեյները գործարկելիս.
Ձեր դիմումը կոնտեյներականացնելու պատրաստում
1) Սահմանեք հետևյալ միջավայրի փոփոխականները. Փոխարինել PROJECT_ID ձեր GCP նախագծի ID-ին:
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Օգտագործելով արժեքներ PROJECT_ID и GCR_REPO դուք նշում եք Docker պատկերը, երբ այն կառուցում եք և այն մղում մասնավոր կոնտեյներային ռեգիստր:
2) Սահմանեք լռելյայն GCP նախագիծը հրամանի տողի գործիքի համար gcloud.
Վերանայեք պահեստի պատկերների ցանկը և հաստատեք, որ պատկերները վերբեռնված են.
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 վիրտուալ մեքենայի վրա կամ հրամանով համակարգչի վրա docker վազում. Բայց արտադրական միջավայրում ձեզ անհրաժեշտ է միջոց՝ կոնտեյներները կենտրոնական կերպով կազմակերպելու համար: Օրինակ, ձեզ անհրաժեշտ է համակարգ, որը երաշխավորում է, որ բեռնարկղերը միշտ աշխատում են, և ձեզ անհրաժեշտ է միջոց՝ մեծացնելու և պտտելու լրացուցիչ կոնտեյներների օրինակները, եթե երթևեկությունը մեծանա:
Կոնտեյներային հավելվածներ գործարկելու համար կարող եք օգտագործել Գ.Կ.Ե.. GKE-ը կոնտեյներային նվագախմբային հարթակ է, որը միավորում է վիրտուալ մեքենաները կլաստերի մեջ: Յուրաքանչյուր վիրտուալ մեքենա կոչվում է հանգույց: GKE կլաստերները հիմնված են բաց կոդով Kubernetes կլաստերի կառավարման համակարգի վրա: Kubernetes-ն ապահովում է կլաստերի հետ փոխազդելու մեխանիզմներ։
Թիմ gcloud ստեղծում է Istioready կլաստեր 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-ի այլ հարթակներում հանգույցը կարող է լինել համակարգիչ կամ վիրտուալ մեքենա: Կլաստերը հանգույցների հավաքածու է, որը կարելի է համարել մեկ միավոր, որտեղ դուք տեղակայում եք կոնտեյներացված հավելված:
Ոտքեր. Kubernetes-ում բեռնարկղերը աշխատում են պատիճներով: Pod-ը Kubernetes-ում անբաժանելի միավոր է: Pod-ը պարունակում է մեկ կամ մի քանի տարա: Դուք տեղադրում եք սերվերի կոնտեյներներ և բեռնիչ առանձին պատյաններով: Երբ պատիճում կան մի քանի բեռնարկղեր (օրինակ՝ հավելվածի սերվեր և պրոքսի սերվեր), բեռնարկղերը կառավարվում են որպես մեկ միավոր և կիսում են pod ռեսուրսները:
Տեղակայումներ. Kubernetes-ում տեղակայումը օբյեկտ է, որը միանման պատիճների հավաքածու է: Deployment-ը գործարկում է բլոկների մի քանի կրկնօրինակներ, որոնք բաշխված են կլաստերային հանգույցներում: Տեղաբաշխումն ավտոմատ կերպով փոխարինում է ձախողված կամ անպատասխան թողնված բլոկները:
Kubernetes ծառայություն. GKE-ում հավելվածի կոդը գործարկելիս կապը միջև բեռնիչ и սերվեր. Երբ դուք ծառայություններ եք սկսել Cloud Shell վիրտուալ մեքենայի կամ աշխատասեղանի վրա, հարցումներ եք ուղարկել սերվեր ժամը տեղական ցանց ՝ 8080. GKE-ում տեղակայվելուց հետո pods-ը գործարկվում է հասանելի հանգույցների վրա: Լռելյայնորեն, դուք չեք վերահսկում, թե որ հանգույցի վրա է աշխատում պատիճը, այնպես որ դուք պատիճներ մշտական IP հասցեներ չկան:
համար IP հասցե ստանալու համար սերվեր, դուք պետք է սահմանեք ցանցի աբստրակցիա բլոկների վերևում: Ահա թե ինչ է դա Kubernetes ծառայություն. Kubernetes ծառայությունը ապահովում է կայուն վերջնակետ մի շարք pods-ի համար: Կան մի քանիսը ծառայությունների տեսակները. սերվեր օգտագործում LoadBalancer, որն ապահովում է արտաքին IP հասցե կապի համար սերվեր կլաստերի դրսից.
Kubernetes-ն ունի նաև ներկառուցված DNS համակարգ, որը նշանակում է DNS անուններ (օրինակ. helloserver.default.cluster.local) ծառայություններ։ Դրա շնորհիվ կլաստերի ներսում գտնվող պատիճները շփվում են կլաստերի այլ պատիճների հետ մշտական հասցեով: DNS անունը չի կարող օգտագործվել կլաստերից դուրս, օրինակ՝ Cloud Shell-ում կամ համակարգչում:
Կուբերնետեսը դրսևորվում է
Երբ դիմումը գործարկեցիք աղբյուրից, օգտագործեցիք հրամայական հրամանը python3
server.py
Իմպերատիվը ենթադրում է բայ՝ «արա սա»։
Kubernetes-ը օգտագործում է դեկլարատիվ մոդել. Սա նշանակում է, որ մենք Kubernetes-ին հստակ չենք ասում, թե ինչ անել, այլ ավելի շուտ նկարագրում ենք ցանկալի վիճակը: Օրինակ, Kubernetes-ը սկսում և դադարեցնում է pods, ըստ անհրաժեշտության, որպեսզի համակարգի իրական վիճակը համապատասխանի ցանկալի վիճակին:
Դուք նշում եք ցանկալի վիճակը մանիֆեստներում կամ ֆայլերում ՅԱՄԼ. YAML ֆայլը պարունակում է բնութագրեր մեկ կամ մի քանի Kubernetes օբյեկտների համար:
Օրինակը պարունակում է YAML ֆայլ սերվեր и բեռնիչ. Յուրաքանչյուր YAML ֆայլ սահմանում է տեղակայման օբյեկտի և Kubernetes ծառայության ցանկալի վիճակը:
LoadBalancerՀաճախորդները հարցումներ են ուղարկում բեռի հավասարակշռողի IP հասցեին, որն ունի մշտական IP հասցե և հասանելի է կլաստերի դրսից:
targetPortԻնչպես հիշում եք, թիմը ԲԱՑԱՀԱՅՏՈՒՄ 8080 в dockerfile նավահանգիստներ չի տրամադրել. Դուք տրամադրում եք նավահանգիստը 8080որպեսզի կարողանաք կապ հաստատել կոնտեյների հետ սերվեր կլաստերից դուրս: Մեր դեպքում hellosvc.default.cluster.local:80 (կարճ անուն: hellosvc) համապատասխանում է նավահանգիստին 8080 Pod IP հասցեներ բարև սպասարկող.
նավահանգիստՍա այն նավահանգստի համարն է, որտեղ կլաստերի մյուս ծառայությունները հարցումներ կուղարկեն:
loadgen.yaml
Տեղակայման օբյեկտ դեպի loadgen.yaml նման լինել server.yaml. Տարբերությունն այն է, որ տեղակայման օբյեկտը պարունակում է բաժին նախանձ. Այն սահմանում է շրջակա միջավայրի փոփոխականները, որոնք անհրաժեշտ են բեռնիչ և որը դուք տեղադրել եք հավելվածը աղբյուրից գործարկելիս:
Ժամանակը բեռնիչ չի ընդունում մուտքային հարցումները, ոլորտի համար տիպ նշվեց ClusterIP. Այս տեսակը ապահովում է մշտական IP հասցե, որը կարող են օգտագործել կլաստերի ծառայությունները, սակայն այս IP հասցեն չի ենթարկվում արտաքին հաճախորդներին:
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 վստահված անձի Envoy, եւ ամբողջ երթեւեկությունը բեռնիչ к սերվեր անցնում է Envoy վստահված անձի միջոցով:
Envoy վստահված անձանց միջև կապերը կազմում են ծառայության ցանց: Ծառայության ցանցի ճարտարապետությունը ապահովում է վերահսկողության շերտ Kubernetes-ի վերևում:
Քանի որ Envoy վստահված անձինք աշխատում են իրենց բեռնարկղերում, Istio-ն կարող է տեղադրվել GKE կլաստերի վերևում՝ գրեթե առանց հավելվածի կոդի փոփոխության: Բայց դուք որոշակի աշխատանք եք կատարել, որպեսզի ձեր դիմումը պատրաստ լինի կառավարվելու Istio-ի կողմից.
Ծառայություններ բոլոր բեռնարկղերի համար: Դեպի տեղակայումներ սերվեր и բեռնիչ կապված Kubernetes ծառայության հետ։ Նույնիսկ բեռնիչ, որը մուտքային հարցումներ չի ստանում, կա ծառայություն։
Ծառայությունների նավահանգիստները պետք է ունենան անուններ: Չնայած սպասարկման նավահանգիստները կարող են անանուն մնալ GKE-ում, Istio-ն պահանջում է, որ դուք նշեք նավահանգստի անվանումը իր արձանագրության համաձայն։ YAML ֆայլում պորտը համար սերվեր անվանել HTTPքանի որ սերվերն օգտագործում է արձանագրությունը HTTP. Եթե ծառայություն օգտագործված gRPC, դու անուն կտաս նավահանգիստը grpc.
Տեղակայումները դրոշակավորված են: Հետևաբար, դուք կարող եք օգտագործել Istio-ի երթևեկության կառավարման գործառույթները, օրինակ՝ տրաֆիկի բաժանումը նույն ծառայության տարբերակների միջև:
Տեղադրում
Istio-ն տեղադրելու երկու եղանակ կա. Կարող է միացնել Istio-ն GKE ընդլայնման վրա կամ տեղադրել Istio-ի բաց կոդով տարբերակը կլաստերի վրա։ Istio-ի միջոցով GKE-ում դուք կարող եք հեշտությամբ կառավարել Istio-ի տեղադրումները և թարմացումները GKE կլաստերի կյանքի ցիկլի ընթացքում: Եթե ցանկանում եք ունենալ Istio-ի վերջին տարբերակը կամ ավելի շատ վերահսկել ձեր Istio կառավարման վահանակի կազմաձևումը, տեղադրեք բաց կոդով տարբերակը՝ Istio-ի GKE ընդլայնման փոխարեն: Մոտեցման մասին որոշելու համար կարդացեք հոդվածը Ինձ պետք է Istio-ն GKE-ում:.
Ընտրեք տարբերակ, վերանայեք համապատասխան ուղեցույցը և հետևեք Istio-ն ձեր կլաստերի վրա տեղադրելու հրահանգներին: Եթե ցանկանում եք օգտագործել Istio-ն ձեր նոր տեղակայված հավելվածի հետ, միացնել sidecar-ի իրականացումը անվանատարածքի համար անհոգություն.
Մաքրում
Որպեսզի այս ձեռնարկում օգտագործած ռեսուրսների համար ձեր Google Cloud Platform հաշվից գումար չգանձվի, Istio-ն տեղադրելուց և նմուշ հավելվածի հետ խաղալուց հետո ջնջեք բեռնարկղերի կլաստերը: Սա կհեռացնի բոլոր կլաստերի ռեսուրսները, ինչպիսիք են հաշվողական օրինակները, սկավառակները և ցանցային ռեսուրսները: