Istio se yon zouti pratik pou konekte, sekirize ak kontwole aplikasyon distribiye yo. Istio sèvi ak yon varyete teknoloji pou kouri ak jere lojisyèl nan echèl, tankou resipyan pou pake kòd aplikasyon ak depandans pou deplwaman, ak Kubernetes pou jere resipyan sa yo. Se poutèt sa, pou travay ak Istio ou dwe konnen ki jan yon aplikasyon ki gen plizyè sèvis ki baze sou teknoloji sa yo fonksyone san yo pa Istio. Si zouti ak konsèp sa yo deja abitye pou ou, santi yo lib pou sote leson patikilye sa a epi ale tou dwat nan seksyon an Enstale Istio sou Google Kubernetes Engine (GKE) oswa enstale yon ekstansyon Istio sou GKE.
Sa a se yon gid etap pa etap kote nou pral mache atravè tout pwosesis la soti nan kòd sous ak veso GKE ba ou yon konpreyansyon debaz sou teknoloji sa yo atravè yon egzanp. Ou pral wè tou ki jan Istio pwofite pouvwa teknoloji sa yo. Sa a sipoze ou pa konnen anyen sou resipyan, Kubernetes, may sèvis, oswa Istio.
travay
Nan leson patikilye sa a, ou pral ranpli travay sa yo:
Aprann yon senp aplikasyon bonjou mond ak plizyè sèvis.
Kouri aplikasyon an soti nan kòd sous.
Anbalaj aplikasyon an nan resipyan.
Kreye yon gwoup Kubernetes.
Deplwaye resipyan nan yon gwoup.
Anvan ou kòmanse
Swiv enstriksyon yo pou pèmèt API Kubernetes Engine:
Nan leson patikilye sa a, ou ka itilize Cloud Shell, ki prepare machin vityèl la g1-small nan Google Compute Engine ak Linux ki baze sou Debian, oswa yon òdinatè Linux oswa macOS.
Opsyon A: Sèvi ak Cloud Shell
Avantaj lè w sèvi ak Cloud Shell:
Anviwònman devlopman Python 2 ak Python 3 (ki gen ladan virtualenv) yo konplètman configuré.
Zouti Liy Kòmand gcloud, wokè, ale и kubectl, ke nou pral itilize yo deja enstale.
Echantiyon aplikasyon an ekri nan Python epi li konsiste de de eleman ki kominike lè l sèvi avèk REST:
sèvè: senp sèvè ak yon pwen final JWENN, /, ki enprime "bonjou mond" nan konsole a.
loadgen: script ki voye trafik nan sèvè, ak yon kantite configurable nan demann pou chak segonn.
Kouri yon aplikasyon nan kòd sous
Pou eksplore echantiyon aplikasyon an, kouri li nan Cloud Shell oswa sou òdinatè w lan.
1) Nan katalòg la istio-samples/sample-apps/helloserver kouri sèvè:
python3 server/server.py
Nan demaraj sèvè sa ki annapre yo parèt:
INFO:root:Starting server...
2) Louvri yon lòt fenèt tèminal pou voye demann bay sèvè. Si w ap itilize Cloud Shell, klike sou ikòn ajoute pou ouvri yon lòt sesyon.
3) Voye yon demann bay sèvè:
curl http://localhost:8080
repons sèvè:
Hello World!
4) Soti nan anyè kote ou telechaje kòd egzanp lan, ale nan anyè ki genyen ladan l loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Soti nan yon pèspektiv rezo, aplikasyon an antye kouri sou yon sèl lame (òdinatè lokal oswa Cloud Shell machin vityèl). Se poutèt sa ou ka itilize lokalostpou voye demann bay sèvè.
10) Pou sispann loadgen и sèvè, antre Ctrl-c nan chak fenèt tèminal.
11) Nan fennèt tèminal la loadgen dezaktive anviwònman vityèl la:
deactivate
Anbalaj yon aplikasyon nan resipyan
Pou kouri aplikasyon an sou GKE, ou bezwen pake echantiyon aplikasyon an - sèvè и loadgen - nan resipyan. Yon veso se yon fason pou pake yon aplikasyon pou izole li nan anviwònman li.
Pou pake yon aplikasyon nan yon veso, ou bezwen dockerfile. dockerfile se yon dosye tèks ki defini kòmandman pou bati kòd sous aplikasyon an ak depandans li yo nan Docker imaj. Yon fwa bati, ou telechaje imaj la nan yon rejis veso tankou Docker Hub oswa Rejis veso.
Egzanp lan deja genyen dockerfile pou sèvè и loadgen ak tout kòmandman ki nesesè yo kolekte imaj. Anba a - dockerfile pou sèvè:
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" ]
Ekip SOTI nan piton: 3-slim kòm baz di Docker pou l sèvi ak dènye a Python 3 imaj kòm yon baz.
Ekip KOPI. . kopye fichye sous yo nan anyè k ap travay aktyèl la (nan ka nou an sèlman server.py) nan sistèm dosye veso a.
ENTRYPOINT defini kòmandman ki itilize pou kòmanse veso a. Nan ka nou an, kòmandman sa a se prèske menm jan ak sa ou te konn kouri a server.py soti nan kòd sous.
Ekip Ekspoze endike sa sèvè tann pou done nan pò a 8080. Ekip sa a pa bay pò. Sa a se kèk kalite dokiman ki nesesè yo louvri pò a 8080 lè w kòmanse veso a.
Preparasyon pou mete aplikasyon w lan nan kontenè
1) Mete varyab anviwònman sa yo. Ranplase PROJECT_ID nan ID pwojè GCP ou a.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Sèvi ak valè PROJECT_ID и GCR_REPO ou tag imaj la Docker lè ou bati li epi pouse li nan yon Rejis Container prive.
2) Mete pwojè GCP default pou zouti liy kòmand la gcloud.
gcloud config set project $PROJECT_ID
3) Mete zòn default pou zouti liy lòd la gcloud.
gcloud config set compute/zone us-central1-b
4) Asire w ke sèvis Rejis Container la aktive nan pwojè GCP la.
Revize lis imaj yo nan depo a epi verifye ke imaj yo te telechaje:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Kòmandman an montre non imaj ki fèk telechaje yo:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Kreye yon gwoup GKE.
Kontenè sa yo ta ka kouri sou yon machin vityèl Cloud Shell oswa sou yon òdinatè ak lòd la Dokè kouri. Men, nan yon anviwònman pwodiksyon, ou bezwen yon fason santralman òkestre kontenè. Pa egzanp, ou bezwen yon sistèm ki asire ke kontenè yo toujou ap fonksyone, epi ou bezwen yon fason pou monte ak vire plis ka veso si trafik ogmante.
Pou kouri aplikasyon conteneur ou ka itilize G.K.E.. GKE se yon platfòm orchestration veso ki rasanble machin vityèl nan yon gwoup. Chak machin vityèl yo rele yon ne. Gwoup GKE yo baze sou sistèm jesyon gwoup sous louvri Kubernetes. Kubernetes bay mekanis pou kominike avèk gwoup la.
Ekip gcloud kreye yon gwoup ki pare nan pwojè GCP ak zòn default ou espesifye. Pou kouri Istio, nou rekòmande pou gen omwen 4 nœuds ak yon machin vityèl n1-estanda-2.
Ekip la kreye gwoup la nan kèk minit. Lè gwoup la pare, kòmandman an pwodui yon bagay tankou sa a сообщение.
2) Bay kalifikasyon yo nan zouti liy lòd la kubectlpou itilize li pou jere gwoup la:
3) Koulye a, ou ka kominike ak Kubernetes atravè kubectl. Pou egzanp, lòd sa a ka jwenn estati a nan nœuds:
kubectl get nodes
Kòmandman an pwodui yon lis nœuds:
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
Konsèp kle Kubernetes
Dyagram nan montre yon aplikasyon sou GKE:
Anvan ou deplwaye resipyan nan GKE, aprann konsèp kle Kubernetes yo. Gen lyen nan fen a si ou vle aprann plis.
Nœuds ak grap. Nan GKE, yon ne se yon machin vityèl. Sou lòt platfòm Kubernetes, yon ne kapab yon òdinatè oswa yon machin vityèl. Yon gwoup se yon koleksyon nœuds ki ka konsidere kòm yon sèl inite kote ou deplwaye yon aplikasyon nan kontenè.
Gous. Nan Kubernetes, resipyan yo kouri nan gous. Yon Pod nan Kubernetes se yon inite endivizib. Yon Pod kenbe youn oswa plizyè resipyan. Ou deplwaye kontenè sèvè ak loadgen nan gous separe. Lè gen plizyè resipyan nan yon gous (pa egzanp, yon sèvè aplikasyon ak sèvè prokurasyon), resipyan yo jere kòm yon sèl antite ak pataje resous gous.
Deplwaman. Nan Kubernetes, yon deplwaman se yon objè ki se yon koleksyon gous ki idantik. Deplwaman lanse plizyè kopi gous distribye atravè nœuds gwoup yo. Deplwaman otomatikman ranplase gous ki echwe oswa ki pa reponn.
Sèvis Kubernetes. Lè w ap kouri kòd aplikasyon nan GKE, koneksyon ki genyen ant loadgen и sèvè. Lè ou te kòmanse sèvis sou yon machin vityèl Cloud Shell oswa Desktop, ou te voye demann bay sèvè nan localhost: 8080. Yon fwa yo deplwaye nan GKE, gous yo egzekite sou nœuds ki disponib. Pa default, ou pa gen okenn kontwòl sou ki ne gous la ap kouri, kidonk ou menm gous pa gen adrès IP pèmanan.
Pou jwenn yon adrès IP pou sèvè, ou bezwen defini yon abstraksyon rezo sou tèt gous yo. Se sa li ye Sèvis Kubernetes. Sèvis Kubernetes la bay yon pwen final ki pèsistan pou yon seri gous. Gen kèk kalite sèvis yo. sèvè itilizasyon LoadBalancer, ki bay yon adrès IP ekstèn pou kontakte sèvè soti deyò grap la.
Kubernetes tou gen yon sistèm dns entegre ki bay non dns (pa egzanp, helloserver.default.cluster.local) sèvis yo. Mèsi a sa a, gous nan gwoup la kominike ak lòt gous nan gwoup la nan yon adrès pèmanan. Non DNS pa ka itilize deyò gwoup la, tankou nan Cloud Shell oswa sou yon òdinatè.
Kubernetes manifeste
Lè ou kouri aplikasyon an soti nan sous, ou te itilize kòmandman an enperatif python3
server.py
Enperatif implique yon vèb: "fè sa."
Kubernetes itilize modèl deklarasyon. Sa vle di ke nou pa di Kubernetes egzakteman sa pou yo fè, men pito dekri eta a vle. Pou egzanp, Kubernetes kòmanse ak sispann gous jan sa nesesè pou kenbe eta aktyèl la nan sistèm nan ki konsistan avèk eta a vle.
Ou endike eta vle a nan manifest oswa dosye YAML. Yon dosye YAML gen espesifikasyon pou youn oswa plis objè Kubernetes.
Egzanp la gen yon dosye YAML pou sèvè и loadgen. Chak dosye YAML espesifye eta a vle nan objè a deplwaman ak sèvis Kubernetes.
Seksyon spec.modèl defini yon modèl gous. Gen yon jaden nan spesifikasyon gous la imaj, ki espesifye non an nan imaj la yo dwe ekstrè nan Rejis la Container.
LoadBalancer: Kliyan yo voye demann nan adrès IP balans chaj la, ki gen yon adrès IP ki pèsistan epi ki aksesib soti deyò gwoup la.
targetPort: jan ou sonje, ekip la Ekspoze 8080 в dockerfile pa t bay pò. Ou bay pò a 8080pou ou ka kontakte veso a sèvè andeyò gwoup la. Nan ka nou an hellosvc.default.cluster.local:80 (non kout: hellosvc) koresponn ak pò a 8080 Pod adrès IP bonjou sèvè.
pò: Sa a se nimewo pò kote lòt sèvis nan gwoup la pral voye demann.
loadgen.yaml
Deplwaman objè a loadgen.yaml sanble server.yaml. Diferans lan se ke objè a deplwaman gen yon seksyon apeprè. Li defini varyab anviwònman ki nesesè yo loadgen epi ki ou enstale lè w ap kouri aplikasyon an soti nan sous.
Times loadgen pa aksepte demann fèk ap rantre, pou jaden an kalite endike ClusterIP. Kalite sa a bay yon adrès IP ki pèsistan ke sèvis nan gwoup la ka itilize, men adrès IP sa a pa ekspoze a kliyan ekstèn.
Ranplase PROJECT_ID nan ID pwojè GCP ou a.
9) Sove epi fèmen loadgen.yaml, fèmen editè tèks la.
10) Deplwaye dosye YAML nan Kubernetes:
kubectl apply -f loadgen.yaml
Lè yo fini avèk siksè, lòd la pwodui kòd sa a:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Tcheke estati gous yo:
kubectl get pods
Kòmandman an montre estati a:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Ekstrè mòso bwa aplikasyon nan gous la loadgen. Ranplase POD_ID nan idantifyan ki soti nan repons anvan an.
kubectl logs loadgenerator-POD_ID
13) Jwenn adrès IP ekstèn hellosvc:
kubectl get service
Repons lòd la sanble yon bagay tankou sa a:
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) Voye yon demann bay hellosvc: ranplase EXTERNAL_IP nan adrès IP ekstèn hellosvc.
curl http://EXTERNAL_IP
Ann pran sou Istio
Ou deja gen yon aplikasyon deplwaye nan GKE. loadgen ka itilize Kubernetes DNS (hellosvc:80) pou voye demann bay sèvèepi ou ka voye demann bay sèvè pa adrès IP ekstèn. Malgre ke Kubernetes gen anpil karakteristik, gen kèk enfòmasyon ki manke sou sèvis yo:
Ki jan sèvis yo kominike? Ki relasyon ki genyen ant sèvis yo? Ki jan trafik koule ant sèvis yo? Èske w konnen sa loadgen voye demann bay sèvè, men imajine ke ou pa konnen anyen sou aplikasyon an. Pou reponn kesyon sa yo, ann gade lis gous k ap kouri nan GKE.
Metrik. Konbyen tan sèvè reponn a yon demann kap vini? Konbyen demann pou chak segonn yo resevwa pa sèvè a? Èske li bay mesaj erè?
Enfòmasyon sou sekirite. Trafik ant loadgen и sèvè jis pase nan HTTP oswa pa mTLS?
Istio reponn tout kesyon sa yo. Pou fè sa, Istio mete yon proxy sidecar anvwaye nan chak gous. Prokurasyon Envoy la entèsepte tout trafik k ap rantre ak sòtan nan resipyan aplikasyon yo. Sa vle di sa sèvè и loadgen resevwa atravè sidecar proxy Envoy, ak tout trafik soti nan loadgen к sèvè ale nan prokurasyon Envoy la.
Koneksyon ant proxy Envoy fòme yon may sèvis. Achitekti may sèvis la bay yon kouch kontwòl sou tèt Kubernetes.
Depi proxy Envoy yo kouri nan kontenè pwòp yo, Istio ka enstale sou tèt yon gwoup GKE ak prèske pa gen okenn chanjman nan kòd aplikasyon an. Men, ou te fè kèk travay pou prepare aplikasyon w lan pou Istio jere:
Sèvis pou tout kontenè. Pou deplwaman sèvè и loadgen mare ak sèvis Kubernetes la. Menm loadgen, ki pa resevwa demann fèk ap rantre, gen yon sèvis.
Pò nan sèvis yo dwe gen non. Malgre ke pò sèvis yo ka rete san non nan GKE, Istio mande pou ou presize non pò an akò ak pwotokòl li a. Nan dosye YAML pò a pou sèvè yo rele httppaske sèvè sèvi ak pwotokòl la HTTP... Si sèvis itilize gRPC, ou ta non pò a grpc.
Deplwaman yo make. Se poutèt sa, ou ka itilize karakteristik jesyon trafik Istio a, tankou divize trafik ant vèsyon nan menm sèvis la.
Enstalasyon
Gen de fason pou enstale Istio. Kapab pèmèt Istio sou ekstansyon GKE oswa enstale vèsyon an sous louvri nan Istio sou grap la. Avèk Istio sou GKE, ou ka fasilman jere enstalasyon Istio ak amelyorasyon nan tout sik lavi gwoup GKE. Si ou vle dènye vèsyon Istio a oswa plis kontwòl sou konfigirasyon panèl kontwòl Istio ou a, enstale vèsyon sous louvri olye pou yo Istio sou ekstansyon GKE. Pou deside sou apwòch la, li atik la Èske mwen bezwen Istio sou GKE?.
Chwazi yon opsyon, revize gid apwopriye a, epi swiv enstriksyon yo pou enstale Istio sou gwoup ou a. Si ou vle sèvi ak Istio ak aplikasyon ou fèk deplwaye, pèmèt aplikasyon sidecar pou espas non default.
Netwayaj
Pou evite ke yo te chaje nan kont Google Cloud Platform ou pou resous ou te itilize nan leson patikilye sa a, efase gwoup veso a yon fwa ou te enstale Istio epi jwe ak aplikasyon echantiyon an. Sa a pral retire tout resous gwoup, tankou enstans kalkile, disk, ak resous rezo.