Istio is in handich ark foar it ferbinen, befeiligjen en kontrolearjen fan ferspraat applikaasjes. Istio brûkt in ferskaat oan technologyen om software op skaal út te fieren en te behearjen, ynklusyf konteners om applikaasjekoade en ôfhinklikens foar ynset te pakken, en Kubernetes om dy konteners te behearjen. Dêrom, om te wurkjen mei Istio moatte jo witte hoe't in applikaasje mei meardere tsjinsten basearre op dizze technologyen wurket sûnder Istio. As dizze ark en begripen jo al bekend binne, fiel jo frij om dizze tutorial oer te slaan en direkt nei de seksje te gean Ynstallearje Istio op Google Kubernetes Engine (GKE) of it ynstallearjen fan in útwreiding Istio op GKE.
Dit is in stap-foar-stap hantlieding wêr't wy troch it heule proses sille rinne fan boarnekoade oant GKE-kontener om jo in basisbegryp fan dizze technologyen te jaan fia in foarbyld. Jo sille ek sjen hoe't Istio de krêft fan dizze technologyen benut. Dit giet derfan út dat jo neat witte oer konteners, Kubernetes, servicemeshes of Istio.
taken
Yn dizze tutorial sille jo de folgjende taken foltôgje:
Learje in ienfâldige Hello World-applikaasje mei meardere tsjinsten.
Run de applikaasje út boarne koade.
Ferpakking fan de applikaasje yn konteners.
It meitsjen fan in Kubernetes-kluster.
It ynsetten fan konteners yn in kluster.
Foardat'st begjinst
Folgje de ynstruksjes om de Kubernetes Engine API yn te skeakeljen:
Yn dit tutorial kinne jo Cloud Shell brûke, dy't de firtuele masine taret g1-small yn Google Compute Engine mei Debian-basearre Linux, as in Linux- of macOS-kompjûter.
Opsje A: Cloud Shell brûke
Foardielen fan it brûken fan Cloud Shell:
Python 2 en Python 3 ûntwikkelomjouwings (ynklusyf virtualenv) binne folslein ynsteld.
Kommandorigelark gcloud, docker, gean и kubectl, dy't wy sille brûke binne al ynstallearre.
De foarbyldapplikaasje is skreaun yn Python en bestiet út twa komponinten dy't ynteraksje mei RÊST:
tsjinner: ienfâldige tsjinner mei ien einpunt GET, /, dy't "hallo wrâld" op 'e konsole printsje.
loadgen: skript dat stjoert ferkear nei tsjinner, mei in ynstelbere oantal oanfragen per sekonde.
In applikaasje útfiere fanút boarnekoade
Om de foarbyldapplikaasje te ferkennen, útfiere it yn Cloud Shell of op jo kompjûter.
1) Yn 'e katalogus istio-samples/sample-apps/helloserver rinne tsjinner:
python3 server/server.py
By it opstarten tsjinner it folgjende wurdt werjûn:
INFO:root:Starting server...
2) Iepenje in oar terminalfinster om fersiken nei te stjoeren tsjinner. As jo Cloud Shell brûke, klikje dan op it ikoan tafoegje om in oare sesje te iepenjen.
3) Stjoer in fersyk nei tsjinner:
curl http://localhost:8080
tsjinner antwurden:
Hello World!
4) Gean út 'e map wêr't jo de foarbyldkoade ynladen hawwe, nei de map dy't befettet loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Fanút in netwurkperspektyf rint de heule applikaasje op ien host (lokale kompjûter of Cloud Shell firtuele masine). Dêrom kinne jo gebrûk meitsje localhostom fersiken te stjoeren tsjinner.
10) Stopje loadgen и tsjinner, ynfier Ctrl-c yn elk terminalfinster.
11) Yn it terminalfinster loadgen de firtuele omjouwing deaktivearje:
deactivate
Ferpakking fan in applikaasje yn konteners
Om de applikaasje op GKE út te fieren, moatte jo de foarbyldapplikaasje ynpakke - tsjinner и loadgen - yn konteners. In kontener is in manier om in applikaasje te ferpakken om it te isolearjen fan har omjouwing.
Om in applikaasje yn in kontener te ferpakken, moatte jo dockerfile. dockerfile is in teksttriem dat kommando's definiearret foar it bouwen fan 'e boarnekoade fan' e applikaasje en syn ôfhinklikens Docker ôfbylding. Ienris boud, uploade jo de ôfbylding nei in kontenerregister lykas Docker Hub of Container Registry.
It foarbyld hat al dockerfile foar tsjinner и loadgen mei alle nedige kommando's om ôfbyldings te sammeljen. Ûnder - dockerfile foar tsjinner:
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" ]
team FROM python: 3-slim as basis fertelt Docker de lêste te brûken Python 3 ôfbylding as basis.
team KOPY. . kopiearret de boarnebestannen nei de aktive wurkmap (allinich yn ús gefal server.py) nei it bestânsysteem fan 'e kontener.
YNGONGSPUNT definiearret it kommando dat wurdt brûkt om de kontener te starten. Yn ús gefal is dit kommando hast itselde as dejinge dy't jo dien hawwe server.py út boarne koade.
team BLOOTSTELLING jout dat oan tsjinner wachtet op gegevens troch de haven 8080. Dit team is net jout havens. Dit is in soarte fan dokumintaasje dy't nedich is om de haven te iepenjen 8080 by it starten fan de kontener.
Tariede op containerize jo applikaasje
1) Stel de folgjende omjouwingsfariabelen yn. Ferfange PROJECT_ID nei jo GCP-projekt-ID.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Mei help fan wearden PROJECT_ID и GCR_REPO jo tagje de Docker-ôfbylding as jo it bouwe en triuwe it nei in privee kontenerregister.
2) Stel it standert GCP-projekt yn foar it kommandorigelark gcloud.
gcloud config set project $PROJECT_ID
3) Stel de standertsône yn foar it kommandorigelark gcloud.
gcloud config set compute/zone us-central1-b
4) Soargje derfoar dat de tsjinst Container Registry is ynskeakele yn it GCP-projekt.
Kontrolearje de list mei ôfbyldings yn 'e repository en ferifiearje dat de ôfbyldings binne opladen:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
It kommando toant de nammen fan de nij opladen ôfbyldings:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
It meitsjen fan in GKE-kluster.
Dizze konteners kinne wurde útfierd op in Cloud Shell firtuele masine of op in kompjûter mei it kommando docker run. Mar yn in produksjeomjouwing hawwe jo in manier nedich om konteners sintraal te orkestrearjen. Jo hawwe bygelyks in systeem nedich dat derfoar soarget dat konteners altyd rinne, en jo hawwe in manier nedich om ekstra kontenereksimplaren op te skaaljen en op te spinnen as ferkear ferheget.
Om containerized applikaasjes út te fieren kinne jo brûke G.K.E.. GKE is in kontenerorkestraasjeplatfoarm dat firtuele masines aggregearret yn in kluster. Elke firtuele masine wurdt in knooppunt neamd. GKE-klusters binne basearre op it iepen boarne Kubernetes-klusterbehearsysteem. Kubernetes leveret meganismen foar ynteraksje mei it kluster.
team gcloud makket in istioready-kluster yn it GCP-projekt en standertsône dy't jo opjûn hawwe. Om Istio út te fieren, riede wy oan om op syn minst 4 knopen en in firtuele masine te hawwen n1-standert-2.
It team makket it kluster yn in pear minuten. As it kluster klear is, jout it kommando soksawat út berjocht.
2) Jou bewiisbrieven yn it kommandorigelark kubectlom it te brûken om it kluster te behearjen:
3) No kinne jo kommunisearje mei Kubernetes fia kubectl. Bygelyks kin it folgjende kommando de status fan knopen fine:
kubectl get nodes
It kommando produsearret in list mei knopen:
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 Key Concepts
It diagram lit in applikaasje op GKE sjen:
Foardat jo konteners yn GKE ynsette, learje de kaaibegripen fan Kubernetes. D'r binne links oan 'e ein as jo mear wolle leare.
Knooppunten en klusters. Yn GKE is in knooppunt in firtuele masine. Op oare Kubernetes-platfoarms kin in knooppunt in kompjûter of in firtuele masine wêze. In kluster is in samling knopen dy't kin wurde beskôge as ien ienheid wêr't jo in kontenerisearre applikaasje ynsette.
Pods. Yn Kubernetes rinne konteners yn pods. In Pod yn Kubernetes is in ûndielbere ienheid. In Pod hâldt ien of mear konteners. Jo ynsette tsjinner containers en loadgen yn aparte pods. As d'r ferskate konteners yn in pod binne (bygelyks in applikaasjetsjinner en proxy tsjinner), konteners wurde beheard as ien entiteit en dielen pod-boarnen.
Deployments. Yn Kubernetes is in ynset in objekt dat in samling identike pods is. Ynset lanseart meardere replika's fan pods ferdield oer klusterknooppunten. Ynset ferfangt automatysk pods dy't mislearre binne of net reagearje.
Kubernetes tsjinst. By it útfieren fan applikaasjekoade yn GKE, de ferbining tusken loadgen и tsjinner. As jo begûn tsjinsten op in Cloud Shell firtuele masine of buroblêd, Jo stjoerde fersiken nei tsjinner at localhost: 8080. Ienris ynset nei GKE, wurde pods útfierd op beskikbere knopen. Standert hawwe jo gjin kontrôle oer hokker knooppunt de pod rint, dus jo poddestuollen gjin permaninte IP-adressen.
Om in IP-adres te krijen foar tsjinner, Jo moatte in netwurkabstraksje definiearje boppe op 'e pods. Dat is wat it is Kubernetes tsjinst. De Kubernetes-tsjinst biedt in persistint einpunt foar in set pods. Der binne in pear soarten tsjinsten. tsjinner brûkt LoadBalancer, dy't in ekstern IP-adres leveret om kontakt te meitsjen tsjinner fan bûten it kluster.
Kubernetes hat ek in ynboude DNS-systeem dat DNS-nammen tawize (bygelyks, helloserver.default.cluster.local) tsjinsten. Hjirtroch kommunisearje pods binnen it kluster mei oare podden yn it kluster op in fêst adres. De DNS-namme kin net bûten it kluster brûkt wurde, lykas yn Cloud Shell of op in kompjûter.
Kubernetes manifestearret
As jo de applikaasje fan 'e boarne rûnen, hawwe jo it ymperatyf kommando brûkt python3
server.py
Imperatyf betsjut in tiidwurd: "dit dwaan."
Kubernetes brûkt declarative model. Dit betsjut dat wy Kubernetes net krekt fertelle wat te dwaan, mar leaver de winske steat beskriuwe. Bygelyks, Kubernetes begjint en stopet pods as nedich om te soargjen dat de eigentlike steat fan it systeem oerienkomt mei de winske steat.
Jo jouwe de winske steat oan yn manifesten of triemmen YAML. In YAML-bestân befettet spesifikaasjes foar ien of mear Kubernetes-objekten.
It foarbyld befettet in YAML triem foar tsjinner и loadgen. Elk YAML-bestân spesifisearret de winske steat fan it ynsetobjekt en Kubernetes-tsjinst.
Earste fjild Spec befettet in beskriuwing fan de winske steat.
spec.replicas jout it winske oantal pods oan.
Seksje spec.template definiearret in pod sjabloan. D'r is in fjild yn 'e podspesifikaasje byld, dy't de namme spesifisearret fan 'e ôfbylding dy't ekstrahearre wurde moat út it Container Registry.
LoadBalancer: Klanten stjoere fersiken nei it IP-adres fan 'e loadbalancer, dy't in oanhâldend IP-adres hat en tagonklik is fan bûten it kluster.
targetPort: as jo ûnthâlde, it team EXPOSE 8080 в dockerfile joech gjin havens. Jo jouwe de haven 8080sadat jo kontakt opnimme kinne mei de kontener tsjinner bûten it kluster. Yn ús gefal hellosvc.default.cluster.local:80 (koarte Namme: hellosvc) komt oerien mei de haven 8080 Pod IP-adressen helloserver.
haven: Dit is it poartenûmer dêr't oare tsjinsten yn it kluster fersiken stjoere.
loadgen.yaml
Ynset foarwerp oan loadgen.yaml Liket op server.yaml. It ferskil is dat it ynsetobjekt in seksje befettet sawat. It definiearret de omjouwingsfariabelen dy't nedich binne loadgen en dy't jo ynstalleare by it útfieren fan de applikaasje fan 'e boarne.
Tiid loadgen akseptearret gjin ynkommende oanfragen, foar it fjild type oanjûn ClusterIP. Dit type jout in oanhâldend IP-adres dat tsjinsten yn it kluster brûke kinne, mar dit IP-adres wurdt net bleatsteld oan eksterne kliïnten.
Ferfange PROJECT_ID nei jo GCP-projekt-ID.
9) Bewarje en slute loadgen.yaml, slute de tekstbewurker.
10) Implementearje it YAML-bestân nei Kubernetes:
kubectl apply -f loadgen.yaml
Nei suksesfolle foltôging produseart it kommando de folgjende koade:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Kontrolearje de status fan 'e pods:
kubectl get pods
It kommando toant de status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Extract applikaasje logs út 'e pod loadgen. Ferfange POD_ID nei de ID fan it foarige antwurd.
kubectl logs loadgenerator-POD_ID
13) Krij eksterne IP-adressen hellosvc:
kubectl get service
It kommando-antwurd sjocht der sa út:
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) Stjoer in fersyk nei hellosvc: ferfange EXTERNAL_IP nei eksterne IP-adres hellosvc.
curl http://EXTERNAL_IP
Lit ús nimme op Istio
Jo hawwe al in applikaasje ynset op GKE. loadgen kin Kubernetes DNS (hello:80) om fersiken nei te stjoeren tsjinneren jo kinne fersiken stjoere nei tsjinner troch eksterne IP-adres. Hoewol Kubernetes in protte funksjes hat, ûntbrekt d'r wat ynformaasje oer de tsjinsten:
Hoe ynteraksje tsjinsten? Wat binne de relaasjes tusken tsjinsten? Hoe streamt ferkear tusken tsjinsten? Binne jo dat bewust loadgen stjoert fersiken nei tsjinner, mar stel jo foar dat jo neat witte oer de applikaasje. Om dizze fragen te beantwurdzjen, litte wy sjen nei de list mei rinnende pods yn GKE.
Metrics. Hoe lang tsjinner reagearret op in ynkommend fersyk? Hoefolle oanfragen per sekonde wurde ûntfongen troch de tsjinner? Jout it flaterberjochten?
Feiligens ynformaasje. Ferkear tusken loadgen и tsjinner giet gewoan troch HTTP of troch mTLS?
Istio beantwurdet al dizze fragen. Om dit te dwaan pleatst Istio in sidecar-proxy envoy yn elke pod. De Envoy-proxy ûnderskept alle ynkommende en útgeande ferkear nei applikaasjekonteners. It betsjut dat tsjinner и loadgen ûntfange fia sidecar proxy Envoy, en alle ferkear fan loadgen к tsjinner giet troch de Envoy proxy.
Ferbinings tusken Envoy-proxies foarmje in tsjinstmesh. De tsjinstmesh-arsjitektuer leveret in laach fan kontrôle boppe op Kubernetes.
Sûnt Envoy-proxy's rinne yn har eigen konteners, kin Istio ynstalleare wurde boppe op in GKE-kluster mei hast gjin feroarings oan 'e applikaasjekoade. Mar jo hawwe wat wurk dien om jo applikaasje klear te meitsjen om te wurde beheard troch Istio:
Tsjinsten foar alle konteners. Oan ynset tsjinner и loadgen ferbûn oan de Kubernetes-tsjinst. Sels loadgen, dy't net ûntfange ynkommende oanfragen, der is in tsjinst.
Havens yn tsjinsten moatte nammen hawwe. Hoewol't tsjinst havens kinne ferlitten sûnder namme yn GKE, Istio fereasket dat jo oantsjutte haven namme yn oerienstimming mei syn protokol. Yn it YAML-bestân de poarte foar tsjinner wurdt neamd httpom't de tsjinner it protokol brûkt HTTP... As betsjinning brûkt gRPC, jo soene de poarte neame grpc.
Ynset wurde markearre. Dêrom kinne jo Istio's ferkearsbehearfunksjes brûke, lykas ferkear splitsen tusken ferzjes fan deselde tsjinst.
Ynstallaasje
D'r binne twa manieren om Istio te ynstallearjen. Kinne ynskeakelje Istio op GKE útwreiding of ynstallearje de iepen boarne ferzje fan Istio op it kluster. Mei Istio op GKE kinne jo maklik Istio-ynstallaasjes en upgrades beheare yn 'e heule GKE-klusterlibbenssyklus. As jo de lêste ferzje fan Istio wolle of mear kontrôle oer jo konfiguraasje fan jo Istio-kontrôlepaniel, ynstallearje dan de iepen boarne ferzje ynstee fan de Istio op GKE-útwreiding. Om te besluten oer de oanpak, lês it artikel Haw ik nedich Istio op GKE?.
Selektearje in opsje, besjoch de passende hantlieding, en folgje de ynstruksjes om Istio op jo kluster te ynstallearjen. As jo Istio wolle brûke mei jo nij ynset applikaasje, ynskeakelje sidecar ymplemintaasje foar nammeromte standert.
Reiniging
Om foar te kommen dat jo op jo Google Cloud Platform-akkount yn rekken brocht wurde foar de boarnen dy't jo yn dizze tutorial hawwe brûkt, wiskje it kontenerkluster as jo Istio hawwe ynstalleare en spielje mei de foarbyldapplikaasje. Dit sil alle klusterboarnen fuortsmite, lykas komputerynstânsjes, skiven en netwurkboarnen.