Forberedelse af applikationen til Istio

Forberedelse af applikationen til Istio

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. Installation af Istio på Google Kubernetes Engine (GKE) eller installation af udvidelsen Istio på GKE.

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:

  1. Udforske en simpel hello world applikation med flere tjenester.
  2. Køre applikationen fra kildekoden.
  3. Pakke applikationen i containere.
  4. Oprette et Kubernetes-klynge.
  5. Implementere containere i klyngen.

Før du begynder

Følg instruktionerne for at aktivere Kubernetes Engine API:

  1. Gå til Kubernetes Engine-siden i Google Cloud Platform-konsollen.
  2. Opret eller vælg et projekt.
  3. Vent, indtil API'et og de relaterede tjenester er aktiveret. Dette kan tage et par minutter.
  4. Sørg for, at der er opsat fakturering for Google Cloud Platform-projektet. Find ud af, hvordan du aktiverer fakturering.

I denne vejledning kan du bruge Cloud Shell, der forbereder en virtuel maskine g1-small i Google Compute Engine 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 tekstredaktører:
    1. Kode-editoren, som åbnes med redigeringsikonet i toppen af Cloud Shell-vinduet.
    2. Emacs, Vim eller Nano, som åbnes fra kommandolinjen i Cloud Shell.

For at bruge Cloud Shell:

  1. Gå til GCP-konsollen.
  2. Klik på knappen Aktivér Cloud Shell (Aktivér Cloud Shell) i toppen af GCP-konsolvinduet.

Forberedelse af applikationen til Istio

I bunden af GCP-konsollen åbnes en Cloud Shell-session med kommandoprompten i et nyt vindue.

Forberedelse af applikationen til Istio

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:

  1. Konfigurer Python 3 og Python 2 udviklingsmiljø.

  2. Installer Cloud SDK med kommandolinjeværktøjet gcloud.

  3. Installer kubectl — kommandolinjeværktøjet til at arbejde med Kubernetes.

    gcloud components install kubectl

  4. Installer Docker Community Edition (CE). Du vil bruge kommandolinjeværktøjet docker, til at oprette containerbilleder til eksempelapplikationen.

  5. Installer værktøjet versionskontrolsystemet Git, for at hente eksempelapplikationen fra GitHub.

Download eksempel på kode

  1. Download kildekoden helloserver:

    git clone https://github.com/GoogleCloudPlatform/istio-samples

  2. Gå 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 REST:

  • 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.

Forberedelse af applikationen til Istio

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.py

Ved 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:8080

serveren 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/loadgen

5) Opret følgende miljøvariabler:

export SERVER_ADDR=http://localhost:8080
export REQUESTS_PER_SECOND=5

6) Kør virtualenv:

virtualenv --python python3 env

7) Aktiver det virtuelle miljø:

source env/bin/activate

8) Installer kravene til loadgen:

pip3 install -r requirements.txt

9) Kør loadgen:

python3 loadgen.py

Ved opstart loadgen udskriver omtrent følgende besked:

Starter loadgen: 2019-05-20 10:44:12.448415
5 anmodning(er) gennemført til http://localhost:8080

I 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ø:

deactivate

Pakning af applikationen i containere

For at køre applikationen på GKE, skal du pakke eksemplet på applikationen — server og loadgen — i containers. 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 Docker-billedet. Efter bygningen uploader du billedet til en containerregister, f.eks. Docker Hub eller Container Registry.

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 Python 3 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 porte.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_ID

3) Angiv standardzone for kommandolinjeværktøjet gcloud.

gcloud config set compute/zone us-central1-b

4) Sørg for, at Container Registry-tjenesten er aktiveret i GCP-projektet.

gcloud services enable containerregistry.googleapis.com

Containerisering server

  1. Gå til den mappe, hvor eksemplet findes server:

    cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/

  2. 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.

  1. 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 ../loadgen

2) 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.1

Visning 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-istio

Kommandoen returnerer navnene på de netop sendte billeder:

NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen

Oprettelse 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. 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 4

Kommandoen 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 n1-standard-2.

Kommandoen tager et par minutter at oprette klusteret. Når klusteret er klar, returnerer kommandoen noget lignende en meddelelse.

2) Angiv legitimationsoplysninger i kommandolinjeværktøjet kubectl, så du kan administrere klusteret:

gcloud container clusters get-credentials istioready

3) Nu kan du kommunikere med Kubernetes via kubectl. For eksempel kan du med følgende kommando få status på noderne:

kubectl get nodes

Kommandoen 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.13

Nøglebegreber i Kubernetes

Diagrammet viser en applikation på GKE:

Forberedelse af applikationen til Istio

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 proxy-server), 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å pods har ikke faste IP-adresser.
    For at få en IP-adresse til server, skal du definere en netværksabstraktion ovenfor pods. Det er Kubernetes-service. Kubernetes-servicen giver en permanent slutpunkt for en gruppe pods. Der er flere typer tjenester. 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 declarativ model. 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. 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: 512Mi

En 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: 8080

Udrulning 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.1

Erstat PROJECT_ID med dit GCP projekt-ID.
4) Gem og luk server.yaml.
5) Udrul YAML-filen i Kubernetes:

kubectl apply -f server.yaml

Efter en vellykket udførelse giver kommandoen følgende kode:

deployment.apps/helloserver created
service/hellosvc created

6) Gå til kataloget, hvor loadgen:

cd ../loadgen

7) Å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.1

Erstat 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.yaml

Efter en vellykket udførelse giver kommandoen følgende kode:

deployment.apps/loadgenerator created
service/loadgensvc created

11) Tjek status for pods:

kubectl get pods

Kommandoen viser status:

NAME                             READY   STATUS    RESTARTS   AGE
helloserver-69b9576d96-mwtcj     1/1     Running   0          58s
loadgenerator-774dbc46fb-gpbrz   1/1     Running   0          57s

12) Hent applikationslogfiler fra pod loadgen. Erstat POD_ID med identifikatoren fra det forrige svar.

kubectl logs loadgenerator-POD_ID

13) Få de eksterne IP-adresser hellosvc:

kubectl get service

Kommandoens 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         4m52s

14) Send en anmodning til hellosvc: erstat EXTERNAL_IP med den eksterne IP-adresse hellosvc.

curl http://EXTERNAL_IP

Lad 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 mTLS?

Alle disse spørgsmål besvares af Istio. Til dette placerer Istio en sidecar-proxy Envoy 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.

Forberedelse af applikationen til Istio

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 portnavnet 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 aktivere Istio on GKE-udvidelsen eller installere den open-source version af Istio 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 Har jeg brug for Istio on GKE?.

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, aktiver sidecar-implementeringen 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?

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster