Istio je pohodlný nástroj pro připojení, zabezpečení a monitorování distribuovaných aplikací. Istio používá různé technologie pro spouštění a správu softwaru ve velkém, včetně kontejnerů pro balení kódu aplikace a závislostí pro nasazení a Kubernetes pro správu těchto kontejnerů. Proto, abyste mohli pracovat s Istio, musíte vědět, jak funguje aplikace s více službami založenými na těchto technologiích без Istio. Pokud jsou vám tyto nástroje a koncepty již známé, můžete tento tutoriál přeskočit a přejít přímo do sekce Instalace Istio na Google Kubernetes Engine (GKE) nebo instalaci rozšíření Istio na GKE.
Toto je průvodce krok za krokem, kde projdeme celým procesem od zdrojového kódu až po kontejner GKE, abychom vám na příkladu poskytli základní pochopení těchto technologií. Uvidíte také, jak Istio využívá sílu těchto technologií. To předpokládá, že nevíte nic o kontejnerech, Kubernetes, servisních sítích nebo Istio.
úkoly
V tomto tutoriálu dokončíte následující úkoly:
Naučte se jednoduchou aplikaci hello world s více službami.
Spusťte aplikaci ze zdrojového kódu.
Balení aplikace do nádob.
Vytvoření clusteru Kubernetes.
Nasazení kontejnerů do clusteru.
Než začneš
Chcete-li povolit rozhraní Kubernetes Engine API, postupujte podle pokynů:
V tomto tutoriálu můžete použít Cloud Shell, který připraví virtuální stroj g1-small v Google Compute Engine s Linuxem založeným na Debianu nebo počítačem se systémem Linux nebo macOS.
Možnost A: Použití Cloud Shell
Výhody používání Cloud Shell:
Vývojová prostředí Python 2 a Python 3 (včetně virtualenv) jsou plně nakonfigurovány.
Nástroje příkazového řádku gcloud, přístavní dělník, git и kubectl, které budeme používat, jsou již nainstalovány.
Ukázková aplikace je napsána v Pythonu a skládá se ze dvou komponent, které se vzájemně ovlivňují REST:
Server: jednoduchý server s jedním koncovým bodem DOSTAT, /, která na konzoli vytiskne „hello world“.
loadgen: skript, který odesílá provoz Servers konfigurovatelným počtem požadavků za sekundu.
Spuštění aplikace ze zdrojového kódu
Chcete-li prozkoumat ukázkovou aplikaci, spusťte ji v Cloud Shell nebo v počítači.
1) V katalogu istio-samples/sample-apps/helloserver běh Server:
python3 server/server.py
Při spuštění Server zobrazí se následující:
INFO:root:Starting server...
2) Otevřete další okno terminálu, do kterého chcete odesílat požadavky Server. Pokud používáte Cloud Shell, kliknutím na ikonu přidat otevřete další relaci.
3) Pošlete žádost na Server:
curl http://localhost:8080
odpovědi serveru:
Hello World!
4) Z adresáře, kam jste stáhli ukázkový kód, přejděte do adresáře, který obsahuje loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Z pohledu sítě běží celá aplikace na jediném hostiteli (místním počítači nebo virtuálním počítači Cloud Shell). Proto můžete použít localhostzasílat žádosti Server.
10) Přestat loadgen и Server, zadejte Ctrl-c v každém okně terminálu.
11) V okně terminálu loadgen deaktivace virtuálního prostředí:
deactivate
Balení aplikace do kontejnerů
Chcete-li spustit aplikaci na GKE, musíte zabalit ukázkovou aplikaci − Server и loadgen - v kontejnery. Kontejner je způsob, jak zabalit aplikaci a izolovat ji od jejího prostředí.
Chcete-li zabalit aplikaci do kontejneru, potřebujete dockerfile. dockerfile je textový soubor, který definuje příkazy pro sestavení zdrojového kódu aplikace a jejích závislostí Obrázek dockeru. Po vytvoření nahrajete obrázek do registru kontejnerů, jako je Docker Hub nebo Registr kontejnerů.
Příklad již má dockerfile pro Server и loadgen se všemi potřebnými příkazy ke shromažďování obrázků. Níže - dockerfile pro 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 FROM python:3-slim jako základ řekne Dockeru, aby použil nejnovější Obrázek Python 3 jako základ.
Tým KOPÍROVAT. . zkopíruje zdrojové soubory do aktuálního pracovního adresáře (pouze v našem případě server.py) do systému souborů kontejneru.
VSTUPNÍ BOD definuje příkaz, který se používá ke spuštění kontejneru. V našem případě je tento příkaz téměř stejný jako ten, který jste použili ke spuštění server.py ze zdrojového kódu.
Tým ODHALIT naznačuje to Server čeká na data přes port 8080. Tento tým není poskytuje porty. Toto je nějaká dokumentace, která je potřeba k otevření portu 8080 při spouštění kontejneru.
Příprava na kontejnerizaci vaší aplikace
1) Nastavte následující proměnné prostředí. Nahradit PROJECT_ID na vaše ID projektu GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Pomocí hodnot PROJECT_ID и GCR_REPO označíte obraz Dockeru při jeho sestavování a odešlete jej do soukromého registru kontejnerů.
2) Nastavte výchozí projekt GCP pro nástroj příkazového řádku gcloud.
gcloud config set project $PROJECT_ID
3) Nastavte výchozí zónu pro nástroj příkazového řádku gcloud.
gcloud config set compute/zone us-central1-b
4) Ujistěte se, že je v projektu GCP povolena služba Container Registry.
Zkontrolujte seznam obrázků v úložišti a ověřte, zda byly obrázky nahrány:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Příkaz zobrazí názvy nově nahraných obrázků:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Vytvoření clusteru GKE.
Tyto kontejnery lze spustit na virtuálním počítači Cloud Shell nebo na počítači s příkazem docker run. Ale v produkčním prostředí potřebujete způsob, jak centrálně organizovat kontejnery. Potřebujete například systém, který zajišťuje, že kontejnery jsou vždy spuštěny, a potřebujete způsob, jak škálovat a roztočit další instance kontejnerů, pokud se provoz zvýší.
Ke spouštění kontejnerizovaných aplikací můžete použít G.K.E.. GKE je platforma pro orchestraci kontejnerů, která agreguje virtuální stroje do clusteru. Každý virtuální stroj se nazývá uzel. Klastry GKE jsou založeny na open source systému správy clusterů Kubernetes. Kubernetes poskytuje mechanismy pro interakci s clusterem.
Tým gcloud vytvoří cluster isioready v projektu GCP a výchozí zóně, kterou jste zadali. Pro spuštění Istio doporučujeme mít alespoň 4 uzly a virtuální stroj n1-standard-2.
Tým vytvoří shluk během několika minut. Když je cluster připraven, příkaz vydá něco takového сообщение.
2) Zadejte přihlašovací údaje v nástroji příkazového řádku kubectlpro jeho použití ke správě clusteru:
3) Nyní můžete komunikovat s Kubernetes přes kubectl. Například následující příkaz může zjistit stav uzlů:
kubectl get nodes
Příkaz vytvoří seznam uzlů:
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
Klíčové koncepty Kubernetes
Diagram ukazuje aplikaci na GKE:
Než nasadíte kontejnery v GKE, seznamte se s klíčovými koncepty Kubernetes. Na samém konci jsou odkazy, pokud se chcete dozvědět více.
Uzly a shluky. V GKE je uzel virtuální stroj. Na jiných platformách Kubernetes může být uzlem počítač nebo virtuální počítač. Cluster je kolekce uzlů, které lze považovat za jednu jednotku, kde nasazujete kontejnerizovanou aplikaci.
Pods. V Kubernetes běží kontejnery v podech. Pod v Kubernetes je nedělitelná jednotka. Pod pojmem jednu nebo více nádob. Nasadíte serverové kontejnery a loadgen v samostatných kapslích. Pokud je v podu několik kontejnerů (například aplikační server a proxy server), kontejnery jsou spravovány jako jedna entita a sdílejí prostředky pod.
Nasazení. V Kubernetes je nasazení objekt, který je kolekcí identických modulů. Deployment spustí několik replik podů distribuovaných mezi uzly clusteru. Nasazení automaticky nahradí moduly, které selhaly nebo nereagují.
Služba Kubernetes. Při spuštění kódu aplikace v GKE je spojení mezi loadgen и Server. Když jste spustili služby na virtuálním počítači nebo desktopu Cloud Shell, odeslali jste požadavky na Server по адресу localhost: 8080. Po nasazení do GKE se pody spouštějí na dostupných uzlech. Ve výchozím nastavení nemáte žádnou kontrolu nad tím, na kterém uzlu modul běží, takže vy lusky žádné trvalé IP adresy.
Chcete-li získat adresu IP pro Server, musíte definovat síťovou abstrakci na vrcholu podů. Tak to je Služba Kubernetes. Služba Kubernetes poskytuje trvalý koncový bod pro sadu podů. Je tu pár typy služeb. Server použití LoadBalancer, který poskytuje externí IP adresu, kterou lze kontaktovat Server z vnějšku shluku.
Kubernetes má také vestavěný systém DNS, který přiděluje názvy DNS (např. helloserver.default.cluster.local) služby. Díky tomu pody v rámci clusteru komunikují s ostatními pody v clusteru na trvalé adrese. Název DNS nelze použít mimo cluster, například v Cloud Shell nebo v počítači.
Kubernetes manifestuje
Když jste spustili aplikaci ze zdroje, použili jste imperativní příkaz python3
server.py
Imperativ znamená sloveso: „udělej to“.
Kubernetes používá deklarativní model. To znamená, že Kubernetes neříkáme přesně, co má dělat, ale spíše popisujeme požadovaný stav. Například Kubernetes spouští a zastavuje moduly podle potřeby, aby se zajistilo, že skutečný stav systému odpovídá požadovanému stavu.
Požadovaný stav uvádíte v manifestech nebo souborech Yaml. Soubor YAML obsahuje specifikace pro jeden nebo více objektů Kubernetes.
Příklad obsahuje soubor YAML pro Server и loadgen. Každý soubor YAML určuje požadovaný stav objektu nasazení a služby Kubernetes.
Buďte k sobě navzájem přátelští 💁 označuje typ objektu.
metadata.name určuje název nasazení.
První pole spec obsahuje popis požadovaného stavu.
spec.repliky označuje požadovaný počet podů.
Část spec.šablona definuje šablonu pod. Ve specifikaci modulu je pole obraz, který určuje název obrázku, který má být extrahován z registru kontejnerů.
LoadBalancer: Klienti odesílají požadavky na IP adresu nástroje pro vyrovnávání zatížení, který má trvalou IP adresu a je přístupný zvenčí clusteru.
targetPort: jak si vzpomínáte, tým EXPOZICE 8080 в dockerfile neposkytl porty. Poskytnete port 8080abyste mohli kontaktovat kontejner Server mimo shluk. V našem případě hellosvc.default.cluster.local:80 (krátké jméno: hellosvc) odpovídá portu 8080 Pod IP adresy helloserver.
přístav: Toto je číslo portu, kam budou ostatní služby v clusteru odesílat požadavky.
loadgen.yaml
Objekt nasazení do loadgen.yaml vypadat jako server.yaml. Rozdíl je v tom, že objekt nasazení obsahuje sekci env. Definuje proměnné prostředí, které jsou potřeba loadgen a které jste nainstalovali při spouštění aplikace ze zdroje.
čas loadgen nepřijímá příchozí požadavky na pole typ označeno ClusterIP. Tento typ poskytuje trvalou adresu IP, kterou mohou používat služby v clusteru, ale tato adresa IP není vystavena externím klientům.
Nahradit PROJECT_ID na vaše ID projektu GCP.
9) Uložte a zavřete loadgen.yaml, zavřete textový editor.
10) Nasaďte soubor YAML do Kubernetes:
kubectl apply -f loadgen.yaml
Po úspěšném dokončení příkaz vytvoří následující kód:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Zkontrolujte stav modulů:
kubectl get pods
Příkaz ukazuje stav:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Extrahujte protokoly aplikací z modulu loadgen. Nahradit POD_ID na identifikátor z předchozí odpovědi.
kubectl logs loadgenerator-POD_ID
13) Získejte externí IP adresy hellosvc:
kubectl get service
Odpověď na příkaz vypadá 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šlete žádost na hellosvc: vyměnit EXTERNAL_IP na externí IP adresu hellosvc.
curl http://EXTERNAL_IP
Pojďme na Istio
Již máte aplikaci nasazenou do GKE. loadgen může používat Kubernetes DNS (hellosvc:80) k zasílání žádostí Servera můžete posílat žádosti na Server pomocí externí IP adresy. Přestože má Kubernetes mnoho funkcí, některé informace o službách chybí:
Jak se služby vzájemně ovlivňují? Jaké jsou vztahy mezi službami? Jak probíhá provoz mezi službami? Jste si toho vědomi? loadgen zasílá žádosti na Server, ale představte si, že o aplikaci nic nevíte. Abychom na tyto otázky odpověděli, podívejme se na seznam běhových modulů v GKE.
Metriky. Jak dlouho Server reaguje na příchozí požadavek? Kolik požadavků za sekundu server přijímá? Vypisuje chybové hlášky?
Bezpečnostní informace. Provoz mezi loadgen и Server jen prochází HTTP nebo od mTLS?
Istio na všechny tyto otázky odpovídá. K tomu Istio umístí proxy postranního vozíku Vyslanec v každém lusku. Envoy proxy zachycuje veškerý příchozí a odchozí provoz do aplikačních kontejnerů. Znamená to, že Server и loadgen přijímat prostřednictvím proxy postranního vozíku Envoy a veškerý provoz z loadgen к Server prochází přes Envoy proxy.
Spojení mezi Envoy proxy tvoří síť služeb. Architektura service mesh poskytuje vrstvu kontroly nad Kubernetes.
Vzhledem k tomu, že proxy servery Envoy běží ve svých vlastních kontejnerech, lze Istio nainstalovat nad cluster GKE téměř beze změn v kódu aplikace. Ale udělali jste kus práce, abyste svou aplikaci připravili na správu Istio:
Servis pro všechny kontejnery. K nasazení Server и loadgen svázaný se službou Kubernetes. Dokonce loadgen, která nepřijímá příchozí požadavky, existuje služba.
Porty ve službách musí mít názvy. Ačkoli porty služeb mohou být v GKE ponechány bez názvu, Istio vyžaduje, abyste je specifikovali název portu v souladu s jeho protokolem. V souboru YAML je port pro Server tzv. httpprotože server používá protokol HTTP... Li servis použitý gRPC, pojmenovali byste port grpc.
Nasazení jsou označena. Proto můžete používat funkce správy provozu Istio, jako je rozdělení provozu mezi verzemi stejné služby.
Instalace
Existují dva způsoby, jak nainstalovat Istio. Umět povolit Istio na rozšíření GKE nebo nainstalujte verzi Istio s otevřeným zdrojovým kódem na clusteru. S Istio na GKE můžete snadno spravovat instalace a upgrady Istio v průběhu životního cyklu clusteru GKE. Pokud chcete nejnovější verzi Istio nebo větší kontrolu nad konfigurací ovládacího panelu Istio, nainstalujte si verzi s otevřeným zdrojovým kódem namísto rozšíření Istio na GKE. Chcete-li se rozhodnout o přístupu, přečtěte si článek Potřebuji Istio na GKE?.
Vyberte možnost, prohlédněte si příslušnou příručku a podle pokynů nainstalujte Istio do svého clusteru. Pokud chcete používat Istio s vaší nově nasazenou aplikací, umožnit implementaci postranního vozíku pro jmenný prostor standardní.
Čištění
Abyste zabránili účtování prostředků, které jste použili v tomto kurzu, na váš účet Google Cloud Platform, smažte cluster kontejnerů, jakmile nainstalujete Istio a budete hrát s ukázkovou aplikací. Tím odeberete všechny prostředky clusteru, jako jsou výpočetní instance, disky a síťové prostředky.