Istio ass e praktescht Tool fir verdeelt Uwendungen ze verbannen, ze sécheren an ze iwwerwaachen. Istio benotzt eng Vielfalt vun Technologien fir Software op Skala ze lafen an ze verwalten, dorënner Container fir Applikatiounscode an Ofhängegkeete fir Deployment ze packen, a Kubernetes fir dës Container ze managen. Dofir, fir mat Istio ze schaffen, musst Dir wësse wéi eng Applikatioun mat ville Servicer baséiert op dësen Technologien funktionnéiert ouni Istio. Wann dës Tools a Konzepter Iech scho vertraut sinn, fillt Iech gratis dësen Tutorial ze iwwersprangen a gitt direkt an d'Sektioun Installéiert Istio op Google Kubernetes Engine (GKE) oder eng Extensioun installéieren Istio op GKE.
Dëst ass e Schrëtt-fir-Schrëtt Guide wou mir de ganze Prozess vu Quellcode bis GKE Container duerchgoën fir Iech e Basisverständnis vun dësen Technologien duerch e Beispill ze ginn. Dir gesitt och wéi Istio d'Kraaft vun dësen Technologien benotzt. Dëst gëtt ugeholl datt Dir näischt iwwer Container, Kubernetes, Service Meshes oder Istio wësst.
Aufgaben
An dësem Tutorial wäert Dir déi folgend Aufgaben ausfëllen:
Léiert eng einfach Hallo Welt Applikatioun mat ville Servicer.
Run der Applikatioun vum Quellcode.
Verpackt d'Applikatioun an Containeren.
Erstellt e Kubernetes Cluster.
Behälter an e Cluster ofsetzen.
Ier Dir ufänken
Follegt d'Instruktioune fir de Kubernetes Engine API z'aktivéieren:
An dësem Tutorial kënnt Dir Cloud Shell benotzen, déi d'virtuell Maschinn virbereet g1-kleng an Google Compute Engine mat Debian-baséiert Linux, oder engem Linux oder macOS Computer.
Optioun A: Benotzt Cloud Shell
Virdeeler vum Cloud Shell benotzen:
Python 2 a Python 3 Entwécklungsëmfeld (inklusiv virtualenv) komplett konfiguréiert sinn.
Kommando Linn Tools gcloud, Docker, Go и kubectl, déi mir benotze wäerte scho installéiert sinn.
D'Probeapplikatioun ass am Python geschriwwen a besteet aus zwee Komponenten déi mat interagéieren Rescht:
Server: Einfach Server mat engem Endpunkt GET, /, déi "Hallo Welt" op d'Konsole dréckt.
loadgen: Skript datt Verkéier schéckt ze Server, mat enger konfiguréierbarer Unzuel vun Ufroen pro Sekonn.
Lafen eng Applikatioun aus Quellcode
Fir d'Probeapplikatioun ze entdecken, lafen se an der Cloud Shell oder op Ärem Computer.
1) Am Katalog istio-samples/sample-apps/helloserver lafen Server:
python3 server/server.py
Beim Startup Server folgend gëtt ugewisen:
INFO:root:Starting server...
2) Öffnen eng aner Terminalfenster fir Ufroen ze schécken Server. Wann Dir Cloud Shell benotzt, klickt op d'Add Ikon fir eng aner Sessioun opzemaachen.
3) Schéckt eng Ufro un Server:
curl http://localhost:8080
Server Äntwerten:
Hello World!
4) Vum Verzeechnes wou Dir de Probecode erofgelueden hutt, gitt an de Verzeechnes deen enthält loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Aus enger Netzwierkperspektiv leeft déi ganz Applikatioun op engem eenzegen Host (lokale Computer oder Cloud Shell virtuell Maschinn). Dofir kënnt Dir benotzen localhostUfroen ze schécken Server.
10) Stoppen loadgen и Server, enter Ctrl-c an all Terminalfenster.
11) An der Terminalfenster loadgen desaktivéiere virtuell Ëmfeld:
deactivate
Verpakung eng Applikatioun a Container
Fir d'Applikatioun op GKE ze lafen, musst Dir d'Beispillapplikatioun packen - Server и loadgen - an Container. E Container ass e Wee fir eng Applikatioun ze packen fir se vu senger Ëmwelt ze isoléieren.
Fir eng Applikatioun an e Container ze packen, braucht Dir dockerfile. dockerfile ass eng Textdatei déi Kommandoen definéiert fir de Quellcode vun der Applikatioun a seng Ofhängegkeeten ze bauen Docker Bild. Eemol gebaut, lued Dir d'Bild an e Container Registry wéi Docker Hub oder Container Registry.
D'Beispill huet schonn dockerfile fir Server и loadgen mat all déi néideg Kommandoen fir Biller ze sammelen. Drënner - dockerfile fir Server:
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" ]
Equipe VUN Python: 3-schlank als Basis erzielt Docker déi lescht ze benotzen Python 3 Bild als Basis.
Equipe COPY. . kopéiert d'Quelldateien an den aktuellen Aarbechtsverzeichnis (nëmmen an eisem Fall server.py) an de Dateiesystem vum Container.
ENTRYPOINT definéiert de Kommando deen benotzt gëtt fir de Container ze starten. An eisem Fall ass dëse Kommando bal d'selwecht wéi deen deen Dir benotzt fir ze lafen server.py aus Quellcode.
Equipe EXPOSÉIEREN weist dat un Server waart op Daten duerch den Hafen 8080. Dës Equipe ass net stellt Häfen. Dëst ass eng Zort Dokumentatioun déi gebraucht gëtt fir den Hafen opzemaachen 8080 beim Start vum Container.
Virbereedung fir Är Applikatioun ze containeriséieren
1) Setzt déi folgend Ëmfeldvariablen. Ersetzen PROJECT_ID op Är GCP Projet ID.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Benotzt Wäerter PROJECT_ID и GCR_REPO Dir markéiert den Docker Bild wann Dir et baut an dréckt et an e private Container Registry.
2) Setzt de Standard-GCP-Projet fir de Kommandozeil-Tool gcloud.
gcloud config set project $PROJECT_ID
3) Setzt d'Standardzon fir de Kommandozeilinstrument gcloud.
gcloud config set compute/zone us-central1-b
4) Vergewëssert Iech datt de Container Registry Service am GCP Projet aktivéiert ass.
Iwwerpréift d'Lëscht vun de Biller am Repository a kontrolléiert datt d'Biller eropgeluede goufen:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
De Kommando weist d'Nimm vun den nei eropgelueden Biller:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Erstellt e GKE Cluster.
Dës Container kënnen op enger Cloud Shell virtueller Maschinn oder op engem Computer mam Kommando lafen Docker lafen. Awer an engem Produktiounsëmfeld braucht Dir e Wee fir Container zentral ze orchestréieren. Zum Beispill, Dir braucht e System deen sécher ass datt Container ëmmer lafen, an Dir braucht e Wee fir zousätzlech Containerinstanzen opzebauen an ze spinn wann de Traffic eropgeet.
Fir containeriséiert Uwendungen auszeféieren, kënnt Dir benotzen G.K.E.. GKE ass eng Container Orchestratiounsplattform déi virtuell Maschinnen an e Cluster aggregéiert. All virtuell Maschinn gëtt en Node genannt. GKE Cluster baséieren op dem Open Source Kubernetes Cluster Management System. Kubernetes bitt Mechanismen fir mat dem Cluster ze interagéieren.
Equipe gcloud erstellt en istioready Cluster am GCP-Projet an der Standardzon, déi Dir uginn hutt. Fir Istio ze lafen, recommandéiere mir op d'mannst 4 Noden an eng virtuell Maschinn ze hunn n1-Standard-2.
D'Team erstellt de Cluster an e puer Minutten. Wann de Cluster fäerdeg ass, gëtt de Kommando esou eppes aus Message.
2) Gitt Umeldungsinformatiounen am Kommandozeilinstrument kubectlfir et ze benotzen fir de Cluster ze managen:
3) Elo kënnt Dir mat Kubernetes kommunizéieren via kubectl. Zum Beispill kann de folgende Kommando de Status vun den Noden erausfannen:
kubectl get nodes
De Kommando produzéiert eng Lëscht vun Noden:
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 Schlëssel Konzepter
Den Diagramm weist eng Applikatioun op GKE:
Ier Dir Container an GKE ofsetzt, léiert d'Schlësselkonzepter vu Kubernetes. Et gi Linken um Enn wann Dir méi wëllt léieren.
Noden a Stärekéip. A GKE ass en Node eng virtuell Maschinn. Op anere Kubernetes Plattformen kann en Node e Computer oder eng virtuell Maschinn sinn. E Cluster ass eng Sammlung vun Noden déi als eenzeg Eenheet ugesi kënne ginn, wou Dir eng containeriséierter Applikatioun ofsetzt.
Pods. Zu Kubernetes lafen Container a Pods. E Pod zu Kubernetes ass eng ondeelbar Eenheet. E Pod hält een oder méi Container. Dir deploy Server Container an loadgen an getrennten Stäck. Wann et e puer Container an engem Pod sinn (zum Beispill en Applikatiounsserver an Proxy Server), Container ginn als eenzeg Entitéit geréiert a Podressourcen deelen.
Détachementer. A Kubernetes ass en Détachement en Objet deen eng Sammlung vun identesche Pods ass. Deployment lancéiert verschidde Repliken vu Pods verdeelt iwwer Clusternoden. Deployment ersetzt automatesch Pods déi gescheitert sinn oder net reagéieren.
Kubernetes Service. Wann Dir Applikatiounscode am GKE leeft, ass d'Verbindung tëscht loadgen и Server. Wann Dir Servicer op enger Cloud Shell virtueller Maschinn oder Desktop ugefaang hutt, hutt Dir Ufroe geschéckt Server um localhost: 8080. Eemol op GKE ofgesat, Pods ginn op verfügbare Wirbelen ausgefouert. Par défaut hutt Dir keng Kontroll iwwer wéi en Node de Pod leeft, sou datt Dir pods keng permanent IP Adressen.
Fir eng IP Adress ze kréien fir Server, Dir musst eng Netzwierkabstraktioun uewen op de Pods definéieren. Dat ass wat et ass Kubernetes Service. De Kubernetes Service bitt e persistent Endpunkt fir eng Rei vu Pods. Et ginn e puer Zorte vu Servicer. Server benotzt LoadBalancer, déi eng extern IP Adress ubitt fir ze kontaktéieren Server vun ausserhalb vum Cluster.
Kubernetes huet och en agebauten DNS System deen DNS Nimm zouginn (z. helloserver.default.cluster.local) Servicer. Dank dësem kommunizéieren Pods am Cluster mat anere Pods am Cluster op enger permanenter Adress. Den DNS Numm kann net ausserhalb vum Cluster benotzt ginn, sou wéi an der Cloud Shell oder op engem Computer.
Kubernetes manifestéiert
Wann Dir d'Applikatioun aus der Quell leeft, hutt Dir den Imperativ Kommando benotzt python3
server.py
Imperativ implizéiert e Verb: "maacht dëst."
Kubernetes benotzt deklarativ Modell. Dëst bedeit datt mir Kubernetes net genee soen wat se maache sollen, mä éischter de gewënschten Zoustand beschreiwen. Zum Beispill, Kubernetes fänkt a stoppt Pods wéi néideg fir sécherzestellen datt den aktuellen Zoustand vum System dem gewënschten Zoustand entsprécht.
Dir gitt de gewënschten Zoustand a Manifestatiounen oder Dateien un JAML. Eng YAML Datei enthält Spezifikatioune fir een oder méi Kubernetes Objeten.
D'Beispill enthält eng YAML Datei fir Server и loadgen. All YAML-Datei spezifizéiert de gewënschten Zoustand vum Détachementobjekt a Kubernetes Service.
Éischt Feld Spekulatioun enthält eng Beschreiwung vun der gewënschter Staat.
spec.repliken weist déi gewënscht Zuel vun de Pods un.
Sektioun spec.Schabloun definéiert eng Pod Schabloun. Et gëtt e Feld an der Pod Spezifizéierung Bild, wat den Numm vum Bild spezifizéiert, deen aus dem Container Registry extrahéiert muss ginn.
LoadBalancer: Clientë schécken Ufroen un d'IP Adress vum Lastbalancer, deen eng persistent IP Adress huet an ass vu baussen vum Cluster zougänglech.
targetPort: wéi Dir Iech erënnert, d'Equipe EXPOSITIOUN 8080 в dockerfile huet net Häfen ugebueden. Dir liwwert den Hafen 8080fir datt Dir de Container kontaktéiere kënnt Server ausserhalb vum Stärekoup. An eisem Fall hellosvc.default.cluster.local:80 (kuerzen Numm: hellosvc) entsprécht dem Hafen 8080 Pod IP Adressen halloserver.
port: Dëst ass d'Portnummer wou aner Servicer am Cluster Ufroe schécken.
loadgen.yaml
Détachement Objet ze loadgen.yaml ausgesi wéi server.yaml. Den Ënnerscheed ass datt den Détachementobjekt eng Sektioun enthält schécken. Et definéiert d'Ëmfeldvariablen déi néideg sinn loadgen an déi Dir installéiert hutt wann Dir d'Applikatioun aus der Quell leeft.
Zäiten loadgen akzeptéiert net Entréeën Demanden, fir den Terrain Typ uginn ClusterIP. Dësen Typ liwwert eng persistent IP Adress déi Servicer am Stärekoup benotze kënnen, awer dës IP Adress ass net op externe Clienten ausgesat.
Ersetzen PROJECT_ID op Är GCP Projet ID.
9) Späicheren an zoumaachen loadgen.yaml, den Texteditor zoumaachen.
10) Deploy d'YAML Datei op Kubernetes:
kubectl apply -f loadgen.yaml
Nom erfollegräichen Ofschloss produzéiert de Kommando de folgende Code:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Kuckt de Status vun de Pods:
kubectl get pods
De Kommando weist de Status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Extrait Applikatioun Logbicher aus dem Pod loadgen. Ersetzen POD_ID zum Identifizéierer vun der viregter Äntwert.
kubectl logs loadgenerator-POD_ID
13) Kritt extern IP Adressen hellosvc:
kubectl get service
D'Kommando Äntwert gesäit sou eppes aus:
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) Schéckt eng Ufro un hellosvc: ersetzen EXTERNAL_IP op extern IP Adress hellosvc.
curl http://EXTERNAL_IP
Loosst eis op Istio huelen
Dir hutt schonn eng Applikatioun op GKE ofgesat. loadgen kann Kubernetes DNS benotzen (hello:80) fir Ufroen ze schécken Serveran Dir kënnt Demanden schécken ze Server duerch extern IP Adress. Och wann Kubernetes vill Features huet, fehlt et e puer Informatioun iwwer d'Servicer:
Wéi interagéiere Servicer? Wat sinn d'Relatiounen tëscht Servicer? Wéi fléisst de Verkéier tëscht Servicer? Sidd Dir bewosst, datt loadgen schéckt Demanden un Server, awer stellt Iech vir datt Dir näischt iwwer d'Applikatioun wësst. Fir dës Froen ze beäntweren, kucke mer d'Lëscht vun de lafende Pods am GKE.
Metriken. Wéi laang Server reagéiert op eng erakommen Ufro? Wéi vill Ufroe pro Sekonn ginn vum Server kritt? Gëtt et Fehlermeldungen?
Sécherheet Informatiounen. Verkéier tëscht loadgen и Server geet just duerch HTTP oder vum mTLS?
Istio äntwert all dës Froen. Fir dëst ze maachen, setzt Istio e Sidecar Proxy spécial an all Pod. Den Envoy Proxy interceptéiert all erakommen an erausginn Traffic op Applikatiounscontainer. Et heescht dat Server и loadgen kréien via sidecar Proxy Envoy, an all Verkéier vun loadgen к Server geet duerch den Envoy Proxy.
Verbindungen tëscht Envoy Proxy bilden e Service Mesh. D'Servicemesh-Architektur bitt eng Kontrollschicht uewen op Kubernetes.
Zënter Envoy-Proxyen an hiren eegene Container lafen, kann Istio uewen op engem GKE-Cluster installéiert ginn mat bal keng Ännerungen am Applikatiounscode. Awer Dir hutt e puer Aarbecht gemaach fir Är Applikatioun prett ze kréien fir vun Istio geréiert ze ginn:
Servicer fir all Container. Zu Deployementer Server и loadgen un de Kubernetes Service gebonnen. Souguer loadgen, déi net erakommen Ufroe kritt, gëtt et e Service.
Häfen a Servicer mussen Nimm hunn. Obwuel Service Häfen kann onbenannt an GKE lénks ginn, Istio verlaangt Dir uginn port Numm am Aklang mat sengem Protokoll. An der YAML Datei den Hafen fir Server nennt httpwell Server benotzt de Protokoll HTTP... Wann Service benotzt gRPC, Dir géift den Hafen nennen grpc.
Détachementer sinn markéiert. Dofir kënnt Dir d'Istio Traffic Management Feature benotzen, wéi zum Beispill Traffic opzedeelen tëscht Versioune vum selwechte Service.
Installéiert Istio
Et ginn zwou Weeër fir Istio z'installéieren. Kann aktivéiert Istio op GKE Extensioun oder installéiert d'Open Source Versioun vun Istio op de Cluster. Mat Istio op GKE kënnt Dir einfach Istio Installatiounen an Upgrades am ganze GKE Cluster Liewenszyklus managen. Wann Dir déi lescht Versioun vun Istio oder méi Kontroll iwwer Är Istio Kontrollpanelkonfiguratioun wëllt, installéiere déi Open Source Versioun anstatt d'Istio op GKE Extensioun. Fir iwwer d'Approche ze entscheeden, liest den Artikel Braucht ech Istio op GKE?.
Wielt eng Optioun, iwwerpréift de passenden Guide, a befollegt d'Instruktioune fir Istio op Ärem Cluster z'installéieren. Wann Dir Istio mat Ärer nei ofgebauter Applikatioun benotze wëllt, aktivéiert Sidecar Implementatioun fir Nummraum Standarddrécker.
Botzen
Fir ze vermeiden datt Dir op Äre Google Cloud Plattform Kont berechent sidd fir d'Ressourcen déi Dir an dësem Tutorial benotzt hutt, läscht de Containercluster eemol Dir Istio installéiert hutt a mat der Probeapplikatioun gespillt hutt. Dëst wäert all Clusterressourcen ewechhuelen, sou wéi Recheninstanzen, Disken an Netzwierkressourcen.