
Istio er et praktisk værktøj til at forbinde, beskytte og overvåge distribuerede applikationer. Istio bruger forskellige teknologier til at implementere og administrere software i stor skala, herunder containere til pakning af applikationskode og afhængigheder til implementering samt Kubernetes til styring af disse containere. Derfor skal du vide, hvordan en applikation med flere tjenester baseret på disse teknologier fungerer for at arbejde med Istio. uden Istio. Hvis disse værktøjer og begreber allerede er kendte for dig, kan du trygt springe dette vejledningsafsnit over og gå direkte til den relevante del. eller installation af udvidelsen .
Dette er en trin-for-trin vejledning, hvor vi gennemgår hele processen fra kildekoden til containeren på GKE, så du får en grundlæggende forståelse af disse teknologier gennem et eksempel. Du vil også se, hvordan Istio udnytter mulighederne i disse teknologier. Det antages, at du ikke ved noget om containere, Kubernetes, service mesh eller Istio.
Opgaver
I denne vejledning vil du udføre følgende opgaver:
- Udforske en simpel hello world applikation med flere tjenester.
- Køre applikationen fra kildekoden.
- Pakke applikationen i containere.
- Oprette et Kubernetes-klynge.
- Implementere containere i klyngen.
Før du begynder
Følg instruktionerne for at aktivere Kubernetes Engine API:
- Gå til i Google Cloud Platform-konsollen.
- Opret eller vælg et projekt.
- Vent, indtil API'et og de relaterede tjenester er aktiveret. Dette kan tage et par minutter.
- Sørg for, at der er opsat fakturering for Google Cloud Platform-projektet. .
I denne vejledning kan du bruge Cloud Shell, der forbereder en virtuel maskine med Linux baseret på Debian, eller en computer med Linux eller macOS.
Mulighed A: Brug af Cloud Shell
Fordele ved at bruge Cloud Shell:
- Udviklingsmiljøer til Python 2 og Python 3 (inklusive virtualenv) er fuldt konfigurerede.
- Kommandoværktøjer gcloud, docker, git og kubectl, som vi vil bruge, er allerede installeret.
- Du har flere :
- , som åbnes med redigeringsikonet i toppen af Cloud Shell-vinduet.
- Emacs, Vim eller Nano, som åbnes fra kommandolinjen i Cloud Shell.
For at bruge :
- Gå til GCP-konsollen.
- Klik på knappen Aktivér Cloud Shell (Aktivér Cloud Shell) i toppen af GCP-konsolvinduet.
![]()
I bunden af åbnes en Cloud Shell-session med kommandoprompten i et nyt vindue.

Mulighed B: brug af kommandolinjeværktøjer lokalt
Hvis du arbejder på en computer med Linux eller macOS, skal du konfigurere og installere følgende komponenter:
Konfigurer .
med kommandolinjeværktøjet gcloud.
Installer kubectl — kommandolinjeværktøjet til at arbejde med .
gcloud components install kubectlInstaller . Du vil bruge kommandolinjeværktøjet docker, til at oprette containerbilleder til eksempelapplikationen.
Installer værktøjet , for at hente eksempelapplikationen fra GitHub.
Download eksempel på kode
Download kildekoden helloserver:
git clone https://github.com/GoogleCloudPlatform/istio-samplesGå til biblioteket for eksempel på kode:
cd istio-samples/sample-apps/helloserver
Udforskning af applikation med flere tjenester
Eksempelapplikationen er skrevet i Python og består af to komponenter, som kommunikerer via :
- server: en simpel server med en endepunkt GET, /, som udskriver «hello world» i konsollen.
- loadgen: et script, der sender trafik til server, med et konfigurerbart antal anmodninger pr. sekund.

