Istio je priročno orodje za povezovanje, varovanje in spremljanje porazdeljenih aplikacij. Istio uporablja različne tehnologije za zagon in upravljanje programske opreme v velikem obsegu, vključno z vsebniki za pakiranje aplikacijske kode in odvisnosti za uvajanje ter Kubernetes za upravljanje teh vsebnikov. Zato morate za delo z Istio vedeti, kako deluje aplikacija z več storitvami, ki temeljijo na teh tehnologijah brez Istio. Če so vam ta orodja in koncepti že znani, lahko preskočite to vadnico in pojdite naravnost na razdelek Namestitev Istio na Google Kubernetes Engine (GKE) ali namestitev razširitve Istio na GKE.
To je vodnik po korakih, v katerem se bomo sprehodili skozi celoten postopek od izvorne kode do vsebnika GKE, da boste s primerom dobili osnovno razumevanje teh tehnologij. Videli boste tudi, kako Istio izkorišča moč teh tehnologij. To predpostavlja, da ne veste ničesar o vsebnikih, Kubernetesu, storitvenih mrežah ali Istiu.
naloge
V tej vadnici boste opravili naslednje naloge:
Učenje preproste aplikacije hello world z več storitvami.
Zaženite aplikacijo iz izvorne kode.
Pakiranje aplikacije v zabojnike.
Ustvarjanje gruče Kubernetes.
Namestitev vsebnikov v gručo.
Preden začnete
Sledite navodilom za omogočanje API-ja Kubernetes Engine:
V tej vadnici lahko uporabite Cloud Shell, ki pripravi virtualni stroj g1-small v Google Compute Engine z Linuxom, ki temelji na Debianu, ali računalnikom Linux ali macOS.
Možnost A: Uporaba Cloud Shell
Prednosti uporabe Cloud Shell:
Razvojna okolja Python 2 in Python 3 (vključno z virtualenv) so popolnoma konfigurirani.
Orodja ukazne vrstice gcloud, Docker, git и kubectl, ki jih bomo uporabljali, so že nameščeni.
Vzorčna aplikacija je napisana v Pythonu in je sestavljena iz dveh komponent, ki sodelujeta z uporabo REST:
strežnik: preprost strežnik z eno končno točko DOBITI, /, ki natisne "hello world" na konzolo.
loadgen: skripta, ki pošilja promet na strežnik, z nastavljivim številom zahtev na sekundo.
Zagon aplikacije iz izvorne kode
Če želite raziskati vzorčno aplikacijo, jo zaženite v Cloud Shell ali v računalniku.
1) V katalogu istio-samples/sample-apps/helloserver teči strežnik:
python3 server/server.py
Ob zagonu strežnik prikaže se naslednje:
INFO:root:Starting server...
2) Odprite drugo terminalsko okno, kamor želite poslati zahteve strežnik. Če uporabljate Cloud Shell, kliknite ikono za dodajanje, da odprete novo sejo.
3) Pošljite zahtevo na strežnik:
curl http://localhost:8080
strežnik odgovori:
Hello World!
4) Iz imenika, v katerega ste prenesli vzorčno kodo, pojdite v imenik, ki vsebuje loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Z omrežnega vidika se celotna aplikacija izvaja na enem samem gostitelju (lokalni računalnik ali virtualni stroj Cloud Shell). Zato lahko uporabite localhostza pošiljanje zahtev strežnik.
10) Ustaviti loadgen и strežnik, vnesite Ctrl-c v vsakem terminalskem oknu.
11) V oknu terminala loadgen deaktiviraj virtualno okolje:
deactivate
Pakiranje aplikacije v zabojnike
Če želite zagnati aplikacijo na GKE, morate zapakirati vzorčno aplikacijo − strežnik и loadgen - v posode. Vsebnik je način pakiranja aplikacije, ki jo izolira od okolja.
Če želite aplikacijo zapakirati v vsebnik, potrebujete Dockerfile. Dockerfile je besedilna datoteka, ki definira ukaze za vgradnjo izvorne kode aplikacije in njenih odvisnosti Dockerjeva slika. Ko je zgrajena, naložite sliko v register vsebnikov, kot je Docker Hub ali Register zabojnikov.
Primer že ima Dockerfile za strežnik и loadgen z vsemi potrebnimi ukazi za zbiranje slik. Spodaj - Dockerfile za strežnik:
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" ]
Ekipa IZ python:3-slim kot osnova pove Dockerju, naj uporabi najnovejšo Slika Python 3 kot osnova.
Ekipa KOPIRATI. . kopira izvorne datoteke v trenutni delovni imenik (v našem primeru samo server.py) v datotečni sistem vsebnika.
VSTOPNA TOČKA definira ukaz, ki se uporablja za zagon vsebnika. V našem primeru je ta ukaz skoraj enak tistemu, ki ste ga zagnali server.py iz izvorne kode.
Ekipa IZPOSTAVITEV kaže na to strežnik čaka na podatke skozi vrata 8080. Ta ekipa ni zagotavlja pristanišča. To je neke vrste dokumentacija, ki je potrebna za odpiranje vrat 8080 pri zagonu posode.
Priprava na kontejneriziranje vaše aplikacije
1) Nastavite naslednje spremenljivke okolja. Zamenjati PROJECT_ID na vaš ID projekta GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Uporaba vrednosti PROJECT_ID и GCR_REPO sliko Dockerja označite, ko jo sestavite, in jo potisnete v zasebni register vsebnikov.
2) Nastavite privzeti projekt GCP za orodje ukazne vrstice gcloud.
gcloud config set project $PROJECT_ID
3) Nastavite privzeto območje za orodje ukazne vrstice gcloud.
gcloud config set compute/zone us-central1-b
4) Prepričajte se, da je storitev Container Registry omogočena v projektu GCP.
Preglejte seznam slik v skladišču in preverite, ali so bile slike naložene:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Ukaz prikaže imena na novo naloženih slik:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Ustvarjanje gruče GKE.
Te vsebnike je mogoče zagnati v virtualnem računalniku Cloud Shell ali v računalniku z ukazom Docker teče. Toda v produkcijskem okolju potrebujete način za centralno orkestriranje vsebnikov. Potrebujete na primer sistem, ki zagotavlja, da se vsebniki vedno izvajajo, in potrebujete način za povečanje in vrtenje dodatnih primerkov vsebnikov, če se promet poveča.
Za zagon kontejnerskih aplikacij lahko uporabite G.K.E.. GKE je platforma za orkestracijo vsebnikov, ki združuje virtualne stroje v gručo. Vsak virtualni stroj se imenuje vozlišče. Grozdi GKE temeljijo na odprtokodnem sistemu za upravljanje gruč Kubernetes. Kubernetes zagotavlja mehanizme za interakcijo z gručo.
Ekipa gcloud ustvari gručo istioready v projektu GCP in privzetem območju, ki ste ga določili. Za zagon Istio priporočamo, da imate vsaj 4 vozlišča in virtualni stroj n1-standard-2.
Ekipa ustvari gručo v nekaj minutah. Ko je gruča pripravljena, ukaz izpiše nekaj takega sporočilo.
2) Vnesite poverilnice v orodju ukazne vrstice kubectlče ga želite uporabiti za upravljanje gruče:
3) Zdaj lahko s Kubernetesom komunicirate prek kubectl. Naslednji ukaz lahko na primer ugotovi stanje vozlišč:
kubectl get nodes
Ukaz ustvari seznam vozlišč:
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
Ključni koncepti Kubernetes
Diagram prikazuje aplikacijo na GKE:
Preden namestite vsebnike v GKE, se naučite ključnih konceptov Kubernetesa. Na samem koncu so povezave, če želite izvedeti več.
Vozlišča in grozdi. V GKE je vozlišče navidezni stroj. Na drugih platformah Kubernetes je lahko vozlišče računalnik ali virtualni stroj. Grozd je zbirka vozlišč, ki jih je mogoče obravnavati kot eno samo enoto, kjer uvedete posodobljeno aplikacijo.
Stroki. V Kubernetesu vsebniki delujejo v podih. Pod v Kubernetesu je nedeljiva enota. Pod vsebuje eno ali več posod. Razmestite vsebnike strežnika in loadgen v ločenih strokih. Ko je v sklopu več vsebnikov (na primer aplikacijski strežnik in proxy strežnik), se vsebniki upravljajo kot ena entiteta in si delijo vire podov.
Razmestitve. V Kubernetesu je razmestitev objekt, ki je zbirka enakih sklopov. Razmestitev zažene več replik podov, porazdeljenih po vozliščih gruče. Uvedba samodejno zamenja pode, ki so odpovedali ali se ne odzivajo.
Storitev Kubernetes. Pri izvajanju kode aplikacije v GKE je povezava med loadgen и strežnik. Ko ste zagnali storitve na virtualnem računalniku ali namizju Cloud Shell, ste poslali zahteve na strežnik ob localhost: 8080. Ko so moduli nameščeni v GKE, se izvedejo na razpoložljivih vozliščih. Privzeto nimate nadzora nad tem, na katerem vozlišču se pod izvaja, tako da stroki brez stalnih naslovov IP.
Za pridobitev naslova IP za strežnik, morate definirati omrežno abstrakcijo na vrhu podov. Tako je Storitev Kubernetes. Storitev Kubernetes zagotavlja trajno končno točko za niz podov. Nekaj jih je vrste storitev. strežnik uporablja LoadBalancer, ki zagotavlja zunanji naslov IP za stik strežnik izven grozda.
Kubernetes ima tudi vgrajen sistem DNS, ki dodeljuje imena DNS (npr. helloserver.default.cluster.local) storitve. Zahvaljujoč temu podi znotraj gruče komunicirajo z drugimi podi v gruči na stalnem naslovu. Imena DNS ni mogoče uporabiti zunaj gruče, na primer v Cloud Shell ali v računalniku.
Kubernetes se manifestira
Ko ste zagnali aplikacijo iz vira, ste uporabili nujni ukaz python3
server.py
Imperativ implicira glagol: "naredi to."
Kubernetes uporablja deklarativni model. To pomeni, da Kubernetesu ne povemo točno, kaj naj naredi, temveč opišemo želeno stanje. Na primer, Kubernetes po potrebi zažene in ustavi sklope, da ohrani dejansko stanje sistema v skladu z želenim stanjem.
Želeno stanje označite v manifestih ali datotekah YAML. Datoteka YAML vsebuje specifikacije za enega ali več predmetov Kubernetes.
Primer vsebuje datoteko YAML za strežnik и loadgen. Vsaka datoteka YAML določa želeno stanje objekta razmestitve in storitve Kubernetes.
Oddelek spec.predloga definira predlogo pod. V specifikaciji sklopa je polje slika, ki določa ime slike, ki jo želite ekstrahirati iz registra vsebnikov.
LoadBalancer: odjemalci pošljejo zahteve na naslov IP izravnalnika obremenitve, ki ima trajni naslov IP in je dostopen zunaj gruče.
ciljna vrata: kot se spomnite, ekipa IZPOSTAVLJENOST 8080 в Dockerfile ni zagotovil pristanišč. Vi zagotovite pristanišče 8080tako da lahko kontaktirate posodo strežnik zunaj grozda. V našem primeru hellosvc.default.cluster.local:80 (kratko ime: zdravovc) ustreza pristanišču 8080 Pod naslovi IP helloserver.
pristanišče: To je številka vrat, kamor bodo druge storitve v gruči pošiljale zahteve.
loadgen.yaml
Razmestitveni objekt za loadgen.yaml izgleda kot strežnik.yaml. Razlika je v tem, da objekt razmestitve vsebuje razdelek env. Določa spremenljivke okolja, ki so potrebne loadgen in ki ste ga namestili med izvajanjem aplikacije iz vira.
Enkrat loadgen ne sprejema vhodnih zahtevkov, za področje tip naveden GrozdIP. Ta vrsta zagotavlja trajni naslov IP, ki ga lahko uporabljajo storitve v gruči, vendar ta naslov IP ni izpostavljen zunanjim odjemalcem.
Zamenjati PROJECT_ID na vaš ID projekta GCP.
9) Shranite in zaprite loadgen.yaml, zaprite urejevalnik besedil.
10) Razmestite datoteko YAML v Kubernetes:
kubectl apply -f loadgen.yaml
Po uspešnem zaključku ukaz ustvari naslednjo kodo:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Preverite stanje strokov:
kubectl get pods
Ukaz prikazuje stanje:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Ekstrahirajte dnevnike aplikacij iz sklopa loadgen. Zamenjati POD_ID na identifikator iz prejšnjega odgovora.
kubectl logs loadgenerator-POD_ID
13) Pridobite zunanje naslove IP zdravovc:
kubectl get service
Odgovor na ukaz je videti nekako takole:
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) Pošljite zahtevo na zdravovc: zamenjati EXTERNAL_IP na zunanji naslov IP zdravovc.
curl http://EXTERNAL_IP
Prevzemimo Istio
V GKE že imate nameščeno aplikacijo. loadgen lahko uporablja Kubernetes DNS (pozdravljeni:80), na katerega želite poslati zahteve strežnikin lahko pošljete zahteve na strežnik po zunanjem naslovu IP. Čeprav ima Kubernetes veliko funkcij, manjka nekaj informacij o storitvah:
Kako storitve medsebojno delujejo? Kakšna so razmerja med storitvami? Kako poteka promet med storitvami? Ali se zavedate, da loadgen pošilja zahteve na strežnik, vendar si predstavljajte, da o aplikaciji ne veste ničesar. Da bi odgovorili na ta vprašanja, si poglejmo seznam tekočih podov v GKE.
Metrike. Kako dolgo strežnik odgovori na dohodno zahtevo? Koliko zahtev na sekundo prejme strežnik? Ali daje sporočila o napakah?
Varnostne informacije. Promet med loadgen и strežnik samo gre skozi HTTP ali z mTLS?
Istio odgovarja na vsa ta vprašanja. Da bi to naredil, Istio postavi stranski proxy Odposlanec v vsakem stroku. Envoy proxy prestreže ves dohodni in odhodni promet do vsebnikov aplikacij. To pomeni, da strežnik и loadgen prejemati prek stranskega posrednika Envoy in ves promet iz loadgen к strežnik poteka prek posrednika Envoy.
Povezave med posredniki Envoy tvorijo storitveno mrežo. Storitvena mrežna arhitektura zagotavlja plast nadzora na vrhu Kubernetesa.
Ker posredniki Envoy delujejo v svojih vsebnikih, je Istio mogoče namestiti na vrh gruče GKE brez skoraj nobenih sprememb kode aplikacije. Vendar ste opravili nekaj dela, da bi vašo aplikacijo pripravili za upravljanje s strani Istio:
Storitve za vse kontejnerje. Na razmestitve strežnik и loadgen vezan na storitev Kubernetes. celo loadgen, ki ne prejema vhodnih zahtev, obstaja storitev.
Vrata v storitvah morajo imeti imena. Čeprav lahko storitvena vrata ostanejo neimenovana v GKE, Istio zahteva, da jih določite ime pristanišča v skladu z njegovim protokolom. V datoteki YAML vrata za strežnik imenovano httpker strežnik uporablja protokol HTTP... Če Storitev uporablja gRPC, bi poimenovali pristanišče grpc.
Razmestitve so označene. Zato lahko uporabite Istiove funkcije za upravljanje prometa, kot je delitev prometa med različicami iste storitve.
Namestitev Istio
Istio lahko namestite na dva načina. Lahko omogoči Istio na razširitvi GKE ali namestite odprtokodno različico Istio na grozdu. Z Istio na GKE lahko preprosto upravljate namestitve in nadgradnje Istio v celotnem življenjskem ciklu gruče GKE. Če želite najnovejšo različico Istio ali več nadzora nad konfiguracijo nadzorne plošče Istio, namestite odprtokodno različico namesto razširitve Istio na GKE. Za odločitev o pristopu preberite članek Ali potrebujem Istio na GKE?.
Izberite možnost, preberite ustrezen vodnik in sledite navodilom za namestitev Istio v vašo gručo. Če želite uporabljati Istio s svojo novo uvedeno aplikacijo, omogočajo izvedbo stranske prikolice za imenski prostor privzeto.
Čiščenje
Da se izognete bremenitvi vašega računa Google Cloud Platform za vire, ki ste jih uporabili v tej vadnici, izbrišite gručo vsebnika, ko namestite Istio in se igrate z vzorčno aplikacijo. S tem boste odstranili vse vire gruče, kot so računalniške instance, diski in omrežni viri.