Istio hè un strumentu convenientu per cunnette, assicurà è monitorà l'applicazioni distribuite. Istio usa una varietà di tecnulugii per eseguisce è gestisce u software à scala, cumpresi cuntenituri per imballà u codice di l'applicazione è dipendenze per a implementazione, è Kubernetes per gestisce quelli cuntenituri. Dunque, per travaglià cù Istio, duvete sapè cumu funziona una applicazione cù parechji servizii basati nantu à sti tecnulugia senza Istio. Sì sti arnesi è cuncetti sò digià familiari per voi, sentite liberu di saltà stu tutoriale è andate direttamente à a sezione Installazione di Istio nantu à Google Kubernetes Engine (GKE) o installendu una estensione Istio nantu à GKE.
Questa hè una guida passo-passu induve andemu in tuttu u prucessu da u codice fonte à u containeru GKE per dà una cunniscenza basica di sti tecnulugii attraversu un esempiu. Puderete ancu vede cumu Istio sfrutta u putere di sti tecnulugia. Questu assume chì ùn sapete nunda di cuntenituri, Kubernetes, maglie di serviziu, o Istio.
fatti
In questu tutoriale, compie e seguenti attività:
Amparate una semplice applicazione salutu mondu cù parechji servizii.
Eseguite l'applicazione da u codice fonte.
Imballaggio di l'applicazione in cuntenituri.
Creazione di un cluster Kubernetes.
Implantazione di cuntenituri in un cluster.
Prima di cumincià
Segui l'istruzzioni per attivà l'API Kubernetes Engine:
In questu tutoriale, pudete aduprà Cloud Shell, chì prepara a macchina virtuale g1-small in Google Compute Engine cù Linux basatu in Debian, o un computer Linux o macOS.
Opzione A: Utilizà Cloud Shell
Vantaghji di utilizà Cloud Shell:
Ambienti di sviluppu Python 2 è Python 3 (cumpresu virtualenv) sò cumpletamente cunfigurati.
Strumenti di linea di cummanda gcloud, docker, andà и kubectl, chì avemu aduprà sò digià stallati.
Installa kubectl - Strumenta di linea di cumanda per travaglià cù Kubernetes.
gcloud components install kubectl
Installa Docker Community Edition (CE). Puderete aduprà u strumentu di linea di cumanda dockerper creà imàgini di cuntainer per l'applicazione di mostra.
L'applicazione di mostra hè scritta in Python è si compone di dui cumpunenti chì interagiscenu cù l'usu REST:
servore: servitore simplice cù un puntu finale GET, /, chì stampa "hello world" à a cunsola.
loadgen: script chì manda u trafficu à servore, cù un numeru configurabile di richieste per seconda.
Esecuzione di una applicazione da u codice fonte
Per scopra l'applicazione di mostra, eseguite in Cloud Shell o in u vostru urdinatore.
1) In u catalogu istio-samples/sample-apps/helloserver corre servore:
python3 server/server.py
À l'iniziu servore u seguente hè visualizatu:
INFO:root:Starting server...
2) Aprite una altra finestra di terminal per mandà richieste servore. Sè vo aduprate Cloud Shell, cliccate nantu à l'icona aghjunghje per apre una altra sessione.
3) Mandate una dumanda à servore:
curl http://localhost:8080
u servitore risponde:
Hello World!
4) Da u repertoriu induve avete scaricatu u codice di mostra, andate à u repertoriu chì cuntene loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Da una perspettiva di rete, tutta l'applicazione funziona nantu à un unicu host (urdinatore locale o macchina virtuale Cloud Shell). Dunque, pudete aduprà localhostper mandà richieste à servore.
10) Per piantà loadgen и servore, entre Ctrl-c in ogni finestra di terminal.
11) In a finestra di u terminal loadgen disattivà l'ambiente virtuale:
deactivate
Imballaggio di una applicazione in cuntenituri
Per eseguisce l'applicazione nantu à GKE, avete bisognu di pacchettu l'applicazione di mostra - servore и loadgen - in cuntenenu. Un cuntainer hè un modu per imballà una applicazione per isolà da u so ambiente.
Per imballà una applicazione in un containeru, avete bisognu dockerfile. dockerfile hè un schedariu di testu chì definisce cumandamenti per custruisce u codice fonte di l'applicazione è e so dipendenze Image Docker. Una volta custruitu, caricate l'imaghjini à un registru di cuntainer cum'è Docker Hub o Registru di Container.
L'esempiu hà digià dockerfile di servore и loadgen cù tutti i cumandamenti necessarii per cullà imagine. Sottu - dockerfile di servore:
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" ]
squadra FROM python: 3-slim cum'è basa dice à Docker di utilizà l'ultime Immagine Python 3 cum'è una basa.
squadra COPIA. . copia i fugliali fonte à u cartulare di travagliu attuale (in u nostru casu solu server.py) à u sistema di fugliale di u containeru.
PUNTU DI ENTRATA definisce u cumandamentu chì hè utilizatu per inizià u cuntinuu. In u nostru casu, stu cumandamentu hè quasi u listessu cum'è quellu chì avete usatu per eseguisce server.py da u codice fonte.
squadra ESPOSTI indica chì servore aspetta i dati attraversu u portu 8080. Questa squadra ùn hè micca furnisce i porti. Questu hè un tipu di documentazione chì hè necessariu per apre u portu 8080 quandu principia u cuntinuu.
Preparazione per cuntene a vostra applicazione
1) Definite e seguenti variabili di l'ambiente. Sustituisce PROJECT_ID à u vostru ID di prughjettu GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Utilizà i valori PROJECT_ID и GCR_REPO taggate l'imaghjini di Docker quandu a custruite è u spinghje à un Registru di Container privatu.
2) Definite u prughjettu GCP predeterminatu per l'uttellu di linea di cummanda gcloud.
gcloud config set project $PROJECT_ID
3) Definite a zona predeterminata per l'uttellu di linea di cumanda gcloud.
gcloud config set compute/zone us-central1-b
4) Assicuratevi chì u serviziu di u Registru di Container hè attivatu in u prughjettu GCP.
Verificate a lista di l'imaghjini in u repositoriu è verificate chì l'imaghjini sò stati caricati:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
U cumandamentu mostra i nomi di l'imaghjini appena caricate:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Creazione di un cluster GKE.
Questi cuntenituri puderanu esse eseguiti nantu à una macchina virtuale Cloud Shell o in un computer cù u cumandimu docker run. Ma in un ambiente di produzzione, avete bisognu di un modu per orchestrate cintrali cuntenituri. Per esempiu, avete bisognu di un sistema chì assicura chì i cuntenituri sò sempre in esecuzione, è avete bisognu di un modu per scala è spin up istanze di cuntainer supplementari se u trafficu aumenta.
Per eseguisce l'applicazioni containerizzate pudete aduprà G.K.E.. GKE hè una piattaforma di orchestrazione di container chì aggrega e macchine virtuali in un cluster. Ogni macchina virtuale hè chjamata node. I clusters GKE sò basati nantu à u sistema di gestione di cluster Kubernetes open source. Kubernetes furnisce miccanismi per interagisce cù u cluster.
squadra gcloud crea un cluster istioready in u prughjettu GCP è a zona predeterminata chì avete specificatu. Per eseguisce Istio, ricumandemu di avè almenu 4 nodi è una macchina virtuale n1-standard-2.
A squadra crea u cluster in pochi minuti. Quandu u cluster hè prontu, u cumandimu pruduce qualcosa cusì u missaghju.
2) Fornite credenziali in u strumentu di linea di cummanda kubectlper aduprà per gestisce u cluster:
3) Avà pudete cumunicà cù Kubernetes via kubectl. Per esempiu, u cumandimu seguitu pò truvà u statutu di i nodi:
kubectl get nodes
U cumandimu pruduce una lista di nodi:
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
I cuncetti chjave di Kubernetes
U diagramma mostra una applicazione nantu à GKE:
Prima di implementà i cuntenituri in GKE, amparate i cuncetti chjave di Kubernetes. Ci sò ligami à a fine se vulete amparà di più.
Nodi è clusters. In GKE, un node hè una macchina virtuale. Nant'à altre plataforme Kubernetes, un node pò esse un computer o una macchina virtuale. Un cluster hè una cullizzioni di nodi chì ponu esse cunsiderate una sola unità induve implementate una applicazione containerizzata.
Pods. In Kubernetes, i cuntenituri scorri in pods. Un Pod in Kubernetes hè una unità indivisibile. Un Pod cuntene unu o più cuntenituri. Implantate cuntenituri di u servitore è loadgen in baccelli separati. Quandu ci sò parechji cuntenituri in un pod (per esempiu, un servitore d'applicazioni è servitore proxy), i cuntenituri sò gestiti cum'è una sola entità è sparte risorse pod.
Impiegazioni. In Kubernetes, una implementazione hè un oggettu chì hè una cullizzioni di pods identici. A implementazione lancia parechje repliche di pods distribuiti in i nodi di cluster. L'implementazione rimpiazza automaticamente i pods chì anu fiascatu o ùn rispundenu.
serviziu Kubernetes. Quandu eseguisce u codice di l'applicazione in GKE, a cunnessione trà loadgen и servore. Quandu avete iniziatu i servizii nantu à una macchina virtuale Cloud Shell o desktop, avete mandatu richieste à servore ì à localhost: 8080. Una volta implementati in GKE, i pods sò eseguiti nantu à i nodi dispunibili. Per automaticamente, ùn avete micca un cuntrollu nantu à quale nodu u pod hè in esecuzione, cusì voi baccelli senza indirizzi IP permanenti.
Per ottene un indirizzu IP per servore, avete bisognu di definisce una astrazione di rete in cima di i pods. Hè ciò chì hè serviziu Kubernetes. U serviziu Kubernetes furnisce un endpoint persistente per un set di pods. Ci sò uni pochi tippi di servizii. servore usi LoadBalancer, chì furnisce un indirizzu IP esternu per cuntattà servore da fora di u cluster.
Kubernetes hà ancu un sistema DNS integratu chì assigna nomi DNS (per esempiu, helloserver.default.cluster.local) servizii. Grazie à questu, i pods in u cluster cumunicanu cù altri pods in u cluster à un indirizzu permanente. U nome DNS ùn pò esse usatu fora di u cluster, cum'è in Cloud Shell o in un computer.
Kubernetes si manifesta
Quandu avete eseguitu l'applicazione da a fonte, avete utilizatu u cumandamentu imperativu python3
server.py
L'imperativu implica un verbu: "fate questu".
Kubernetes usa mudellu dichjarazione. Questu significa chì ùn dicemu micca à Kubernetes esattamente ciò chì deve fà, ma piuttostu discrittendu u statu desideratu. Per esempiu, Kubernetes principia è ferma i pods quantu necessariu per assicurà chì u statu propiu di u sistema currisponde à u statu desideratu.
Indicà u statu desideratu in manifesti o schedari YAML. Un schedariu YAML cuntene specificazioni per unu o più oggetti Kubernetes.
L'esempiu cuntene un schedariu YAML per servore и loadgen. Ogni schedariu YAML specifica u statu desideratu di l'ughjettu di implementazione è u serviziu Kubernetes.
metadata.name specifica u nome di implementazione.
Primu campu spec cuntene una descrizzione di u statu desideratu.
spec.repliche indica u numeru desideratu di baccelli.
Sezione spec.template definisce un mudellu di pod. Ci hè un campu in a specificazione di pod imaghjini, chì specifica u nome di l'imaghjini chì deve esse estratti da u Registru di Container.
LoadBalancer: I clienti mandanu dumande à l'indirizzu IP di u balancer di carica, chì hà un indirizzu IP persistente è hè accessibile da fora di u cluster.
targetPort: cum'è vi ricordate, a squadra EXPOSE 8080 в dockerfile ùn hà micca furnitu porti. Fornite u portu 8080cusì chì pudete cuntattà u cuntinuu servore fora di u cluster. In u nostru casu hellosvc.default.cluster.local:80 (nome cortu: ciao vc) currisponde à u portu 8080 Pod l'indirizzi IP ciao servitore.
portu: Questu hè u numeru di portu induve altri servizii in u cluster mandaranu e dumande.
loadgen.yaml
Oggettu di implementazione à loadgen.yaml parè server.yaml. A diferenza hè chì l'ughjettu di implementazione cuntene una sezione env. Definisce e variabili di l'ambiente chì sò necessarii loadgen è chì avete installatu quandu eseguite l'applicazione da a fonte.
Time loadgen ùn accetta micca richieste entrate, per u campu activité indicatu ClusterIP. Stu tipu furnisce un indirizzu IP persistente chì i servizii in u cluster ponu utilizà, ma questu indirizzu IP ùn hè micca espostu à i clienti esterni.
Sustituisce PROJECT_ID à u vostru ID di prughjettu GCP.
9) Salvà è chjude loadgen.yaml, chjude l'editore di testu.
10) Implementa u schedariu YAML à Kubernetes:
kubectl apply -f loadgen.yaml
Dopu à u cumpletu successu, u cumandimu pruduce u codice seguente:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Verificate u statutu di i pods:
kubectl get pods
U cumandimu mostra u statu:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Estrae i logs di l'applicazione da u pod loadgen. Sustituisce POD_ID à l'identificatore da a risposta precedente.
kubectl logs loadgenerator-POD_ID
13) Ottene indirizzi IP esterni ciao vc:
kubectl get service
A risposta di u cumandimu pare cusì cusì:
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) Mandate una dumanda à ciao vc: rimpiazzà EXTERNAL_IP à l'indirizzu IP esternu ciao vc.
curl http://EXTERNAL_IP
Prendemu Istio
Avete digià una applicazione implementata à GKE. loadgen pò aduprà Kubernetes DNS (ciao: 80) per mandà richieste à servoreè pudete mandà richieste à servore per indirizzu IP esternu. Ancu se Kubernetes hà parechje caratteristiche, ci hè qualchì infurmazione chì manca nantu à i servizii:
Cumu interagisce i servizii? Chì sò e relazioni trà i servizii ? Cumu si passa u trafficu trà i servizii? Sapete chì loadgen manda richieste à servore, ma imaginate chì ùn sapete nunda di l'applicazione. Per risponde à queste dumande, fighjemu a lista di pods in esecuzione in GKE.
Metriche. Quantu tempu servore risponde à una dumanda in entrata? Quante richieste per seconda sò ricevute da u servitore? Dà missaghji d'errore?
Informazioni di sicurezza. U trafficu trà loadgen и servore passa solu HTTP o da mTLS?
Istio risponde à tutte queste dumande. Per fà questu, Istio mette un proxy sidecar imbasciata in ogni poda. U proxy Envoy intercepta tuttu u trafficu entrante è in uscita à i cuntenituri di l'applicazioni. Significa chì servore и loadgen riceve via proxy sidecar Envoy, è tuttu u trafficu da loadgen к servore passa per u proxy Envoy.
I cunnessione trà i proxy Envoy formanu una rete di serviziu. L'architettura di maglia di serviziu furnisce una strata di cuntrollu nantu à Kubernetes.
Siccomu i proxy Envoy funzionanu in i so cuntenituri, Istio pò esse installatu nantu à un cluster GKE senza quasi cambiamenti à u codice di l'applicazione. Ma avete fattu qualchì travagliu per preparà a vostra applicazione per esse gestita da Istio:
Servizi per tutti i container. À i dispiegamenti servore и loadgen ligatu à u serviziu Kubernetes. Ancu loadgen, chì ùn riceve micca richieste entrate, ci hè un serviziu.
I porti in i servizii devenu avè nomi. Ancu se i porti di serviziu ponu esse lasciati senza nome in GKE, Istio richiede di specificà nome di u portu in cunfurmità cù u so protocolu. In u schedariu YAML u portu per servore hè chjamatu situ httpperchè u servitore usa u protocolu HTTP... Se sirvizziu usatu gRPC, tu avissi a nomu lu portu grpc.
I dispiegamenti sò marcati. Dunque, pudete aduprà e funzioni di gestione di u trafficu d'Istio, cum'è splitting trafficu trà versioni di u stessu serviziu.
Installazione
Ci hè duie manere di stallà Istio. Can attivate Istio nantu à l'estensione GKE o installate a versione open source di Istio nantu à u cluster. Cù Istio nantu à GKE, pudete gestisce facilmente l'installazione è l'aghjurnamenti Istio in tuttu u ciclu di vita di u cluster GKE. Se vulete l'ultima versione di Istio o più cuntrollu nantu à a cunfigurazione di u vostru pannellu di cuntrollu Istio, installate a versione open source invece di l'estensione Istio in GKE. Per decide di l'approcciu, leghjite l'articulu Aghju bisognu di Istio nantu à GKE?.
Selezziunate una opzione, rivedete a guida adattata, è seguite l'istruzzioni per installà Istio in u vostru cluster. Se vulete utilizà Istio cù a vostra applicazione appena implementata, permette l'implementazione di sidecar per u spaziu di nomi automaticamente.
Pulizia
Per evità di esse caricatu à u vostru contu Google Cloud Platform per e risorse chì avete utilizatu in stu tutoriale, sguassate u cluster di cuntainer una volta installatu Istio è ghjucatu cù l'applicazione di mostra. Questu eliminerà tutte e risorse di cluster, cum'è istanze di compute, dischi è risorse di rete.