Kør applikationen fra kildekoden
For at udforske eksempelapplikationen, kør den i Cloud Shell eller på din computer.
1) I biblioteket istio-samples/sample-apps/helloserver kør server:
python3 server/server.pyVed opstart server vises følgende:
INFO:root:Starter server...2) Åbn et andet terminalvindue for at sende anmodninger til server. Hvis du bruger Cloud Shell, klik på tilføj-ikonet for at åbne en anden session.
3) Send en anmodning til server:
curl http://localhost:8080serveren svarer:
Hello World!4) I biblioteket, hvor du downloaded eksempel på kode, gå til biblioteket, der indeholder loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen5) Opret følgende miljøvariabler:
export SERVER_ADDR=http://localhost:8080
export REQUESTS_PER_SECOND=56) Kør virtualenv:
virtualenv --python python3 env7) Aktiver det virtuelle miljø:
source env/bin/activate8) Installer kravene til loadgen:
pip3 install -r requirements.txt9) Kør loadgen:
python3 loadgen.pyVed opstart loadgen udskriver omtrent følgende besked:
Starter loadgen: 2019-05-20 10:44:12.448415
5 anmodning(er) gennemført til http://localhost:8080I et andet terminalvindue server udskriver omtrent følgende beskeder i konsollen:
127.0.0.1 - - [21/Jun/2019 14:22:01] "GET / HTTP/1.1" 200 -
INFO:root:GET-anmodning,
Sti: /
Header:
Host: localhost:8080
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*Set fra netværksperspektiv fungerer hele applikationen på en enkelt vært (lokal computer eller Cloud Shell virtuel maskine). Derfor kan du bruge localhost, for at sende anmodninger til server.
10) For at stoppe loadgen og server, indtast Ctrl-c i hvert terminalvindue.
11) I terminalvinduet loadgen deaktiver den virtuelle miljø:
deactivatePakning af applikationen i containere
For at køre applikationen på GKE, skal du pakke eksemplet på applikationen — server og loadgen — i . En container er en måde at pakke applikationen på, så den er isoleret fra miljøet.
For at pakke applikationen i en container, har du brug for Dockerfile. Dockerfile — det er en tekstfil, der definerer kommandoerne til at bygge kildekoden til applikationen og dens afhængigheder til Efter bygningen uploader du billedet til en containerregister, f.eks. Docker Hub eller .
Eksemplet indeholder allerede Dockerfile for server og loadgen med alle nødvendige kommandoer til at samle billeder. Nedenfor er Dockerfile for 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/*
# Aktivér ubufferet logføring
FROM base as final
ENV PYTHONUNBUFFERED=1
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
wget
WORKDIR /helloserver
# Grab pakker fra builder
COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/
# Tilføj applikationen
COPY . .
EXPOSE 8080
ENTRYPOINT [ "python", "server.py" ]- Kommandoen FROM python:3-slim as base får Docker til at bruge den nyeste som basis.
- Kommandoen COPY . . kopierer kildefilerne til den nuværende arbejdskatalog (i vores tilfælde kun server.py) til containerens filsystem.
- ENTRYPOINT definerer kommandoen, der bruges til at starte containeren. I vores tilfælde stemmer denne kommando næsten overens med den, du brugte til at starte server.py fra kildekoden.
- Kommandoen EXPOSE angiver, at server forventes data gennem port 8080. Denne kommando leverer ikke Det er noget som dokumentationen, der er nødvendig for at åbne en port 8080 ved start af containeren.
Forberedelse til containerisering af applikationen
1) Angiv følgende miljøvariabler. Erstat PROJECT_ID med dit GCP-projekt-id.
export PROJECT_ID="PROJECT_ID"export GCR_REPO="preparing-istio"Med værdierne PROJECT_ID og GCR_REPO mærker du Docker-billedet, når du samler og sender det til den private Container Registry.
2) Angiv standard GCP-projekt for kommandolinjeværktøjet gcloud.
gcloud config set project $PROJECT_ID3) Angiv standardzone for kommandolinjeværktøjet gcloud.
gcloud config set compute/zone us-central1-b4) Sørg for, at Container Registry-tjenesten er aktiveret i GCP-projektet.
gcloud services enable containerregistry.googleapis.comContainerisering server
Gå til den mappe, hvor eksemplet findes server:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/Byg billedet ved hjælp af Dockerfile og de miljøvariabler, du har defineret tidligere:
docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.1 .
Parameter -t angiver et Docker-tag. Det er navnet på billedet, som du bruger ved udrulning af containeren.
- Send billedet til Container Registry:
docker push gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.1
Containerisering af loadgen
1) Gå til den mappe, hvor eksemplet findes loadgen:
cd ../loadgen2) Byg billedet:
docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/loadgen:v0.0.1 .3) Send billedet til Container Registry:
docker push gcr.io/$PROJECT_ID/$GCR_REPO/loadgen:v0.0.1Visning af billedlister
Gennemse listen over billeder i registreret og sikre dig, at billederne er sendt:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istioKommandoen returnerer navnene på de netop sendte billeder:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgenOprettelse af GKE-kluster.
Disse containere kunne køres på en Cloud Shell virtuel maskine eller på din computer med kommandoen docker run. Men i en produktionsmiljø kræves der en måde at centralisere orkestrering af containere. For eksempel er der behov for et system, der sikrer, at containerne altid kører, og der er brug for en måde at skalere op og starte yderligere instanser af containere, hvis trafikken stiger.
Til at køre containerapplikationer kan man bruge . GKE er en container orkestreringsplatform, der kombinerer virtuelle maskiner i et kluster. Hver virtuel maskine kaldes en node. GKE-klynger er baseret på det open source klyngeadministrationssystem Kubernetes. Kubernetes giver mekanismer til interaktion med klyngen.
Oprettelse af GKE-kluster:
1) Opret et kluster:
gcloud container clusters create istioready
--cluster-version latest
--machine-type=n1-standard-2
--num-nodes 4Kommandoen gcloud opretter klusteret istioready i det GCP-projekt og den standardzone, som du har angivet. For at køre Istio anbefales det at have mindst 4 noder og en virtuel maskine .
Kommandoen tager et par minutter at oprette klusteret. Når klusteret er klar, returnerer kommandoen noget lignende .
2) Angiv legitimationsoplysninger i kommandolinjeværktøjet , så du kan administrere klusteret:
gcloud container clusters get-credentials istioready3) Nu kan du kommunikere med Kubernetes via kubectl. For eksempel kan du med følgende kommando få status på noderne:
kubectl get nodesKommandoen returnerer listen over noder:
NAVN STATUS ROLLER ALDER VERSION
GKE-istoready-standard-pool-dbeb23dc-1vg0 Klar 99s v1.13.6-gke.13
GKE-istoready-standard-pool-dbeb23dc-36z5 Klar 100s v1.13.6-gke.13
GKE-istoready-standard-pool-dbeb23dc-fj7s Klar 99s v1.13.6-gke.13
GKE-istoready-standard-pool-dbeb23dc-wbjw Klar 99s v1.13.6-gke.13Nøglebegreber i Kubernetes
Diagrammet viser en applikation på GKE:

Før du deployer containere til GKE, skal du forstå nøglebegreberne i Kubernetes. Der er links til yderligere information nederst.
- Noder og klynger. I GKE er en node en virtuel maskine. På andre Kubernetes-platforme kan en node være en computer eller en virtuel maskine. En klynge er et sæt noder, der kan betragtes som én enhed, hvor du deployerer den containeriserede applikation.
- Pods. I Kubernetes kører containere i pods. En pod i Kubernetes er en udelelig enhed. En pod kan rumme en eller flere containere. Du skal deployere containerne server og loadgen i separate pods. Når der er flere containere i en pod (for eksempel en applikationsserver og ), så administreres containerne som et enkelt objekt og deler ressourcerne i pod'en.
- Udrulninger. I Kubernetes er en udrulning et objekt, der repræsenterer et sæt identiske pods. Udrulningen starter flere replika-pods, der er fordelt på noderne i klyngen. Udrulningen udskifter automatisk pods, der er fejlet eller ikke reagerer.
- Kubernetes-service. Når du kører applikationskoden i GKE, ændres forbindelsen mellem loadgen og server. Da du kørte tjenester på en Cloud Shell virtuel maskine eller på din computer, sendte du anmodninger til server på adresserne localhost:8080. Efter udrulning i GKE kører pods på tilgængelige noder. Som standard kan du ikke styre, hvilken node en pod kører på, så har ikke faste IP-adresser.
For at få en IP-adresse til server, skal du definere en netværksabstraktion ovenfor pods. Det er . Kubernetes-servicen giver en permanent slutpunkt for en gruppe pods. Der er flere . server bruger LoadBalancer, som giver en ekstern IP-adresse for at kommunikere med server uden for klyngen.
Derudover har Kubernetes et indbygget DNS-system, der tildeler DNS-navne (for eksempel, helloserver.default.cluster.local) tjenester. Dette gør det muligt for pods inde i klyngen at kommunikere med andre pods i klyngen via en permanent adresse. DNS-navnet kan ikke bruges uden for klyngen, for eksempel i Cloud Shell eller på din computer.
Kubernetes-manifester
Når du har kørt applikationen fra kildekoden, har du brugt en imperativ kommando python3
server.py
Imperativitet indebærer et verbum: 'gør dette'.
Kubernetes uses . Det betyder, at vi ikke fortæller Kubernetes, hvad der præcist skal gøres, men beskriver den ønskede tilstand. For eksempel starter og stopper Kubernetes pods efter behov, så den faktiske tilstand af systemet matcher den ønskede.
Den ønskede tilstand angiver du i manifesterne, eller filerne . YAML-filen indeholder specifikationer for et eller flere Kubernetes-objekter.
I eksemplet indgår en YAML-fil til server og loadgen. Hver YAML-fil angiver den ønskede tilstand for et deployments- og serviceobjekt i Kubernetes.
server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloserver
spec:
selector:
matchLabels:
app: helloserver
replicas: 1
template:
metadata:
labels:
app: helloserver
spec:
terminationGracePeriodSeconds: 5
restartPolicy: Always
containers:
- name: main
image: gcr.io/google-samples/istio/helloserver:v0.0.1
imagePullPolicy: Always- kind angiver objektets type.
- metadata.name angiver deployment-navnet.
- Det første felt spec indeholder beskrivelsen af den ønskede tilstand.
- spec.replicas angiver det ønskede antal pods.
- Partition spec.template definerer pod-skabelonen. I pod-specifikationen er der et felt billede, hvor navnet på billedet, der skal hentes fra Container Registry, angives.
En service defineres som følger:
apiVersion: v1
kind: Service
metadata:
name: hellosvc
spec:
type: LoadBalancer
selector:
app: helloserver
ports:
- name: http
port: 80
targetPort: 8080- LoadBalancer: klienter sender anmodninger til IP-adressen for lastbalanceren, som har en permanent IP-adresse og som er tilgængelig udefra klyngen.
- targetPort: som du husker, gav kommandoen EXPOSE 8080 i Dockerfile ikke portene. Du angiver en port 8080, så du kan kommunikere med containeren server uden for klyngen. I vores tilfælde hellosvc.default.cluster.local:80 (kort navn: hellosvc) svarer til porten 8080 IP-adressen for pod'en helloserver.
- port: det er portnummeret, som de andre tjenester i klyngen vil sende anmodninger til.
loadgen.yaml
Deployment-objektet i loadgen.yaml ligner server.yaml. Forskellen er, at deployment-objektet indeholder sektionen env. Den definerer miljøvariablerne, som du har brug for loadgen og som du har angivet, da du kørte applikationen fra kildekoden.
apiVersion: apps/v1
kind: Deployment
metadata:
name: loadgenerator
spec:
selector:
matchLabels:
app: loadgenerator
replicas: 1
template:
metadata:
labels:
app: loadgenerator
spec:
terminationGracePeriodSeconds: 5
restartPolicy: Always
containers:
- name: main
image: gcr.io/google-samples/istio/loadgen:v0.0.1
imagePullPolicy: Always
env:
- name: SERVER_ADDR
value: "http://hellosvc:80/"
- name: REQUESTS_PER_SECOND
value: "10"
resources:
requests:
cpu: 300m
memory: 256Mi
limits:
cpu: 500m
memory: 512MiEn loadgen accepter ikke indkommende anmodninger, til feltet type angivet ClusterIP. Denne type giver en statisk IP-adresse, som tjenester i klyngen kan bruge, men denne IP-adresse stilles ikke til rådighed for eksterne kunder.
apiVersion: v1
kind: Service
metadata:
name: loadgensvc
spec:
type: ClusterIP
selector:
app: loadgenerator
ports:
- name: http
port: 80
targetPort: 8080Udrulning af containere i GKE
1) Gå til den mappe, hvor eksemplet findes server:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/2) Åbn server.yaml i en teksteditor.
3) Erstat navnet i feltet billede med navnet på dit Docker-billede.
image: gcr.io/PROJECT_ID/preparing-istio/helloserver:v0.0.1Erstat PROJECT_ID med dit GCP projekt-ID.
4) Gem og luk server.yaml.
5) Udrul YAML-filen i Kubernetes:
kubectl apply -f server.yamlEfter en vellykket udførelse giver kommandoen følgende kode:
deployment.apps/helloserver created
service/hellosvc created6) Gå til kataloget, hvor loadgen:
cd ../loadgen7) Åbn loadgen.yaml i en teksteditor.
8) Erstat navnet i feltet billede med navnet på dit Docker-billede.
image: gcr.io/PROJECT_ID/preparing-istio/loadgenv0.0.1Erstat PROJECT_ID med dit GCP projekt-ID.
9) Gem og luk loadgen.yaml, luk teksteditoren.
10) Udrul YAML-filen i Kubernetes:
kubectl apply -f loadgen.yamlEfter en vellykket udførelse giver kommandoen følgende kode:
deployment.apps/loadgenerator created
service/loadgensvc created11) Tjek status for pods:
kubectl get podsKommandoen viser status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s12) Hent applikationslogfiler fra pod loadgen. Erstat POD_ID med identifikatoren fra det forrige svar.
kubectl logs loadgenerator-POD_ID13) Få de eksterne IP-adresser hellosvc:
kubectl get serviceKommandoens svar ser cirka sådan ud:
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 443/TCP 93m
loadgensvc ClusterIP 10.81.15.155 80/TCP 4m52s14) Send en anmodning til hellosvc: erstat EXTERNAL_IP med den eksterne IP-adresse hellosvc.
curl http://EXTERNAL_IPLad os tage fat på Istio
Du har allerede en applikation udrullet i GKE. loadgen kan bruge Kubernetes DNS (hellosvc:80), for at sende anmodninger til server, og du kan sende anmodninger til server via den eksterne IP-adresse. Selvom Kubernetes har mange muligheder, mangler der nogle oplysninger om tjenesterne:
- Hvordan interagerer tjenesterne? Hvilke relationer er der mellem tjenesterne? Hvordan passerer trafikken mellem tjenesterne? Er du klar over, at loadgen sender forespørgsler til server, men forestil dig, at du ikke ved noget om applikationen. For at besvare disse spørgsmål ser vi på listen over kørende pods i GKE.
- Målinger. Hvor længe server svarer på en indgående forespørgsel? Hvor mange forespørgsler pr. sekund modtages på serveren? Genererer den fejlmeddelelser?
- Sikkerhedsoplysninger. Trafikken mellem loadgen og server passerer simpelthen gennem HTTP eller gennem ?
Alle disse spørgsmål besvares af Istio. Til dette placerer Istio en sidecar-proxy i hver pod. Envoy-proxyen opsnapper al indgående og udgående trafik til applikationscontainerne. Det betyder, at server og loadgen modtager trafik gennem sidecar-proxyen Envoy, og al trafik fra loadgen pull-requesten på GitHub server går gennem proxyen Envoy.
Forbindelserne mellem Envoy-proxyerne danner et service mesh. Arkitekturen for service mesh giver et lag af kontrol over Kubernetes.

Da Envoy-proxyerne kører i deres containere, kan Istio installeres oven på GKE-klyngen uden at ændre applikationskoden ret meget. Men du har gjort noget arbejde for at forberede applikationen til at blive administreret med Istio:
- Tjenester for alle containere. Hver deployment server og loadgen er tilknyttet en Kubernetes-tjeneste. Selv den loadgen, som ikke modtager indgående forespørgsler, har en tjeneste.
- Tjenesterne skal have navne på deres porte. Selvom porte i GKE kan efterlades uden navne, kræver Istio, at i henhold til dens protokol skal angives. I YAML-filen er porten for server kaldes http, fordi serveren bruger protokollen HTTP. Hvis service brugte gRPC, ville du kalde porten grpc.
- Deployments mærkes. Derfor kan du bruge Istios trafikstyringsfunktioner, for eksempel at adskille trafik mellem versioner af en tjeneste.
Installation af Istio
Istio kan installeres på to måder. Du kan eller på klyngen. Med Istio on GKE kan du nemt administrere installationen og opgraderinger af Istio som en del af livscyklussen for GKE-klyngen. Hvis du har brug for den nyeste version af Istio eller mere kontrol over konfigurationen af Istio-kontrolpanelet, skal du installere den open-source version i stedet for Istio on GKE-udvidelsen. For at vælge fremgangsmåden, læs artiklen .
Vælg en mulighed, læs den relevante guide og følg instruktionerne for at installere Istio på klyngen. Hvis du ønsker at bruge Istio med en nyudviklet applikation, til namespace default.
Rydning
For at undgå, at der opkræves gebyrer for de ressourcer, du har brugt i denne vejledning fra din Google Cloud Platform-konto, skal du slette containerklusteret, når du har installeret Istio og leget med eksempelapplikationen. På dette tidspunkt vil alle clusterressourcer, såsom compute-forekomster, diske og netværksressourcer, blive fjernet.
Hvad nu?
Udforsk følgende teknologier:
Udforsk følgende værktøjer:
Udforsk Kubernetes-begreber:
Kilde: habr.com
