Istio és una eina convenient per connectar, assegurar i supervisar aplicacions distribuïdes. Istio utilitza una varietat de tecnologies per executar i gestionar programari a escala, inclosos els contenidors per empaquetar el codi de l'aplicació i les dependències per al desplegament, i Kubernetes per gestionar aquests contenidors. Per tant, per treballar amb Istio cal saber com funciona una aplicació amb múltiples serveis basats en aquestes tecnologies без Istio. Si aquestes eines i conceptes ja us són familiars, no dubteu a ometre aquest tutorial i anar directament a la secció Instal·lació d'Istio a Google Kubernetes Engine (GKE) o instal·lar una extensió Istio a GKE.
Aquesta és una guia pas a pas on recorrerem tot el procés, des del codi font fins al contenidor de GKE, per donar-vos una comprensió bàsica d'aquestes tecnologies mitjançant un exemple. També veureu com Istio aprofita el poder d'aquestes tecnologies. Això suposa que no saps res sobre contenidors, Kubernetes, malles de servei o Istio.
tasques
En aquest tutorial, realitzareu les tasques següents:
Aprenentatge d'una senzilla aplicació Hello World amb múltiples serveis.
Executeu l'aplicació des del codi font.
Embalatge de l'aplicació en contenidors.
Creació d'un clúster de Kubernetes.
Desplegament de contenidors en un clúster.
Abans de començar
Seguiu les instruccions per activar l'API de Kubernetes Engine:
En aquest tutorial, podeu utilitzar Cloud Shell, que prepara la màquina virtual g1-small a Google Compute Engine amb Linux basat en Debian, o un ordinador Linux o macOS.
Opció A: Ús de Cloud Shell
Beneficis d'utilitzar Cloud Shell:
Entorns de desenvolupament Python 2 i Python 3 (incloent virtualenv) estan totalment configurats.
Eines de línia d'ordres gcloud, docker, git и kubectl, que farem servir ja estan instal·lats.
L'aplicació de mostra està escrita en Python i consta de dos components que interactuen utilitzant RESTA:
servidor: servidor simple amb un punt final ACONSEGUIR, /, que imprimeix "hola món" a la consola.
loadgen: script que envia trànsit a servidor, amb un nombre configurable de peticions per segon.
Execució d'una aplicació des del codi font
Per explorar l'aplicació de mostra, executeu-la a Cloud Shell o al vostre ordinador.
1) Al catàleg istio-samples/sample-apps/helloserver correr servidor:
python3 server/server.py
En començar servidor es mostra el següent:
INFO:root:Starting server...
2) Obriu una altra finestra de terminal per enviar sol·licituds servidor. Si utilitzeu Cloud Shell, feu clic a la icona d'afegir per obrir una altra sessió.
3) Envieu una sol·licitud a servidor:
curl http://localhost:8080
respostes del servidor:
Hello World!
4) Des del directori on heu descarregat el codi de mostra, aneu al directori que conté loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Des d'una perspectiva de xarxa, tota l'aplicació s'executa en un únic host (ordinador local o màquina virtual Cloud Shell). Per tant, podeu utilitzar localhostper enviar peticions a servidor.
10) Aturar-se loadgen и servidor, entra Ctrl-c a cada finestra de terminal.
11) A la finestra del terminal loadgen desactivar l'entorn virtual:
deactivate
Embalatge d'una aplicació en contenidors
Per executar l'aplicació a GKE, cal empaquetar l'aplicació de mostra − servidor и loadgen - dins contenidors. Un contenidor és una manera d'empaquetar una aplicació per aïllar-la del seu entorn.
Per empaquetar una aplicació en un contenidor, cal Dockerfile. Dockerfile és un fitxer de text que defineix les ordres per construir el codi font de l'aplicació i les seves dependències Imatge de Docker. Un cop construïda, pengeu la imatge a un registre de contenidors com ara Docker Hub o Registre de contenidors.
L'exemple ja ho té Dockerfile per servidor и loadgen amb totes les ordres necessàries per recollir imatges. Baix - Dockerfile per servidor:
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" ]
Equip DE python: 3-slim com a base diu a Docker que utilitzi l'últim Imatge de Python 3 com a base.
Equip CÒPIA. . copia els fitxers font al directori de treball actual (només en el nostre cas server.py) al sistema de fitxers del contenidor.
PUNT D'ENTRADA defineix l'ordre que s'utilitza per iniciar el contenidor. En el nostre cas, aquesta ordre és gairebé la mateixa que la que vau executar server.py del codi font.
Equip EXPOSAR indica que servidor espera dades a través del port 8080. Aquest equip no ho és ofereix ports. Aquesta és una mena de documentació que es necessita per obrir el port 8080 en iniciar el contenidor.
Preparant-se per contener la vostra aplicació
1) Establiu les variables d'entorn següents. Substitueix PROJECT_ID a l'identificador del vostre projecte de GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Utilitzant valors PROJECT_ID и GCR_REPO etiqueteu la imatge de Docker quan la creeu i l'envieu a un registre de contenidors privat.
2) Establiu el projecte GCP predeterminat per a l'eina de línia d'ordres gcloud.
gcloud config set project $PROJECT_ID
3) Establiu la zona predeterminada per a l'eina de línia d'ordres gcloud.
gcloud config set compute/zone us-central1-b
4) Assegureu-vos que el servei Container Registry estigui habilitat al projecte GCP.
Reviseu la llista d'imatges del repositori i comproveu que les imatges s'han penjat:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
L'ordre mostra els noms de les imatges recentment penjades:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
S'està creant un clúster de GKE.
Aquests contenidors es podrien executar en una màquina virtual Cloud Shell o en un ordinador amb l'ordre corredera. Però en un entorn de producció, necessiteu una manera d'orquestrar els contenidors de manera centralitzada. Per exemple, necessiteu un sistema que garanteixi que els contenidors estiguin sempre en funcionament, i necessiteu una manera d'augmentar i augmentar les instàncies de contenidors addicionals si el trànsit augmenta.
Per executar aplicacions en contenidors podeu utilitzar G.K.E.. GKE és una plataforma d'orquestració de contenidors que agrega màquines virtuals en un clúster. Cada màquina virtual s'anomena node. Els clústers de GKE es basen en el sistema de gestió de clústers de codi obert Kubernetes. Kubernetes proporciona mecanismes per interactuar amb el clúster.
Equip gcloud crea un clúster ja preparat al projecte GCP i a la zona predeterminada que heu especificat. Per executar Istio, recomanem tenir almenys 4 nodes i una màquina virtual n1-estàndard-2.
L'equip crea el clúster en pocs minuts. Quan el clúster està llest, l'ordre genera alguna cosa com això сообщение.
2) Proporcioneu credencials a l'eina de línia d'ordres kubectlper utilitzar-lo per gestionar el clúster:
3) Ara podeu comunicar-vos amb Kubernetes mitjançant kubectl. Per exemple, l'ordre següent pot esbrinar l'estat dels nodes:
kubectl get nodes
L'ordre produeix una llista de nodes:
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
Conceptes clau de Kubernetes
El diagrama mostra una aplicació a GKE:
Abans de desplegar contenidors a GKE, aprèn els conceptes clau de Kubernetes. Hi ha enllaços al final si voleu saber-ne més.
Nodes i clústers. A GKE, un node és una màquina virtual. En altres plataformes Kubernetes, un node pot ser un ordinador o una màquina virtual. Un clúster és una col·lecció de nodes que es pot considerar una unitat única on es desplega una aplicació en contenidors.
Beines. A Kubernetes, els contenidors s'executen en beines. Un pod a Kubernetes és una unitat indivisible. Un pod conté un o més contenidors. Desplegueu contenidors del servidor i loadgen en beines separades. Quan hi ha diversos contenidors en un pod (per exemple, un servidor d'aplicacions i servidor intermediari), els contenidors es gestionen com una única entitat i comparteixen recursos de pod.
Desplegaments. A Kubernetes, un desplegament és un objecte que és una col·lecció de pods idèntics. El desplegament llança diverses rèpliques de pods distribuïdes entre nodes del clúster. El desplegament substitueix automàticament els pods que han fallat o que no responen.
Servei Kubernetes. Quan s'executa el codi de l'aplicació a GKE, la connexió entre loadgen и servidor. Quan vau iniciar serveis en una màquina virtual o escriptori de Cloud Shell, vau enviar sol·licituds a servidor a localhost: 8080. Un cop implementats a GKE, els pods s'executen als nodes disponibles. De manera predeterminada, no teniu cap control sobre quin node s'executa el pod, així que vosaltres beines sense adreces IP permanents.
Per obtenir una adreça IP per servidor, heu de definir una abstracció de xarxa a la part superior dels pods. Això és el que és Servei Kubernetes. El servei Kubernetes proporciona un punt final persistent per a un conjunt de pods. N'hi ha uns quants tipus de serveis. servidor usos LoadBalancer, que proporciona una adreça IP externa per contactar servidor des de fora del clúster.
Kubernetes també té un sistema DNS integrat que assigna noms DNS (per exemple, helloserver.default.cluster.local) serveis. Gràcies a això, els pods del clúster es comuniquen amb altres pods del clúster en una adreça permanent. El nom DNS no es pot utilitzar fora del clúster, com ara a Cloud Shell o en un ordinador.
Kubernetes es manifesta
Quan vau executar l'aplicació des de la font, vau utilitzar l'ordre imperatiu python3
server.py
L'imperatiu implica un verb: "fes això".
Usa Kubernetes model declaratiu. Això vol dir que no estem dient a Kubernetes exactament què ha de fer, sinó que descrivim l'estat desitjat. Per exemple, Kubernetes inicia i atura els pods segons sigui necessari per assegurar-se que l'estat real del sistema coincideix amb l'estat desitjat.
Indiqueu l'estat desitjat en manifests o fitxers YAML. Un fitxer YAML conté especificacions per a un o més objectes de Kubernetes.
L'exemple conté un fitxer YAML per a servidor и loadgen. Cada fitxer YAML especifica l'estat desitjat de l'objecte de desplegament i del servei Kubernetes.
Primer camp spec conté una descripció de l'estat desitjat.
rèpliques especificacions indica el nombre desitjat de beines.
Secció plantilla especificació defineix una plantilla de pod. Hi ha un camp a l'especificació del pod imatge, que especifica el nom de la imatge que cal extreure del Registre de contenidors.
LoadBalancer: els clients envien sol·licituds a l'adreça IP de l'equilibrador de càrrega, que té una adreça IP persistent i és accessible des de fora del clúster.
port de destinació: com recordeu, l'equip EXPOSA 8080 в Dockerfile no va proporcionar ports. Tu proporciones el port 8080perquè pugueu contactar amb el contenidor servidor fora del clúster. En el nostre cas hellosvc.default.cluster.local:80 (nom curt: holavc) correspon al port 8080 Adreces IP del pod hola servidor.
port: Aquest és el número de port on altres serveis del clúster enviaran sol·licituds.
loadgen.yaml
Objecte de desplegament a loadgen.yaml sembla server.yaml. La diferència és que l'objecte de desplegament conté una secció env. Defineix les variables d'entorn que es necessiten loadgen i que heu instal·lat en executar l'aplicació des de la font.
Temps loadgen no accepta peticions entrants, pel camp type indicat ClústerIP. Aquest tipus proporciona una adreça IP persistent que poden utilitzar els serveis del clúster, però aquesta adreça IP no està exposada a clients externs.
Substitueix PROJECT_ID a l'identificador del vostre projecte de GCP.
9) Desa i tanca loadgen.yaml, tanqueu l'editor de text.
10) Desplegueu el fitxer YAML a Kubernetes:
kubectl apply -f loadgen.yaml
Un cop finalitzada amb èxit, l'ordre produeix el codi següent:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Comproveu l'estat de les beines:
kubectl get pods
L'ordre mostra l'estat:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Extraieu els registres d'aplicacions del pod loadgen. Substitueix POD_ID a l'identificador de la resposta anterior.
kubectl logs loadgenerator-POD_ID
13) Obteniu adreces IP externes holavc:
kubectl get service
La resposta de l'ordre s'assembla a això:
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) Envieu una sol·licitud a holavc: substituir EXTERNAL_IP a una adreça IP externa holavc.
curl http://EXTERNAL_IP
Enfrontem l'Istio
Ja teniu una aplicació implementada a GKE. loadgen pot utilitzar Kubernetes DNS (hola: 80) per enviar sol·licituds servidori podeu enviar sol·licituds a servidor per adreça IP externa. Tot i que Kubernetes té moltes funcions, falta informació sobre els serveis:
Com interactuen els serveis? Quines són les relacions entre els serveis? Com flueix el trànsit entre serveis? En sou conscients? loadgen envia peticions a servidor, però imagina que no saps res de l'aplicació. Per respondre aquestes preguntes, mirem la llista de pods en funcionament a GKE.
Mètriques. Quant de temps servidor respon a una sol·licitud entrant? Quantes peticions per segon rep el servidor? Dona missatges d'error?
Informació de seguretat. Trànsit entre loadgen и servidor només passa HTTP o per mTLS?
Istio respon a totes aquestes preguntes. Per fer-ho, Istio col·loca un proxy sidecar Enviat a cada beina. El servidor intermediari Envoy intercepta tot el trànsit entrant i sortint als contenidors d'aplicacions. Vol dir això servidor и loadgen rebre mitjançant el proxy sidecar Envoy i tot el trànsit des de loadgen к servidor passa pel proxy Envoy.
Les connexions entre servidors intermediaris d'Envoy formen una malla de servei. L'arquitectura de malla de servei proporciona una capa de control a la part superior de Kubernetes.
Com que els servidors intermediaris d'Envoy s'executen als seus propis contenidors, Istio es pot instal·lar a sobre d'un clúster de GKE gairebé sense canvis al codi de l'aplicació. Però heu fet una mica de feina per preparar la vostra aplicació per ser gestionada per Istio:
Serveis per a tots els contenidors. Als desplegaments servidor и loadgen vinculat al servei Kubernetes. Fins i tot loadgen, que no rep sol·licituds entrants, hi ha un servei.
Els ports dels serveis han de tenir noms. Tot i que els ports de servei es poden deixar sense nom a GKE, Istio requereix que ho especifiqueu nom del port d'acord amb el seu protocol. Al fitxer YAML el port per servidor anomenat httpperquè el servidor utilitza el protocol HTTP... Si servei usat gRPC, anomenaries el port grpc.
Els desplegaments estan marcats. Per tant, podeu utilitzar les funcions de gestió del trànsit d'Istio, com ara dividir el trànsit entre versions del mateix servei.
Instal·lació
Hi ha dues maneres d'instal·lar Istio. Llauna habiliteu Istio a l'extensió GKE o instal·leu la versió de codi obert d'Istio al clúster. Amb Istio a GKE, podeu gestionar fàcilment les instal·lacions i les actualitzacions d'Istio al llarg del cicle de vida del clúster de GKE. Si voleu la darrera versió d'Istio o més control sobre la configuració del vostre tauler de control d'Istio, instal·leu la versió de codi obert en lloc de l'extensió Istio a GKE. Per decidir sobre l'enfocament, llegiu l'article Necessito Istio a GKE?.
Seleccioneu una opció, reviseu la guia adequada i seguiu les instruccions per instal·lar Istio al vostre clúster. Si voleu utilitzar Istio amb la vostra aplicació recentment implementada, habilitar la implementació de sidecar per a l'espai de noms defecte.
Neteja
Per evitar que us cobren al vostre compte de Google Cloud Platform pels recursos que heu utilitzat en aquest tutorial, suprimiu el clúster de contenidors un cop hàgiu instal·lat Istio i hàgiu jugat amb l'aplicació de mostra. Això eliminarà tots els recursos del clúster, com ara instàncies de càlcul, discs i recursos de xarxa.