Istio je pohodlný nástroj na pripojenie, zabezpečenie a monitorovanie distribuovaných aplikácií. Istio používa rôzne technológie na spustenie a správu softvéru vo veľkom rozsahu, vrátane kontajnerov na balenie kódu aplikácie a závislostí na nasadenie a Kubernetes na správu týchto kontajnerov. Preto, aby ste mohli pracovať s Istio, musíte vedieť, ako funguje aplikácia s viacerými službami založenými na týchto technológiách bez Istio. Ak sú vám tieto nástroje a koncepty už známe, pokojne preskočte tento návod a prejdite priamo do sekcie Inštalácia Istio na Google Kubernetes Engine (GKE) alebo inštalácia rozšírenia Istio na GKE.
Toto je sprievodca krok za krokom, v ktorom prejdeme celým procesom od zdrojového kódu až po kontajner GKE, aby sme vám poskytli základné pochopenie týchto technológií prostredníctvom príkladu. Uvidíte tiež, ako Istio využíva silu týchto technológií. To predpokladá, že neviete nič o kontajneroch, Kubernetes, servisných sieťach alebo Istio.
úlohy
V tomto návode dokončíte nasledujúce úlohy:
Naučte sa jednoduchú aplikáciu hello world s viacerými službami.
Spustite aplikáciu zo zdrojového kódu.
Balenie aplikácie do nádob.
Vytvorenie klastra Kubernetes.
Nasadenie kontajnerov do klastra.
Než začnete
Ak chcete povoliť rozhranie Kubernetes Engine API, postupujte podľa pokynov:
V tomto návode môžete použiť Cloud Shell, ktorý pripraví virtuálny stroj g1-small v Google Compute Engine s Linuxom založeným na Debiane alebo počítačom so systémom Linux alebo macOS.
Možnosť A: Použitie Cloud Shell
Výhody používania Cloud Shell:
Vývojové prostredia Python 2 a Python 3 (vrátane VIRTUALENV) sú plne nakonfigurované.
Nástroje príkazového riadku gcloud, prístavný robotník, ísť и kubectl, ktoré budeme používať, sú už nainštalované.
Sada kubectl - nástroj príkazového riadku na prácu s Kubernetes.
gcloud components install kubectl
Sada Docker Community Edition (CE). Budete používať nástroj príkazového riadku prístavný robotníkna vytvorenie obrázkov kontajnera pre vzorovú aplikáciu.
Vzorová aplikácia je napísaná v jazyku Python a pozostáva z dvoch komponentov, ktoré vzájomne spolupracujú REST:
server: jednoduchý server s jedným koncovým bodom GET, /, ktorá na konzole vytlačí „hello world“.
loadgen: skript, ktorý posiela návštevnosť servers konfigurovateľným počtom požiadaviek za sekundu.
Spustenie aplikácie zo zdrojového kódu
Ak chcete preskúmať vzorovú aplikáciu, spustite ju v Cloud Shell alebo na počítači.
1) V katalógu istio-samples/sample-apps/helloserver bežať server:
python3 server/server.py
Pri štarte server zobrazí sa nasledovné:
INFO:root:Starting server...
2) Otvorte ďalšie okno terminálu, do ktorého chcete odosielať požiadavky server. Ak používate Cloud Shell, kliknutím na ikonu pridať otvorte ďalšiu reláciu.
3) Pošlite žiadosť na server:
curl http://localhost:8080
odpovede servera:
Hello World!
4) Z adresára, kde ste stiahli vzorový kód, prejdite do adresára, ktorý obsahuje loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Z pohľadu siete beží celá aplikácia na jednom hostiteľovi (lokálny počítač alebo virtuálny stroj Cloud Shell). Preto môžete použiť localhostposielať žiadosti server.
10) Prestať loadgen и server, zadajte Ctrl-c v každom okne terminálu.
11) V okne terminálu loadgen deaktivácia virtuálneho prostredia:
deactivate
Balenie aplikácie do nádob
Ak chcete spustiť aplikáciu na GKE, musíte zabaliť vzorovú aplikáciu − server и loadgen - v Kontajnery. Kontajner je spôsob, ako zabaliť aplikáciu a izolovať ju od prostredia.
Ak chcete zabaliť aplikáciu do kontajnera, potrebujete Dockerfile. Dockerfile je textový súbor, ktorý definuje príkazy na zostavenie zdrojového kódu aplikácie a jej závislostí Obrázok Docker. Po vytvorení nahráte obrázok do registra kontajnerov, ako je napríklad Docker Hub alebo Register kontajnerov.
Príklad už má Dockerfile pre server и loadgen so všetkými potrebnými príkazmi na zhromažďovanie obrázkov. Nižšie - Dockerfile pre 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" ]
Tím OD pythonu: 3-slim ako základ povie Dockerovi, aby použil najnovšie Obrázok Python 3 ako základ.
Tím KOPÍROVAŤ. . skopíruje zdrojové súbory do aktuálneho pracovného adresára (iba v našom prípade server.py) do súborového systému kontajnera.
VSTUPNÝ BOD definuje príkaz, ktorý sa používa na spustenie kontajnera. V našom prípade je tento príkaz takmer rovnaký ako ten, ktorý ste použili na spustenie server.py zo zdrojového kódu.
Tím VYSTAVIŤ to naznačuje server čaká na dáta cez port 8080. Tento tím nie je poskytuje porty. Toto je nejaký druh dokumentácie, ktorá je potrebná na otvorenie portu 8080 pri spustení kontajnera.
Príprava na kontajnerizáciu vašej aplikácie
1) Nastavte nasledujúce premenné prostredia. Nahradiť PROJECT_ID na vaše ID projektu GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Používanie hodnôt PROJECT_ID и GCR_REPO označíte obrázok Docker pri jeho zostavovaní a odošlete ho do súkromného registra kontajnerov.
2) Nastavte predvolený projekt GCP pre nástroj príkazového riadka gcloud.
gcloud config set project $PROJECT_ID
3) Nastavte predvolenú zónu pre nástroj príkazového riadka gcloud.
gcloud config set compute/zone us-central1-b
4) Skontrolujte, či je v projekte GCP povolená služba Registry kontajnerov.
Skontrolujte zoznam obrázkov v úložisku a overte, či boli obrázky nahrané:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Príkaz zobrazí názvy novo odovzdaných obrázkov:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Vytvorenie klastra GKE.
Tieto kontajnery možno spustiť na virtuálnom stroji Cloud Shell alebo na počítači s príkazom docker run. V produkčnom prostredí však potrebujete spôsob, ako centrálne organizovať kontajnery. Potrebujete napríklad systém, ktorý zaisťuje, že kontajnery sú vždy v prevádzke, a potrebujete spôsob, ako zväčšiť a spustiť ďalšie inštancie kontajnerov, ak sa zvýši návštevnosť.
Na spustenie kontajnerových aplikácií môžete použiť G.K.E.. GKE je platforma na orchestráciu kontajnerov, ktorá agreguje virtuálne stroje do klastra. Každý virtuálny stroj sa nazýva uzol. Klastre GKE sú založené na open source systéme správy klastrov Kubernetes. Kubernetes poskytuje mechanizmy na interakciu s klastrom.
Tím gcloud vytvorí pripravený klaster v projekte GCP a predvolenej zóne, ktorú ste zadali. Na spustenie Istio odporúčame mať aspoň 4 uzly a virtuálny stroj n1-štandard-2.
Tým vytvorí klaster za pár minút. Keď je klaster pripravený, príkaz vydá niečo takéto сообщение.
2) Poskytnite poverenia v nástroji príkazového riadka kubectlak ho chcete použiť na správu klastra:
3) Teraz môžete komunikovať s Kubernetes cez kubectl. Napríklad nasledujúci príkaz môže zistiť stav uzlov:
kubectl get nodes
Príkaz vytvorí zoznam uzlov:
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
Kľúčové koncepty Kubernetes
Diagram ukazuje aplikáciu na GKE:
Pred nasadením kontajnerov v GKE si osvojte kľúčové koncepty Kubernetes. Na samom konci sú odkazy, ak sa chcete dozvedieť viac.
Uzly a zhluky. V GKE je uzol virtuálny stroj. Na iných platformách Kubernetes môže byť uzlom počítač alebo virtuálny stroj. Klaster je kolekcia uzlov, ktoré možno považovať za jednu jednotku, kde nasadzujete kontajnerizovanú aplikáciu.
Pods. V Kubernetes bežia kontajnery v podoch. Pod v Kubernetes je nedeliteľná jednotka. Modul obsahuje jednu alebo viac nádob. Nasadíte serverové kontajnery a loadgen v samostatných strukoch. Ak je v podu niekoľko kontajnerov (napríklad aplikačný server a proxy server), kontajnery sú spravované ako jedna entita a zdieľajú zdroje pod.
Nasadenia. V Kubernetes je nasadenie objekt, ktorý je kolekciou identických modulov. Nasadenie spúšťa viacero kópií modulov distribuovaných medzi uzlami klastra. Nasadenie automaticky nahradí moduly, ktoré zlyhali alebo nereagujú.
Služba Kubernetes. Pri spustení kódu aplikácie v GKE je spojenie medzi loadgen и server. Keď ste spustili služby na virtuálnom počítači alebo desktope Cloud Shell, odoslali ste požiadavky na server na localhost: 8080. Po nasadení do GKE sa moduly spúšťajú na dostupných uzloch. V predvolenom nastavení nemáte kontrolu nad tým, na ktorom uzle modul beží, takže vy struky žiadne trvalé IP adresy.
Ak chcete získať adresu IP pre server, musíte definovať sieťovú abstrakciu na vrchu modulov. Tak to je Služba Kubernetes. Služba Kubernetes poskytuje trvalý koncový bod pre skupinu modulov. Je tam niekoľko typy služieb. server používa Load Balancer, ktorý poskytuje externú IP adresu na kontaktovanie server zvonku klastra.
Kubernetes má tiež vstavaný systém DNS, ktorý prideľuje názvy DNS (napr. helloserver.default.cluster.local) služby. Vďaka tomu pody v rámci klastra komunikujú s ostatnými podmi v klastri na trvalej adrese. Názov DNS nemožno použiť mimo klastra, napríklad v Cloud Shell alebo v počítači.
Kubernetes sa prejavuje
Keď ste spustili aplikáciu zo zdroja, použili ste imperatívny príkaz python3
server.py
Imperatív znamená sloveso: „urob to“.
Používa Kubernetes deklaratívny model. To znamená, že Kubernetes nehovoríme presne, čo má robiť, ale skôr popisujeme želaný stav. Napríklad Kubernetes spúšťa a zastavuje moduly podľa potreby, aby sa zabezpečilo, že skutočný stav systému zodpovedá požadovanému stavu.
Požadovaný stav uvádzate v manifestoch alebo súboroch Yamli. Súbor YAML obsahuje špecifikácie pre jeden alebo viacero objektov Kubernetes.
Príklad obsahuje súbor YAML pre server и loadgen. Každý súbor YAML špecifikuje požadovaný stav objektu nasadenia a služby Kubernetes.
časť spec.template definuje šablónu pod. V špecifikácii modulu je pole obraz, ktorý určuje názov obrázka, ktorý je potrebné extrahovať z registra kontajnerov.
Load Balancer: Klienti posielajú požiadavky na IP adresu nástroja na vyvažovanie záťaže, ktorý má trvalú IP adresu a je prístupný zvonku klastra.
targetPort: ako si pamätáte, tím EXPOZÍCIA 8080 в Dockerfile neposkytol porty. Poskytnete port 8080aby ste mohli kontaktovať kontajner server mimo klastra. V našom prípade hellosvc.default.cluster.local:80 (krátky názov: hellosvc) zodpovedá portu 8080 IP adresy pod helloserver.
prístav: Toto je číslo portu, kam budú ostatné služby v klastri odosielať požiadavky.
loadgen.yaml
Objekt nasadenia do loadgen.yaml vyzerať ako server.yaml. Rozdiel je v tom, že objekt nasadenia obsahuje sekciu ca.. Definuje premenné prostredia, ktoré sú potrebné loadgen a ktoré ste nainštalovali pri spustení aplikácie zo zdroja.
čas loadgen neprijíma prichádzajúce požiadavky na pole typ nevedno ClusterIP. Tento typ poskytuje trvalú IP adresu, ktorú môžu používať služby v klastri, ale táto IP adresa nie je vystavená externým klientom.
vymeniť PROJECT_ID na vaše ID projektu GCP.
9) Uložte a zatvorte loadgen.yaml, zatvorte textový editor.
10) Nasaďte súbor YAML do Kubernetes:
kubectl apply -f loadgen.yaml
Po úspešnom dokončení príkaz vytvorí nasledujúci kód:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Skontrolujte stav modulov:
kubectl get pods
Príkaz zobrazuje stav:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Extrahujte denníky aplikácií z modulu loadgen. Vymeňte POD_ID na identifikátor z predchádzajúcej odpovede.
kubectl logs loadgenerator-POD_ID
13) Získajte externé adresy IP hellosvc:
kubectl get service
Odpoveď na príkaz vyzerá asi takto:
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šlite žiadosť na hellosvc: nahradiť EXTERNAL_IP na externú IP adresu hellosvc.
curl http://EXTERNAL_IP
Zoberme si Istio
Už máte aplikáciu nasadenú v GKE. loadgen môže používať Kubernetes DNS (hellosvc:80) na odosielanie žiadostí servera môžete posielať žiadosti na server pomocou externej IP adresy. Hoci má Kubernetes veľa funkcií, niektoré informácie o službách chýbajú:
Ako spolu služby interagujú? Aké sú vzťahy medzi službami? Ako prebieha prevádzka medzi službami? Si si toho vedomý? loadgen posiela žiadosti na server, no predstavte si, že o aplikácii nič neviete. Aby sme odpovedali na tieto otázky, pozrieme sa na zoznam bežeckých modulov v GKE.
Metriky. Ako dlho server odpovedá na prichádzajúcu požiadavku? Koľko požiadaviek za sekundu dostane server? Vypisuje chybové hlásenia?
Bezpečnostné informácie. Doprava medzi loadgen и server len prechádza HTTP alebo mTLS?
Istio odpovedá na všetky tieto otázky. Na tento účel Istio umiestni proxy postranného vozíka vyslanec v každom struku. Proxy Envoy zachytáva všetku prichádzajúcu a odchádzajúcu prevádzku do kontajnerov aplikácií. Znamená to, že server и loadgen prijímať cez postranný server proxy Envoy a všetku komunikáciu z loadgen к server prechádza cez splnomocnenca Envoy.
Spojenia medzi Envoy proxy tvoria sieť služieb. Architektúra servisnej siete poskytuje vrstvu kontroly nad Kubernetes.
Keďže Envoy proxy bežia vo svojich vlastných kontajneroch, Istio je možné nainštalovať na vrchol klastra GKE bez takmer žiadnych zmien v kóde aplikácie. Urobili ste však kus práce, aby ste svoju aplikáciu pripravili na správu spoločnosťou Istio:
Služby pre všetky kontajnery. K nasadeniam server и loadgen viazané na službu Kubernetes. Dokonca loadgen, ktorá neprijíma prichádzajúce požiadavky, existuje služba.
Porty v službách musia mať názvy. Aj keď servisné porty môžu zostať v GKE nepomenované, Istio vyžaduje, aby ste ich špecifikovali názov portu v súlade s jeho protokolom. V súbore YAML je port pre server tzv httppretože server používa protokol HTTP. Ak služba použité gRPC, pomenovali by ste prístav grpc.
Nasadenia sú označené. Preto môžete využiť funkcie správy prevádzky Istio, ako je napríklad rozdelenie prevádzky medzi verziami tej istej služby.
Inštalácia Istio
Existujú dva spôsoby inštalácie Istio. Môcť povoliť Istio na rozšírení GKE alebo nainštalujte verziu Istio s otvoreným zdrojom na klastri. S Istio na GKE môžete jednoducho spravovať inštalácie a inovácie Istio počas celého životného cyklu klastra GKE. Ak chcete najnovšiu verziu Istio alebo väčšiu kontrolu nad konfiguráciou ovládacieho panela Istio, nainštalujte si verziu s otvoreným zdrojom namiesto rozšírenia Istio na GKE. Ak chcete rozhodnúť o prístupe, prečítajte si článok Potrebujem Istio na GKE?.
Vyberte možnosť, prečítajte si príslušnú príručku a podľa pokynov nainštalujte Istio do svojho klastra. Ak chcete používať Istio s vašou novo nasadenou aplikáciou, umožniť implementáciu sajdkár pre menný priestor štandardné.
čistenie
Ak sa chcete vyhnúť účtovaniu prostriedkov z vášho účtu Google Cloud Platform za zdroje, ktoré ste použili v tomto návode, po nainštalovaní Istio a hraní so vzorovou aplikáciou odstráňte klaster kontajnerov. Týmto sa odstránia všetky prostriedky klastra, ako sú výpočtové inštancie, disky a sieťové prostriedky.