Istio je zgodan alat za povezivanje, osiguranje i nadgledanje distribuiranih aplikacija. Istio koristi različite tehnologije za pokretanje i upravljanje softverom u velikom obimu, uključujući kontejnere za pakovanje koda aplikacije i zavisnosti za implementaciju, i Kubernetes za upravljanje tim kontejnerima. Stoga, da biste radili sa Istiom, morate znati kako funkcionira aplikacija s više servisa baziranih na ovim tehnologijama bez Istio. Ako su vam ovi alati i koncepti već poznati, slobodno preskočite ovaj vodič i idite direktno na odjeljak Instaliranje Istio 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 kontejnera kako bismo vam kroz primjer pružili osnovno razumijevanje ovih tehnologija. Također ćete vidjeti kako Istio koristi moć ovih tehnologija. Ovo pretpostavlja da ne znate ništa o kontejnerima, Kubernetes-u, servisnim mrežama ili Istio-u.
zadaci
U ovom vodiču ćete obaviti sljedeće zadatke:
Naučite jednostavnu aplikaciju hello world s više usluga.
Pokrenite aplikaciju iz izvornog koda.
Pakovanje aplikacije u kontejnere.
Kreiranje Kubernetes klastera.
Postavljanje kontejnera u klaster.
Pre nego što počnete
Slijedite upute da omogućite Kubernetes Engine API:
U ovom vodiču možete koristiti Cloud Shell, koji priprema virtuelnu mašinu g1-small u Google Compute Engineu s Linuxom baziranim na Debianu, ili Linux ili macOS računalom.
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) su potpuno konfigurisani.
Alati komandne linije gcloud, docker, git и kubectl, koje ćemo koristiti su već instalirani.
Primjer aplikacije je napisan u Python-u i sastoji se od dvije komponente koje međusobno djeluju REST:
server: jednostavan server sa jednom krajnjom tačkom UZMI, /, koji ispisuje "hello world" na konzolu.
loadgen: skripta koja šalje promet na server, sa podesivim brojem zahtjeva u sekundi.
Pokretanje aplikacije iz izvornog koda
Da biste istražili primjer aplikacije, pokrenite je u Cloud Shell-u ili na svom računaru.
1) U katalogu istio-samples/sample-apps/helloserver trči 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 na ikonu za dodavanje da otvorite drugu sesiju.
3) Pošaljite zahtjev na server:
curl http://localhost:8080
server odgovara:
Hello World!
4) Iz direktorija u koji ste preuzeli uzorak 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 (lokalni računar ili Cloud Shell virtuelna mašina). Stoga možete koristiti localhostza slanje zahtjeva server.
10) Prestati loadgen и server, unesite Ctrl-c u svakom prozoru terminala.
11) U prozoru terminala loadgen deaktivirajte virtuelno okruženje:
deactivate
Pakovanje aplikacije u kontejnere
Da biste pokrenuli aplikaciju na GKE-u, morate zapakirati primjer aplikacije − server и loadgen - u kontejneri. Kontejner je način pakovanja aplikacije kako bi se izolirala od njenog okruženja.
Da biste upakovali aplikaciju u kontejner, potrebno vam je dockerfile. dockerfile je tekstualna datoteka koja definira naredbe za ugradnju izvornog koda aplikacije i njegovih ovisnosti u Docker slika. Jednom napravljen, sliku učitavate u registar kontejnera kao što je Docker Hub ili Registar kontejnera.
Primjer već ima dockerfile do server и loadgen sa svim potrebnim komandama za prikupljanje slika. Ispod - dockerfile do 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" ]
tim IZ python-a:3-slim kao osnova kaže Dockeru da koristi najnovije Python 3 slika kao baza.
tim COPY. . kopira izvorne datoteke u trenutni radni direktorij (samo u našem slučaju server.py) na sistem datoteka kontejnera.
ENTRYPOINT definira naredbu koja se koristi za pokretanje kontejnera. U našem slučaju, ova komanda je skoro ista kao ona koju ste koristili za pokretanje server.py iz izvornog koda.
tim EXPOSE ukazuje na to server čeka podatke kroz port 8080. Ovaj tim nije obezbeđuje portove. Ovo je neka vrsta dokumentacije koja je potrebna za otvaranje porta 8080 prilikom pokretanja kontejnera.
Priprema za kontejnerizaciju vaše aplikacije
1) Postavite sljedeće varijable okruženja. Zamijenite PROJECT_ID na ID vašeg GCP projekta.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Korištenje vrijednosti PROJECT_ID и GCR_REPO Docker sliku označite kada je napravite i gurnete je u privatni registar kontejnera.
2) Postavite podrazumevani GCP projekat za alat komandne linije gcloud.
gcloud config set project $PROJECT_ID
3) Postavite zadanu zonu za alat komandne linije gcloud.
gcloud config set compute/zone us-central1-b
4) Uvjerite se da je usluga registra kontejnera omogućena u GCP projektu.
Pregledajte listu slika u spremištu i provjerite da li su slike otpremljene:
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
Kreiranje GKE klastera.
Ovi kontejneri se mogu pokrenuti na Cloud Shell virtuelnoj mašini ili na računaru sa komandom docker run. Ali u proizvodnom okruženju, potreban vam je način za centralno orkestriranje kontejnera. Na primjer, potreban vam je sistem koji osigurava da se kontejneri uvijek izvode, i potreban vam je način da povećate i pokrenete dodatne instance kontejnera ako se promet poveća.
Za pokretanje kontejnerskih aplikacija možete koristiti G.K.E.. GKE je platforma za orkestraciju kontejnera koja agregira virtuelne mašine u klaster. Svaka virtuelna mašina se zove čvor. GKE klasteri su bazirani na sistemu upravljanja klasterima otvorenog koda Kubernetes. Kubernetes obezbeđuje mehanizme za interakciju sa klasterom.
tim gcloud kreira istioready klaster u GCP projektu i zadanu zonu koju ste naveli. Da biste pokrenuli Istio, preporučujemo da imate najmanje 4 čvora i virtuelnu mašinu n1-standard-2.
Tim stvara klaster za nekoliko minuta. Kada je klaster spreman, naredba daje nešto poput ovoga poruka.
2) Navedite vjerodajnice u alatu komandne linije kubectlda ga koristite za upravljanje klasterom:
3) Sada možete komunicirati sa Kubernetes putem kubectl. Na primjer, sljedeća naredba može saznati status čvorova:
kubectl get nodes
Naredba proizvodi listu č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 implementirate kontejnere u GKE, naučite ključne koncepte Kubernetesa. Postoje linkovi na samom kraju ako želite da saznate više.
Čvorovi i klasteri. U GKE, čvor je virtuelna mašina. Na drugim Kubernetes platformama, čvor može biti računar ili virtuelna mašina. Klaster je kolekcija čvorova koji se mogu smatrati jednom jedinicom u kojoj postavljate kontejneriziranu aplikaciju.
Pods. U Kubernetesu, kontejneri rade u podovima. Pod u Kubernetesu je nedjeljiva jedinica. Pod sadrži jedan ili više kontejnera. Vi postavljate serverske kontejnere i loadgen u odvojenim mahunama. Kada postoji nekoliko kontejnera u modulu (na primjer, poslužitelj aplikacija i proxy server), kontejnerima se upravlja kao jedan entitet i dijele pod resurse.
Deployments. U Kubernetesu, implementacija je objekat koji je kolekcija identičnih podova. Deployment pokreće višestruke replike podova raspoređenih po čvorovima klastera. Implementacija automatski zamjenjuje module koji nisu uspjeli ili ne reagiraju.
Kubernetes servis. Prilikom pokretanja koda aplikacije u GKE-u, veza između loadgen и server. Kada ste pokrenuli usluge na Cloud Shell virtuelnoj mašini ili desktopu, poslali ste zahteve na server po adresi localhost: 8080. Jednom raspoređeni u GKE, podovi se izvršavaju na dostupnim čvorovima. Prema zadanim postavkama, nemate kontrolu nad kojim čvorom se pod pokreće, tako da vi pods nema stalnih IP adresa.
Da biste dobili IP adresu za server, morate definirati mrežnu apstrakciju na vrhu podova. To je ono što je Kubernetes servis. Usluga Kubernetes pruža trajnu krajnju tačku za skup podova. Ima ih nekoliko vrste usluga. server koristi LoadBalancer, koji pruža eksternu IP adresu za kontakt server izvan klastera.
Kubernetes takođe ima ugrađeni DNS sistem koji dodeljuje DNS imena (na primer, helloserver.default.cluster.local) usluge. Zahvaljujući tome, podovi unutar klastera komuniciraju sa drugim podovima u klasteru na konstantnoj adresi. DNS ime se ne može koristiti izvan klastera, kao što je Cloud Shell ili na računaru.
Kubernetes manifesti
Kada ste pokrenuli aplikaciju iz izvora, koristili ste imperativnu naredbu python3
server.py
Imperativ implicira glagol: „uradi ovo“.
Kubernetes koristi deklarativni model. To znači da Kubernetesu ne govorimo tačno šta da radi, već opisujemo željeno stanje. Na primjer, Kubernetes pokreće i zaustavlja podove po potrebi kako bi stvarno stanje sistema bilo u skladu sa željenim stanjem.
Naznačite ž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 specificira željeno stanje objekta implementacije i Kubernetes servisa.
Odeljak spec.template definira pod šablon. Postoji polje u specifikaciji pod slika, koji specificira ime slike koju treba izdvojiti iz registra kontejnera.
LoadBalancer: Klijenti šalju zahtjeve na IP adresu balansera opterećenja, koja ima trajnu IP adresu i dostupna je izvan klastera.
targetPort: kao što se sećate, tim EXPOSE 8080 в dockerfile nije obezbijedio luke. Vi dajete luku 8080tako da možete kontaktirati kontejner server izvan klastera. U našem slučaju hellosvc.default.cluster.local:80 (kratko ime: hellosvc) odgovara portu 8080 Pod IP adrese helloserver.
luka: Ovo je broj porta na koji će druge usluge u klasteru slati zahtjeve.
loadgen.yaml
Objekat implementacije na loadgen.yaml izgleda kao server.yaml. Razlika je u tome što objekt implementacije sadrži odjeljak env. Definira varijable okruženja koje su potrebne loadgen i koje ste instalirali prilikom pokretanja aplikacije iz izvora.
Vreme loadgen ne prihvata dolazne zahtjeve, za polje tip naznačeno ClusterIP. Ovaj tip pruža trajnu IP adresu koju usluge u klasteru mogu koristiti, ali ova IP adresa nije izložena vanjskim klijentima.
Zamijenite PROJECT_ID na ID vašeg GCP projekta.
9) Sačuvajte i zatvorite loadgen.yaml, zatvorite uređivač teksta.
10) Postavite 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 pokazuje status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Izvucite dnevnike aplikacije iz pod loadgen. Zamijenite POD_ID na identifikator iz prethodnog odgovora.
kubectl logs loadgenerator-POD_ID
13) Nabavite eksterne IP adrese hellosvc:
kubectl get service
Odgovor na komandu 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 zahtjev na hellosvc: zamjena EXTERNAL_IP na eksternu IP adresu hellosvc.
curl http://EXTERNAL_IP
Hajdemo na Istio
Već imate aplikaciju raspoređenu na GKE. loadgen može koristiti Kubernetes DNS (hellosvc:80) za slanje zahtjeva serveri možete slati zahtjeve na server eksternom IP adresom. Iako Kubernetes ima mnogo funkcija, nedostaju neke informacije o uslugama:
Kako usluge međusobno djeluju? Kakvi su odnosi između usluga? Kako promet teče između usluga? Jeste li svjesni toga loadgen šalje zahtjeve na server, ali zamislite da ne znate ništa o aplikaciji. Da bismo odgovorili na ova pitanja, pogledajmo listu pokrenutih podova u GKE-u.
metrika. Koliko dugo server odgovara na dolazni zahtjev? Koliko zahtjeva u sekundi primi server? Da li daje poruke o grešci?
Sigurnosne informacije. Saobraćaj između loadgen и server samo prolazi HTTP ili od mTLS?
Istio odgovara na sva ova pitanja. Da bi to uradio, Istio postavlja sidecar proxy izaslanik u svakoj mahuni. Envoy proxy presreće sav dolazni i odlazni saobraćaj do kontejnera aplikacija. To znači da server и loadgen primati preko proxy proxy Envoy-a i sav promet od loadgen к server ide preko proxyja izaslanika.
Veze između Envoy proksija formiraju servisnu mrežu. Arhitektura servisne mreže pruža sloj kontrole na vrhu Kubernetesa.
Budući da se Envoy proksiji pokreću u vlastitim kontejnerima, Istio se može instalirati na vrhu GKE klastera bez gotovo nikakvih promjena u kodu aplikacije. Ali uradili ste neke poslove kako biste svoju aplikaciju pripremili za Istio upravljanje:
Usluge za sve kontejnere. Za raspoređivanje server и loadgen vezan za Kubernetes servis. Čak loadgen, koji ne prima dolazne zahtjeve, postoji usluga.
Portovi u uslugama moraju imati imena. Iako se servisni portovi mogu ostaviti neimenovanim u GKE-u, Istio zahtijeva da navedete naziv porta u skladu sa njegovim protokolom. U YAML datoteci port za server se zove httpjer server koristi protokol HTTP... Ako usluga polovno gRPC, vi biste nazvali luku grpc.
Raspoređivanja su označena. Stoga možete koristiti Istio funkcije upravljanja prometom, kao što je podjela prometa između verzija iste usluge.
Instalacija
Postoje dva načina da instalirate Istio. Može omogućite Istio na ekstenziji GKE ili instalirajte verziju otvorenog koda Istio na klasteru. Uz Istio na GKE-u, možete lako upravljati Istio instalacijama i nadogradnjama kroz životni ciklus GKE klastera. Ako želite najnoviju verziju Istio-a ili više kontrole nad konfiguracijom Istio kontrolne ploče, instalirajte verziju otvorenog koda umjesto ekstenzije Istio na GKE. Da biste se odlučili za pristup, pročitajte članak Da li mi treba Istio na GKE?.
Odaberite opciju, pregledajte odgovarajući vodič i slijedite upute kako biste instalirali Istio na svoj klaster. Ako želite koristiti Istio sa svojom novopostavljenom aplikacijom, omogućiti implementaciju bočne prikolice za imenski prostor default.
Čišćenje
Kako biste izbjegli naplatu resursa koje ste koristili u ovom vodiču sa vašeg Google Cloud Platform računa, izbrišite klaster kontejnera nakon što instalirate Istio i igrate s primjerom aplikacije. Ovo će ukloniti sve resurse klastera, kao što su instance računara, diskovi i mrežni resursi.