Istio je praktičan alat za povezivanje, osiguranje i nadzor distribuiranih aplikacija. Istio koristi različite tehnologije za pokretanje i upravljanje softverom u velikom broju, uključujući spremnike za pakiranje aplikacijskog koda i ovisnosti za implementaciju, te Kubernetes za upravljanje tim spremnicima. Stoga, da biste radili s Istiom, morate znati kako funkcionira aplikacija s više usluga temeljenih na tim tehnologijama bez Istio. Ako su vam ovi alati i koncepti već poznati, slobodno preskočite ovaj vodič i idite ravno na odjeljak Instaliranje Istia na Google Kubernetes Engine (GKE) ili instaliranje ekstenzije Istio na GKE.
Ovo je vodič korak po korak u kojem ćemo proći kroz cijeli proces od izvornog koda do GKE spremnika kako bismo vam kroz primjer pružili osnovno razumijevanje ovih tehnologija. Također ćete vidjeti kako Istio iskorištava snagu ovih tehnologija. Ovo pretpostavlja da ne znate ništa o kontejnerima, Kubernetesu, servisnim mrežama ili Istiu.
zadaci
U ovom ćete vodiču izvršiti sljedeće zadatke:
Učenje jednostavne aplikacije hello world s više usluga.
Pokrenite aplikaciju iz izvornog koda.
Pakiranje aplikacije u kontejnere.
Stvaranje Kubernetes klastera.
Postavljanje spremnika u klaster.
Prije nego što započnete
Slijedite upute za omogućavanje Kubernetes Engine API-ja:
U ovom vodiču možete koristiti Cloud Shell, koji priprema virtualni stroj g1-small u Google Compute Engineu s Linuxom temeljenim na Debianu ili računalom s Linuxom ili macOS-om.
Opcija A: Korištenje Cloud Shell-a
Prednosti korištenja Cloud Shell-a:
Python 2 i Python 3 razvojna okruženja (uključujući virtualenv) potpuno su konfigurirani.
Alati za naredbeni redak gcloud, lučki radnik, git и kubectl, koje ćemo koristiti već su instalirani.
Primjer aplikacije napisan je u Pythonu i sastoji se od dvije komponente koje međusobno djeluju koristeći OSTALO:
server: jednostavan poslužitelj s jednom krajnjom točkom DOBITI, /, koji ispisuje "hello world" na konzolu.
loadgen: skripta koja šalje promet na server, s podesivim brojem zahtjeva u sekundi.
Pokretanje aplikacije iz izvornog koda
Da biste istražili oglednu aplikaciju, pokrenite je u Cloud Shellu ili na svom računalu.
1) U katalogu istio-uzorci/uzorci-aplikacija/helloserver trčanje server:
python3 server/server.py
Prilikom pokretanja server prikazuje se sljedeće:
INFO:root:Starting server...
2) Otvorite drugi prozor terminala za slanje zahtjeva server. Ako koristite Cloud Shell, kliknite ikonu za dodavanje da biste otvorili drugu sesiju.
3) Pošaljite upit na server:
curl http://localhost:8080
server odgovara:
Hello World!
4) Iz direktorija u koji ste preuzeli primjer koda idite na direktorij koji sadrži loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Iz perspektive umrežavanja, cijela aplikacija radi na jednom hostu (lokalno računalo ili Cloud Shell virtualni stroj). Stoga možete koristiti localhostslati zahtjeve server.
10) Prestati loadgen и server, Unesi Ctrl-c u svakom prozoru terminala.
11) U prozoru terminala loadgen deaktiviraj virtualno okruženje:
deactivate
Pakiranje aplikacije u spremnike
Da biste pokrenuli aplikaciju na GKE-u, trebate zapakirati primjer aplikacije − server и loadgen - u spremnici. Spremnik je način za pakiranje aplikacije kako bi se izolirala od okoline.
Za pakiranje aplikacije u spremnik potrebno je dockerfile. dockerfile je tekstualna datoteka koja definira naredbe za ugradnju izvornog koda aplikacije i njegovih ovisnosti Docker slika. Jednom izgrađenu sliku učitavate u registar spremnika kao što je Docker Hub ili Registar kontejnera.
Primjer već ima dockerfile za server и loadgen sa svim potrebnim naredbama za prikupljanje slika. ispod - dockerfile za 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" ]
Momčad IZ python:3-slim kao baza govori Dockeru da koristi najnoviji Python 3 slika kao baza.
Momčad KOPIRATI. . kopira izvorne datoteke u trenutni radni direktorij (samo u našem slučaju server.py) u datotečni sustav spremnika.
ULAZNA TOČKA definira naredbu koja se koristi za pokretanje spremnika. U našem slučaju, ova naredba je gotovo ista kao ona koju ste pokrenuli server.py iz izvornog koda.
Momčad IZLOŽITI ukazuje na to server čeka podatke kroz port 8080. Ova momčad nije pruža luke. Ovo je neka vrsta dokumentacije koja je potrebna za otvaranje porta 8080 prilikom pokretanja kontejnera.
Priprema za kontejneriziranje vaše aplikacije
1) Postavite sljedeće varijable okruženja. Zamijeniti PROJECT_ID na vaš ID GCP projekta.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Korištenje vrijednosti PROJECT_ID и GCR_REPO označite Docker sliku kada je izgradite i gurnete je u privatni registar spremnika.
2) Postavite zadani GCP projekt za alat naredbenog retka gcloud.
gcloud config set project $PROJECT_ID
3) Postavite zadanu zonu za alat naredbenog retka gcloud.
gcloud config set compute/zone us-central1-b
4) Provjerite je li usluga Registra kontejnera omogućena u GCP projektu.
Pregledajte popis slika u repozitoriju i provjerite jesu li slike učitane:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Naredba prikazuje nazive novoučitanih slika:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Stvaranje GKE klastera.
Ti se spremnici mogu pokrenuti na virtualnom računalu Cloud Shell ili na računalu s naredbom vožnja dvoranom. Ali u proizvodnom okruženju potreban vam je način centralnog orkestriranja spremnika. Na primjer, potreban vam je sustav koji osigurava da spremnici uvijek rade i potreban vam je način za skaliranje i pokretanje dodatnih instanci spremnika ako se promet poveća.
Za pokretanje kontejnerskih aplikacija možete koristiti G.K.E.. GKE je platforma za orkestraciju spremnika koja okuplja virtualne strojeve u klaster. Svaki virtualni stroj naziva se čvor. GKE klasteri temelje se na otvorenom sustavu upravljanja klasterima Kubernetes. Kubernetes pruža mehanizme za interakciju s klasterom.
Momčad gcloud stvara istioready klaster u GCP projektu i zadanoj zoni koju ste naveli. Za pokretanje Istio-a preporučujemo da imate najmanje 4 čvora i virtualni stroj n1-standard-2.
Tim stvara klaster u nekoliko minuta. Kada je klaster spreman, naredba ispisuje nešto poput ovoga сообщение.
2) Navedite vjerodajnice u alatu naredbenog retka kubectlda ga koristite za upravljanje klasterom:
3) Sada možete komunicirati s Kubernetesom putem kubectl. Na primjer, sljedeća naredba može saznati status čvorova:
kubectl get nodes
Naredba daje popis čvorova:
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 Kubernetesa
Dijagram prikazuje aplikaciju na GKE:
Prije nego što postavite spremnike u GKE, naučite ključne koncepte Kubernetesa. Na samom kraju nalaze se poveznice ako želite saznati više.
Čvorovi i klasteri. U GKE-u, čvor je virtualni stroj. Na drugim Kubernetes platformama, čvor može biti računalo ili virtualni stroj. Klaster je skup čvorova koji se mogu smatrati jednom jedinicom u kojoj implementirate kontejnersku aplikaciju.
mahune. U Kubernetesu spremnici rade u podovima. Pod u Kubernetesu je nedjeljiva jedinica. Pod sadrži jedan ili više spremnika. Postavite poslužiteljske spremnike i loadgen u zasebnim mahunama. Kada postoji nekoliko spremnika u podu (na primjer, aplikacijski poslužitelj i proxy poslužitelj), spremnicima se upravlja kao jednom cjelinom i dijele resurse modula.
Raspoređivanja. U Kubernetesu, implementacija je objekt koji je zbirka identičnih podova. Implementacija pokreće višestruke replike mahuna raspoređenih po čvorovima klastera. Implementacija automatski zamjenjuje blokove koji nisu uspjeli ili ne reagiraju.
Kubernetes usluga. Kada pokrenete kod aplikacije u GKE-u, veza između loadgen и server. Kada ste pokrenuli usluge na Cloud Shell virtualnom računalu ili radnoj površini, poslali ste zahtjeve na server u localhost: 8080. Nakon što se implementiraju u GKE, podovi se izvršavaju na dostupnim čvorovima. Prema zadanim postavkama, nemate kontrolu nad tim na kojem se čvoru pod izvodi, pa vi mahune nema stalne IP adrese.
Za dobivanje IP adrese za server, trebate definirati mrežnu apstrakciju na vrhu podova. To je ono što je Kubernetes usluga. Usluga Kubernetes pruža trajnu krajnju točku za skup podova. Ima ih nekoliko vrste usluga. server koristi LoadBalancer, koji daje vanjsku IP adresu za kontakt server izvan klastera.
Kubernetes također ima ugrađeni DNS sustav koji dodjeljuje DNS nazive (na primjer, helloserver.default.cluster.local) usluge. Zahvaljujući tome, podovi unutar klastera komuniciraju s ostalim podovima u klasteru na stalnoj adresi. DNS naziv ne može se koristiti izvan klastera, kao što je Cloud Shell ili na računalu.
Kubernetes manifestira
Kada ste pokrenuli aplikaciju iz izvora, koristili ste imperativnu naredbu python3
server.py
Imperativ podrazumijeva glagol: "učini ovo."
Kubernetes koristi deklarativni model. To znači da Kubernetesu ne govorimo točno što treba učiniti, već opisujemo željeno stanje. Na primjer, Kubernetes pokreće i zaustavlja module prema potrebi kako bi osigurao da stvarno stanje sustava odgovara željenom stanju.
Vi označavate željeno stanje u manifestima ili datotekama YAML. YAML datoteka sadrži specifikacije za jedan ili više Kubernetes objekata.
Primjer sadrži YAML datoteku za server и loadgen. Svaka YAML datoteka navodi željeno stanje objekta implementacije i usluge Kubernetes.
Prvo polje specijalan sadrži opis željenog stanja.
spec.replike označava željeni broj mahuna.
Odjeljak spec.predložak definira šablon mahune. Postoji polje u specifikaciji modula slika, koji navodi naziv slike koju je potrebno izdvojiti iz registra spremnika.
LoadBalancer: Klijenti šalju zahtjeve na IP adresu balansera opterećenja, koja ima stalnu IP adresu i dostupna je izvan klastera.
targetPort: kao što se sjećate, tim IZLOŽENOST 8080 в dockerfile nije osigurao luke. Vi osiguravate luku 8080tako da možete kontaktirati kontejner server izvan klastera. U našem slučaju hellosvc.default.cluster.local:80 (kratko ime: bok svc) odgovara luci 8080 Pod IP adrese helloserver.
luka: Ovo je broj priključka na koji će druge usluge u klasteru slati zahtjeve.
loadgen.yaml
Objekt implementacije na loadgen.yaml izgledati poslužitelj.yaml. Razlika je u tome što objekt postavljanja sadrži odjeljak eNV. Definira varijable okoline koje su potrebne loadgen a koje ste instalirali prilikom pokretanja aplikacije iz izvora.
vrijeme loadgen ne prihvaća pristigle zahtjeve, za polj vrsta nepoznat KlasterIP. Ova vrsta pruža trajnu IP adresu koju usluge u klasteru mogu koristiti, ali ta IP adresa nije izložena vanjskim klijentima.
Zamijeniti PROJECT_ID na vaš ID GCP projekta.
9) Spremite i zatvorite loadgen.yaml, zatvorite uređivač teksta.
10) Implementirajte YAML datoteku u Kubernetes:
kubectl apply -f loadgen.yaml
Nakon uspješnog završetka, naredba proizvodi sljedeći kod:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Provjerite status mahuna:
kubectl get pods
Naredba prikazuje status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Ekstrahirajte zapisnike aplikacija iz modula loadgen. Zamijeniti POD_ID na ID iz prethodnog odgovora.
kubectl logs loadgenerator-POD_ID
13) Nabavite vanjske IP adrese bok svc:
kubectl get service
Odgovor na naredbu izgleda otprilike ovako:
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šaljite upit na bok svc: zamijeniti VANJSKI_IP na vanjsku IP adresu bok svc.
curl http://EXTERNAL_IP
Uzmimo Istio
Već imate aplikaciju postavljenu na GKE. loadgen može koristiti Kubernetes DNS (pozdravvc:80) za slanje zahtjeva serveri možete slati zahtjeve na server preko vanjske IP adrese. Iako Kubernetes ima mnogo značajki, nedostaju neke informacije o uslugama:
Kako usluge međusobno djeluju? Kakvi su odnosi između usluga? Kako teče promet između usluga? Jeste li svjesni toga loadgen šalje zahtjeve na server, ali zamislite da ne znate ništa o aplikaciji. Kako bismo odgovorili na ova pitanja, pogledajmo popis pokrenutih podova u GKE-u.
Metrika. Koliko dugo server odgovara na dolazni zahtjev? Koliko zahtjeva u sekundi prima poslužitelj? Daje li poruke o greškama?
Sigurnosne informacije. Promet između loadgen и server samo prolazi HTTP ili po mTLS?
Istio odgovara na sva ova pitanja. Da bi to učinio, Istio postavlja sidecar proxy Izaslanik u svakoj mahuni. Envoy proxy presreće sav dolazni i odlazni promet prema spremnicima aplikacija. To znači da server и loadgen primati preko sidecar proxyja Envoy, i sav promet od loadgen к server ide preko Envoy proxyja.
Veze između Envoy proxyja tvore servisnu mrežu. Servisna mrežasta arhitektura pruža sloj kontrole povrh Kubernetesa.
Budući da Envoy proxyji rade u vlastitim spremnicima, Istio se može instalirati na vrh GKE klastera bez gotovo ikakvih promjena koda aplikacije. Ali učinili ste nešto kako biste svoju aplikaciju pripremili za upravljanje Istioom:
Servis za sve kontejnere. Za raspoređivanja server и loadgen vezan uz uslugu Kubernetes. Čak loadgen, koji ne prima dolazne zahtjeve, postoji usluga.
Priključci u uslugama moraju imati imena. Iako servisni priključci mogu ostati neimenovani u GKE-u, Istio zahtijeva da ih navedete naziv luke u skladu sa svojim protokolom. U YAML datoteci priključak za server pozvan httpjer poslužitelj koristi protokol HTTP. Ako usluga korišteni gRPC, nazvali biste luku grpc.
Implementacije su označene. Stoga možete koristiti Istio značajke upravljanja prometom, kao što je dijeljenje prometa između verzija iste usluge.
Montaža
Istio možete instalirati na dva načina. Limenka omogućiti Istio na GKE proširenju ili instalirati open source verziju Istio na klasteru. Uz Istio na GKE-u, možete jednostavno upravljati Istio instalacijama i nadogradnjama tijekom životnog ciklusa GKE klastera. Ako želite najnoviju verziju Istia ili veću kontrolu nad konfiguracijom upravljačke ploče Istio, instalirajte verziju otvorenog koda umjesto Istio na GKE proširenju. Da biste odlučili o pristupu, pročitajte članak Trebam li Istio na GKE-u?.
Odaberite opciju, pregledajte odgovarajući vodič i slijedite upute za instalaciju Istio na vašem klasteru. Ako želite koristiti Istio sa svojom novo postavljenom aplikacijom, omogućiti implementaciju prikolice za imenski prostor zadani.
čišćenje
Kako biste izbjegli naplatu s računa Google Cloud Platform za resurse koje ste koristili u ovom vodiču, izbrišite klaster spremnika nakon što instalirate Istio i počnete s oglednom aplikacijom. Ovo će ukloniti sve resurse klastera, kao što su računalne instance, diskovi i mrežni resursi.