Az Istio egy kényelmes eszköz az elosztott alkalmazások csatlakoztatására, biztosítására és figyelésére. Az Istio számos technológiát használ a szoftverek nagyarányú futtatására és kezelésére, beleértve az alkalmazáskód csomagoló tárolóit és a telepítéshez szükséges függőségeket, valamint a Kuberneteset a tárolók kezelésére. Ezért az Istio-val való együttműködéshez tudnia kell, hogyan működik az ezeken a technológiákon alapuló több szolgáltatást tartalmazó alkalmazás nélkül Istio. Ha ezeket az eszközöket és fogalmakat már ismeri, nyugodtan hagyja ki ezt az oktatóanyagot, és lépjen közvetlenül a szakaszra Az Istio telepítése a Google Kubernetes Engine-re (GKE) vagy bővítmény telepítése Istio a GKE-n.
Ez egy lépésről lépésre bemutatott útmutató, amelyben végigvezetjük a teljes folyamatot a forráskódtól a GKE-tárolóig, hogy egy példán keresztül alapvető ismereteket nyújtsunk ezekről a technológiákról. Azt is látni fogja, hogy az Istio hogyan hasznosítja e technológiák erejét. Ez azt feltételezi, hogy nem tud semmit a tárolókról, a Kubernetesekről, a szervizhálókról vagy az Istio-ról.
feladatok
Ebben az oktatóanyagban a következő feladatokat hajtja végre:
Egy egyszerű hello world alkalmazás megtanulása több szolgáltatással.
Futtassa az alkalmazást a forráskódból.
Az alkalmazás csomagolása konténerekbe.
Kubernetes-fürt létrehozása.
Tárolók telepítése fürtbe.
Mielőtt elkezded
Kövesse az utasításokat a Kubernetes Engine API engedélyezéséhez:
Ebben az oktatóanyagban használhatja a Cloud Shell-t, amely előkészíti a virtuális gépet g1-small a Google Compute Engine-ben Debian-alapú Linuxszal vagy Linuxos vagy macOS számítógéppel.
A lehetőség: Cloud Shell használata
A Cloud Shell használatának előnyei:
Python 2 és Python 3 fejlesztői környezetek (beleértve virtualenv) teljesen be vannak állítva.
Parancssori eszközök gcloud, dokkmunkás, csoportos it и kubectl, amelyeket használni fogunk, már telepítve vannak.
Több szolgáltatást tartalmazó alkalmazás felfedezése
A példaalkalmazás Python nyelven íródott, és két olyan összetevőből áll, amelyek egymással együttműködnek REST:
szerver: egyszerű szerver egy végponttal SZEREZZ, /, amely a "hello world"-et írja ki a konzolra.
loadgen: szkript, amely forgalmat küld a címre szerver, másodpercenként konfigurálható kérések számával.
Alkalmazás futtatása forráskódból
A példaalkalmazás felfedezéséhez futtassa azt a Cloud Shellben vagy számítógépén.
1) A katalógusban istio-samples/sample-apps/helloserver fuss szerver:
python3 server/server.py
Indításkor szerver a következő jelenik meg:
INFO:root:Starting server...
2) Nyisson meg egy másik terminálablakot a kérések elküldéséhez szerver. Ha Cloud Shellt használ, kattintson a Hozzáadás ikonra egy másik munkamenet megnyitásához.
3) Küldjön kérést a címre szerver:
curl http://localhost:8080
szerver válaszol:
Hello World!
4) Abból a könyvtárból, ahonnan a mintakódot letöltötte, lépjen arra a könyvtárra, amelyik tartalmazza loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Hálózati szempontból a teljes alkalmazás egyetlen gazdagépen (helyi számítógépen vagy Cloud Shell virtuális gépen) fut. Ezért használhatja localhostcímre kéréseket küldeni szerver.
10) Megállni loadgen и szerver, belép Ctrl-c minden terminálablakban.
11) A terminál ablakban loadgen deaktiválja a virtuális környezetet:
deactivate
Alkalmazás csomagolása konténerekbe
Az alkalmazás GKE-n való futtatásához csomagolni kell a minta alkalmazást − szerver и loadgen - ban ben Konténerek. A tároló egy módja annak, hogy egy alkalmazást csomagoljon, hogy elkülönítse azt a környezetétől.
Ha egy alkalmazást tárolóba szeretne csomagolni, szüksége van dockerfile. dockerfile egy szöveges fájl, amely parancsokat határoz meg az alkalmazás forráskódjának és függőségeinek beépítéséhez Docker kép. Az elkészítést követően feltölti a képet egy konténer-nyilvántartásba, például a Docker Hub vagy Container Registry.
A példa már megvan dockerfile a szerver и loadgen a képek összegyűjtéséhez szükséges összes paranccsal. Lent - dockerfile a szerver:
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" ]
Csapat pythontól: 3-slim alapként azt mondja a Dockernek, hogy használja a legújabbat Python 3 kép mint alap.
Csapat MÁSOLAT. . a forrásfájlokat az aktuális munkakönyvtárba másolja (csak a mi esetünkben server.py) a tároló fájlrendszerébe.
BELÉPÉSI PONT meghatározza a tároló indításához használt parancsot. Esetünkben ez a parancs majdnem ugyanaz, mint amit korábban futtattál server.py forráskódból.
Csapat KIFEJEZNI azt jelzi szerver adatokra vár a porton keresztül 8080. Ez a csapat nem portokat biztosít. Ez egyfajta dokumentáció, amely szükséges a port megnyitásához 8080 a tartály indításakor.
Felkészülés az alkalmazás konténerbe helyezésére
1) Állítsa be a következő környezeti változókat. Cserélje ki PROJECT_ID a GCP-projektazonosítóhoz.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Értékek használata PROJECT_ID и GCR_REPO felcímkézed a Docker-képet, amikor összeállítod, és egy privát tároló-nyilvántartásba helyezed.
2) Állítsa be a parancssori eszköz alapértelmezett GCP-projektjét gcloud.
gcloud config set project $PROJECT_ID
3) Állítsa be a parancssori eszköz alapértelmezett zónáját gcloud.
gcloud config set compute/zone us-central1-b
4) Győződjön meg arról, hogy a Container Registry szolgáltatás engedélyezve van a GCP-projektben.
Tekintse át a tárhelyben lévő képek listáját, és ellenőrizze, hogy a képeket feltöltötte:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
A parancs megjeleníti az újonnan feltöltött képek nevét:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
GKE-klaszter létrehozása.
Ezek a tárolók futtathatók Cloud Shell virtuális gépen vagy számítógépen a paranccsal docker fut. De termelési környezetben szükség van a konténerek központi hangszerelésére. Szüksége van például egy olyan rendszerre, amely biztosítja, hogy a tárolók mindig futjanak, és szükség van egy módra a további tárolópéldányok bővítésére és felpörgetésére, ha a forgalom növekszik.
Konténeres alkalmazások futtatásához használhatja G.K.E.. A GKE egy konténer-hangszerelési platform, amely a virtuális gépeket egy fürtbe összesíti. Minden virtuális gépet csomópontnak neveznek. A GKE-fürtök a nyílt forráskódú Kubernetes fürtkezelő rendszeren alapulnak. A Kubernetes mechanizmusokat biztosít a fürttel való interakcióhoz.
Csapat gcloud létrehoz egy istioready fürtöt a megadott GCP-projektben és alapértelmezett zónában. Az Istio futtatásához legalább 4 csomópontot és egy virtuális gépet javasolunk n1-standard-2.
A csapat néhány perc alatt létrehozza a klasztert. Amikor a fürt készen áll, a parancs valami ilyesmit ad ki сообщение.
2) Adja meg a hitelesítő adatokat a parancssori eszközben kubectla fürt kezeléséhez:
3) Most már kommunikálhat a Kubernetes segítségével kubectl. Például a következő paranccsal megtudhatja a csomópontok állapotát:
kubectl get nodes
A parancs létrehozza a csomópontok listáját:
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
Kubernetes kulcsfogalmak
Az ábra egy alkalmazást mutat a GKE-n:
Mielőtt telepítené a tárolókat a GKE-ben, ismerje meg a Kubernetes kulcsfogalmait. A legvégén linkek találhatók, ha többet szeretnél megtudni.
Csomópontok és klaszterek. A GKE-ben a csomópont egy virtuális gép. Más Kubernetes platformokon a csomópont lehet számítógép vagy virtuális gép. A fürt olyan csomópontok gyűjteménye, amelyek egyetlen egységnek tekinthetők, ahol egy konténeres alkalmazást telepít.
Hüvelyek. Kubernetesben a konténerek hüvelyben futnak. A kubernetesi pod egy oszthatatlan egység. Egy tok egy vagy több tartályt tartalmaz. Szerverkonténereket telepít és loadgen külön hüvelyekben. Ha több konténer van egy podban (például egy alkalmazáskiszolgáló és proxy szerver), a tárolók egyetlen entitásként kezelhetők, és megosztják a pod erőforrásokat.
Telepítések. A Kubernetesben a központi telepítés egy olyan objektum, amely azonos pod-ok gyűjteménye. Az üzembe helyezés több, a fürtcsomópontok között elosztott pod-replikákat indít el. A telepítés automatikusan lecseréli a meghibásodott vagy nem reagáló podokat.
Kubernetes szolgáltatás. Az alkalmazáskód GKE-ben való futtatásakor a kapcsolat között loadgen и szerver. Amikor elindította a szolgáltatásokat egy Cloud Shell virtuális gépen vagy asztalon, kéréseket küldött a címre szerver a localhost: 8080. A GKE-ben való üzembe helyezés után a pod-ok végrehajtásra kerülnek az elérhető csomópontokon. Alapértelmezés szerint nem szabályozhatja, hogy a pod melyik csomóponton fut, így Ön hüvelyek nincs állandó IP-cím.
IP-cím beszerzéséhez szerver, meg kell határoznia egy hálózati absztrakciót a podok tetején. Az az ami Kubernetes szolgáltatás. A Kubernetes szolgáltatás állandó végpontot biztosít a pod-készlethez. Van néhány típusú szolgáltatások. szerver felhasznál Terhelés elosztó, amely külső IP-címet biztosít a kapcsolatfelvételhez szerver a klaszteren kívülről.
A Kubernetes rendelkezik egy beépített DNS-rendszerrel is, amely DNS-neveket rendel hozzá (pl. helloserver.default.cluster.local) szolgáltatások. Ennek köszönhetően a fürtön belüli podok állandó címen kommunikálnak a fürt többi podjával. A DNS-név nem használható a fürtön kívül, például a Cloud Shellben vagy számítógépen.
Kubernetes manifesztálódik
Amikor az alkalmazást forrásból futtatta, az imperative parancsot használta python3
server.py
A felszólító kifejezés egy igét jelent: „csináld ezt”.
Kubernetes használ deklaratív modell. Ez azt jelenti, hogy nem mondjuk meg a Kubernetesnek, hogy pontosan mit kell tennie, hanem inkább a kívánt állapotot írjuk le. Például a Kubernetes szükség szerint elindítja és leállítja a sorba rendezéseket, hogy a rendszer aktuális állapota összhangban legyen a kívánt állapottal.
A kívánt állapotot jegyzékekben vagy fájlokban jelzi YAML. A YAML-fájl egy vagy több Kubernetes-objektum specifikációit tartalmazza.
A példa a következőhöz tartozó YAML fájlt tartalmazza szerver и loadgen. Minden YAML-fájl megadja a telepítési objektum és a Kubernetes-szolgáltatás kívánt állapotát.
Első mező spec tartalmazza a kívánt állapot leírását.
spec.replicas jelzi a hüvelyek kívánt számát.
rész spec.template pod sablont határoz meg. A pod specifikációjában van egy mező kép, amely megadja annak a képnek a nevét, amelyet ki kell bontani a Container Registry-ből.
Terhelés elosztó: Az ügyfelek kéréseket küldenek a terheléselosztó IP-címére, amely állandó IP-címmel rendelkezik, és a fürtön kívülről is elérhető.
célPort: mint emlékszel, a csapat KIFEJEZÉS 8080 в dockerfile nem biztosított portokat. Te biztosítod a portot 8080hogy kapcsolatba léphessen a konténerrel szerver klaszteren kívül. A mi esetünkben hellosvc.default.cluster.local:80 (Rövid név: hellosvc) a portnak felel meg 8080 Pod IP-címek helloserver.
kikötő: Ez az a portszám, amelyre a fürt többi szolgáltatása kéréseket küld.
loadgen.yaml
Telepítési objektum loadgen.yaml hasonló szerver.yaml. A különbség az, hogy a telepítési objektum tartalmaz egy szakaszt env. Meghatározza a szükséges környezeti változókat loadgen és amelyeket az alkalmazás forrásból való futtatásakor telepített.
Idő loadgen nem fogad beérkező kéréseket, a mezőre típus ismeretlen ClusterIP. Ez a típus egy állandó IP-címet biztosít, amelyet a fürt szolgáltatásai használhatnak, de ez az IP-cím nem érhető el külső ügyfelek számára.
Cserélje ki PROJECT_ID a GCP-projektazonosítóhoz.
9) Mentse el és zárja be loadgen.yaml, zárja be a szövegszerkesztőt.
10) Telepítse a YAML fájlt a Kubernetesbe:
kubectl apply -f loadgen.yaml
Sikeres befejezés után a parancs a következő kódot állítja elő:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Ellenőrizze a hüvelyek állapotát:
kubectl get pods
A parancs az állapotot mutatja:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Az alkalmazásnaplók kibontása a podból loadgen. Cserélje ki POD_ID az előző válaszból származó azonosítóhoz.
kubectl logs loadgenerator-POD_ID
13) Szerezzen be külső IP-címeket hellosvc:
kubectl get service
A parancs válasza valahogy így néz ki:
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) Küldjön kérést a címre hellosvc: csere EXTERNAL_IP külső IP-címre hellosvc.
curl http://EXTERNAL_IP
Vegyük Istiót
Már van egy alkalmazás telepítve a GKE-ben. loadgen használhatja a Kubernetes DNS-t (hellosvc:80) kérések küldéséhez szerverés kéréseket küldhet a címre szerver külső IP-cím alapján. Bár a Kubernetes számos funkcióval rendelkezik, néhány információ hiányzik a szolgáltatásokról:
Hogyan működnek együtt a szolgáltatások? Milyen kapcsolatok vannak a szolgáltatások között? Hogyan folyik a forgalom a szolgáltatások között? Tisztában vagy azzal loadgen címre küld kéréseket szerver, de képzelje el, hogy semmit sem tud az alkalmazásról. A kérdések megválaszolásához nézzük meg a GKE futó pod-listáját.
Metrikák. Meddig szerver válaszol egy bejövő kérésre? Hány kérést kap másodpercenként a szerver? Hibaüzeneteket ad?
Biztonsági információk. közötti forgalom loadgen и szerver csak átmegy HTTP vagy által mTLS?
Istio válaszol ezekre a kérdésekre. Ehhez Istio oldalkocsis proxyt helyez el Követ minden hüvelyben. Az Envoy proxy elfogja az alkalmazástárolókba irányuló összes bejövő és kimenő forgalmat. Ez azt jelenti szerver и loadgen oldalkocsi-proxy Envoy-n keresztül fogadja, és az összes forgalmat loadgen к szerver keresztül megy a Envoy proxy-n.
Az Envoy proxy-k közötti kapcsolatok szolgáltatáshálót alkotnak. A szolgáltatásháló-architektúra egy vezérlési réteget biztosít a Kubernetes tetején.
Mivel az Envoy proxy-k saját konténereikben futnak, az Istio a GKE-fürt tetejére telepíthető az alkalmazáskód szinte változtatása nélkül. De végzett egy kis munkát, hogy az alkalmazását az Istio kezelhesse:
Szolgáltatások minden konténerhez. A bevetésekhez szerver и loadgen a Kubernetes szolgáltatáshoz kötve. Még loadgen, amely nem fogad beérkező kéréseket, van szolgáltatás.
A szolgáltatásokban lévő portoknak nevet kell adni. Bár a szolgáltatási portok név nélkül maradhatnak a GKE-ben, az Istio megköveteli, hogy adja meg port neve protokolljának megfelelően. A YAML fájlban a port szerver hívott httpmert a szerver a protokollt használja HTTP... Ha szolgáltatás használt gRPC, akkor neveznéd a kikötőt grpc.
A telepítések meg vannak jelölve. Ezért használhatja az Istio forgalomkezelési szolgáltatásait, például a forgalom felosztását ugyanazon szolgáltatás verziói között.
Telepítés
Az Istio telepítésének két módja van. Tud engedélyezze az Istio-t a GKE bővítményen vagy telepítse az Istio nyílt forráskódú verzióját a klaszteren. A GKE-n található Istio segítségével könnyedén kezelheti az Istio-telepítéseket és frissítéseket a GKE-fürt teljes életciklusa során. Ha az Istio legfrissebb verzióját szeretné, vagy jobban szabályozni szeretné az Istio vezérlőpult konfigurációját, telepítse a nyílt forráskódú verziót az Istio on GKE bővítmény helyett. A megközelítés eldöntéséhez olvassa el a cikket Kell nekem Istio a GKE-n?.
Válasszon ki egy lehetőséget, tekintse át a megfelelő útmutatót, és kövesse az utasításokat az Istio fürtre történő telepítéséhez. Ha az Istio-t az újonnan telepített alkalmazással szeretné használni, lehetővé teszi az oldalkocsis megvalósítást névtérhez alapértelmezett.
Очистка
Ha el szeretné kerülni, hogy az oktatóanyagban felhasznált erőforrásokért Google Cloud Platform-fiókját terheljük meg, törölje a tárolófürtöt, miután telepítette az Istio-t, és játszott a példaalkalmazással. Ezzel eltávolítja az összes fürt erőforrást, például számítási példányokat, lemezeket és hálózati erőforrásokat.