Istio ji bo girêdan, ewlehî û çavdêrîkirina serîlêdanên belavkirî amûrek hêsan e. Istio cûrbecûr teknolojiyên bikar tîne da ku nermalava di pîvanê de bixebitîne û bi rê ve bibe, di nav de konteynir ji bo pakkirina koda serîlêdanê û girêdanên ji bo bicîhkirinê, û Kubernetes ji bo birêvebirina wan konteyneran. Ji ber vê yekê, ji bo ku hûn bi Istio re bixebitin divê hûn zanibin ka serîlêdanek bi gelek karûbarên li ser bingeha van teknolojiyên çawa dixebite bêyî Istio. Ger van amûr û têgihan jixwe ji we re naskirî ne, xwe ji vê dersê berdin û rasterast biçin beşê Sazkirina Istio li Google Kubernetes Engine (GKE) an sazkirina pêvekek Îstio li ser GKE.
Ev rêbernameyek gav-bi-gav e ku em ê di tevahiya pêvajoyê de ji koda çavkaniyê heya konteynera GKE bimeşin da ku hûn bi mînakek têgihiştinek bingehîn a van teknolojiyên bidin we. Her weha hûn ê bibînin ka Istio çawa hêza van teknolojiyên bikar tîne. Ev dihesibîne ku hûn di derbarê konteyneran, Kubernetes, meşên karûbarê, an Istio de tiştek nizanin.
erkên
Di vê tutoriyê de, hûn ê karên jêrîn temam bikin:
Fêrbûna serîlêdana cîhana silavê ya hêsan bi gelek karûbaran re.
Serlêdanê ji koda çavkaniyê bimeşînin.
Pakêkirina serîlêdanê di konteyneran de.
Afirandina komek Kubernetes.
Bicihkirina konteyneran di nav komekê de.
Berî ku hûn dest pê bikin
Ji bo çalakkirina Kubernetes Engine API-ê rêwerzan bişopînin:
Di vê tutoriyê de, hûn dikarin Cloud Shell, ku makîneya virtual amade dike, bikar bînin g1-piçûk di Google Compute Engine bi Linux-a-based Debian, an komputerek Linux an macOS.
Vebijêrk A: Bikaranîna Cloud Shell
Feydeyên karanîna Cloud Shell:
Jîngehên pêşkeftinê yên Python 2 û Python 3 (di nav de virtualenv) bi tevahî hatine mîheng kirin.
Amûrên Rêzika Fermandariyê gcloud, docker, git и kubectl, ku em ê bikar bînin jixwe hatine saz kirin.
Serlêdana nimûneyê di Python de hatî nivîsandin û ji du hêmanan pêk tê ku bi karanîna hevûdu re têkildar in REHETÎ:
server: serverek sade bi yek xala dawiyê BİXWÎNE, /, ku "hello dinya" li ser konsolê çap dike.
loadgen: skrîpta ku trafîkê jê re dişîne server, bi hejmareke vesazkirî ya daxwazên per second.
Serlêdanek ji koda çavkaniyê dimeşîne
Ji bo vekolîna serîlêdana nimûneyê, wê li Cloud Shell an li ser komputera xwe bimeşînin.
1) Di katalogê de istio-nimûne / nimûne-apps / helloserver rev server:
python3 server/server.py
Di destpêkê de server jêrîn tê nîşandan:
INFO:root:Starting server...
2) Pencereyek termînalek din vekin da ku daxwazan bişînin server. Heke hûn Cloud Shell bikar tînin, îkona lêzêdekirinê bikirtînin da ku danişînek din vekin.
3) Daxwazek bişînin server:
curl http://localhost:8080
bersivên serverê:
Hello World!
4) Ji pelrêça ku we koda nimûne dakêşand, biçin pelrêça ku tê de ye loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Ji perspektîfa torê ve, tevahiya serîlêdanê li ser yek mêvandar (komputera herêmî an makîneya virtual Cloud Shell) dimeşe. Ji ber vê yekê hûn dikarin bikar bînin localhostji bo şandina daxwazan server.
10) Rawestandin loadgen и server, têkevin Ctrl-c di her pencereya termînalê de.
11) Di pencereya termînalê de loadgen jîngeha virtual neçalak bike:
deactivate
Pakkirina serîlêdanek di konteyneran de
Ji bo ku serîlêdanê li ser GKE-ê bixebitin, hûn hewce ne ku serîlêdana nimûne pak bikin - server и loadgen - di naverokan. Konteynir rêyek e ku meriv serîlêdanek pak bike da ku wê ji hawîrdora xwe veqetîne.
Ji bo ku serîlêdanek di konteynerê de pak bikin, hûn hewce ne dockerfile. dockerfile pelek nivîsê ye ku fermanan ji bo avakirina koda çavkaniyê ya serîlêdanê û girêdanên wê di nav de destnîşan dike Wêneyê Docker. Piştî ku hatî çêkirin, hûn wêneyê li qeydek konteynerek wekî Docker Hub an jî bar dikin Registry Konteynirê.
Mînak jixwe heye dockerfile bo server и loadgen bi hemî fermanên pêwîst ji bo berhevkirina wêneyan. Li jêr - dockerfile bo 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îma JI python: 3-slim wekî bingeh ji Docker re dibêje ku herî dawî bikar bîne Wêneyê Python 3 wek bingeh.
tîma KOPÎ. . pelên çavkaniyê li pelrêça xebatê ya heyî kopî dike (tenê di doza me de server.py) ji bo pergala pelê ya konteynerê.
ENTRYPOINT fermana ku ji bo destpêkirina konteynerê tê bikar anîn diyar dike. Di rewşa me de, ev ferman hema hema wekî ya ku we bikar anî ye server.py ji koda çavkaniyê.
tîma SEKINANDIN nîşan dide ku server bi rêya benderê li benda daneyan e 8080. Ev tîm ne portan peyda dike. Ev celebek belgeyek e ku ji bo vekirina portê hewce ye 8080 dema ku konteynir dest pê dike.
Amadekirina konteynerkirina serlêdana we
1) Guherbarên jîngehê yên jêrîn saz bikin. Diberdaxistin PROJECT_ID Nasnameya projeya GCP-ya we.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Bikaranîna nirxan PROJECT_ID и GCR_REPO dema ku hûn wê ava dikin hûn wêneya Docker etîket bikin û wê bixin nav Tomarek Konteynerek taybet.
2) Projeya xwerû ya GCP-ê ji bo amûra rêzika fermanê saz bikin gcloud.
gcloud config set project $PROJECT_ID
3) Ji bo amûra rêzika fermanê devera xwerû destnîşan bikin gcloud.
gcloud config set compute/zone us-central1-b
4) Piştrast bikin ku karûbarê Registry Konteyner di projeya GCP de çalak e.
Navnîşa wêneyên di depoyê de binihêrin û piştrast bikin ku wêne hatine barkirin:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Ferman navên wêneyên ku nû hatine barkirin nîşan dide:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Afirandina komek GKE.
Van konteyneran dikarin li ser makîneyek virtual Cloud Shell an li ser komputerek bi fermanê werin xebitandin docker run. Lê di hawîrdorek hilberînê de, hûn hewce ne ku rêyek ku hûn konteynerên navendî birêxistin bikin. Mînakî, ji we re pergalek hewce dike ku piştrast bike ku konteynir her gav dimeşin, û hûn hewceyê rêyek in ku hûn heke seyrûsefer zêde bibin mînakên konteyneran zêde bikin û zêde bikin.
Ji bo ku hûn serîlêdanên konteynerkirî bimeşînin hûn dikarin bikar bînin G.K.E.. GKE platformek orkestrasyona konteyneran e ku makîneyên virtual di nav komekê de kom dike. Ji her makîneya virtual re girêk tê gotin. Komên GKE li ser bingeha pergala rêveberiya koma Kubernetes-a çavkaniya vekirî ye. Kubernetes mekanîzmayên danûstendina bi komê re peyda dike.
tîma gcloud di projeya GCP û devera xwerû ya ku we diyar kiriye de komek istioready diafirîne. Ji bo xebitandina Istio, em pêşniyar dikin ku bi kêmî ve 4 nod û makîneyek virtual hebe n1-standard-2.
Tîm di çend hûrdeman de komê diafirîne. Dema ku kom amade ye, ferman tiştek bi vî rengî derdixe peyam.
2) Di amûra rêzika fermanê de pêbaweriyan peyda bikin kubectlji bo birêvebirina komê wê bikar bînin:
3) Naha hûn dikarin bi Kubernetes re têkilî daynin kubectl. Mînakî, fermana jêrîn dikare rewşa girêkan bibîne:
kubectl get nodes
Ferman navnîşek girêkan çêdike:
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
Têgehên Key Kubernetes
Diagram serîlêdanek li ser GKE nîşan dide:
Berî ku hûn konteyneran li GKE bicîh bikin, têgehên sereke yên Kubernetes fêr bibin. Heke hûn dixwazin bêtir fêr bibin, di dawiya dawiyê de girêdan hene.
Nod û kom. Di GKE de, nod makîneyek virtual e. Li ser platformên din ên Kubernetes, nodek dikare komputerek an makîneyek virtual be. Komek berhevokek girêk e ku dikare wekî yekîneyek yekane were hesibandin ku hûn li wir serîlêdanek konteynirkirî bicîh dikin.
Pods. Di Kubernetes de, konteynir di nav potan de dimeşin. Podek di Kubernetes de yekîneyek nayê dabeş kirin. Pod yek an çend konteyneran digire. Hûn konteynerên serverê bicîh dikin û loadgen di polên cuda de. Dema ku di podek de çend konteynir hebin (mînak, serverek serîlêdanê û server proxy), konteynir wekî saziyek yekane têne rêve kirin û çavkaniyên pod parve dikin.
Deployments. Di Kubernetes de, veqetandin tiştek e ku berhevokek ji podên yeksan e. Dabeşkirin gelek kopiyên podên ku li ser girêkên komê têne belav kirin dest pê dike. Dabeşkirin bixweber li şûna podên ku têk çûne an bersiv nagirin vedigire.
xizmeta Kubernetes. Dema ku koda serîlêdanê li GKE dimeşîne, pêwendiya di navbera loadgen и server. Dema ku we dest bi karûbaran kir li ser makîneyek virtual an sermaseya Cloud Shell, we daxwaz jê re şand server ji hêla navnîşanê ve localhost: 8080. Piştî ku li GKE-ê têne bicîh kirin, pod li ser girêkên berdest têne darve kirin. Ji hêla xwerû ve, kontrola we li ser kîjan girêka pod li ser dimeşe tune, ji ber vê yekê hûn pods navnîşanên IP-ya daîmî tune.
Ji bo bidestxistina navnîşana IP-yê server, hûn hewce ne ku li ser pêçana abstrakasyona torê diyar bikin. Ew çi ye xizmeta Kubernetes. Karûbarê Kubernetes ji bo komek podan xalek dawiya domdar peyda dike. Çend hene cureyên xizmetên. server bikar tîne LoadBalancer, ku ji bo têkiliyê navnîşanek IP-ya derveyî peyda dike server ji derveyî komê.
Kubernetes di heman demê de pergalek DNS-ya çêkirî heye ku navên DNS-ê destnîşan dike (mînak, helloserver.default.cluster.local) xizmetên. Bi saya vê yekê, podên di nav komê de li navnîşanek daîmî bi podên din ên di komê re têkilî daynin. Navê DNS nikare li derveyî komê were bikar anîn, wek mînak li Cloud Shell an li ser komputerê.
Kubernetes diyar dibe
Dema ku we serîlêdanê ji çavkaniyê dimeşîne, we fermana mecbûrî bikar anî python3
server.py
Împerative tê wateya lêkerê: "vê bike."
Kubernetes bikar tîne modela ragihandinê. Ev tê vê wateyê ku em ji Kubernetes re nabêjin tam çi bikin, lê ji ber vê yekê rewşa xwestinê diyar dikin. Mînakî, Kubernetes li gorî hewcedariyê dest pê dike û podan disekine da ku pê ewle bibe ku rewşa rastîn a pergalê bi rewşa xwestî re têkildar e.
Hûn di manîfesto an pelan de rewşa xwestinê destnîşan dikin Yaml. Pelek YAML ji bo yek an çend tiştên Kubernetes taybetmendî hene.
Mînak ji bo pelê YAML heye server и loadgen. Her pelê YAML rewşa xwestinê ya cîhê bicîhkirinê û karûbarê Kubernetes diyar dike.
spec.replicas hejmara xwestî ya pelan destnîşan dike.
Beşê spec.şablon şablonek pod diyar dike. Di taybetmendiya pod de zeviyek heye wêne, ku navê wêneya ku divê ji Registry Konteynerê were derxistin diyar dike.
LoadBalancer: Xerîdar daxwazan dişînin navnîşana IP-ya balansa barkirinê, ku navnîşek IP-ya domdar heye û ji derveyî komê tê gihîştin.
targetPort: wek tê bîra te, tîm EXPOSE 8080 в dockerfile benderan neda. Hûn portê peyda dikin 8080da ku hûn bi konteynerê re têkilî daynin server li derveyî komê. Di doza me de hellosvc.default.cluster.local:80 (kurtnav: hellosvc) bi benderê re têkildar e 8080 Navnîşanên IP yên Pod helloserver.
bender: Ev jimareya portê ye ku karûbarên din ên di komê de dê daxwazan bişînin.
loadgen.yaml
Object Deployment to loadgen.yaml wekî bûn server.yaml. Cûdahî ev e ku objeya bicîhkirinê beşek dihewîne şandin. Ew guherbarên jîngehê yên ku hewce ne diyar dike loadgen û ya ku we dema ku serîlêdanê ji çavkaniyê dimeşîne saz kir.
Carek loadgen daxwazên hatina qebûl nake, ji bo zeviyê awa destnîşan kir ClusterIP. Ev celeb navnîşek IP-ya domdar peyda dike ku karûbarên di komê de dikarin bikar bînin, lê ev navnîşana IP-yê ji xerîdarên derveyî re nayê eşkere kirin.
Diberdaxistin PROJECT_ID Nasnameya projeya GCP-ya we.
9) Save û girtin loadgen.yaml, edîtorê nivîsê bigire.
10) Pelê YAML li Kubernetes bicîh bikin:
kubectl apply -f loadgen.yaml
Piştî bidawîbûna serketî, ferman koda jêrîn çêdike:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Rewşa pelan kontrol bikin:
kubectl get pods
Ferman statûyê nîşan dide:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Têketinên serîlêdanê ji podê derxînin loadgen. Diberdaxistin POD_ID bi nasnameya ji bersiva berê.
kubectl logs loadgenerator-POD_ID
13) Navnîşanên IP-ya derveyî bistînin hellosvc:
kubectl get service
Bersiva fermanê bi vî rengî xuya dike:
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) Daxwazek bişînin hellosvc: şûna EXTERNAL_IP ji bo navnîşana IP ya derve hellosvc.
curl http://EXTERNAL_IP
Werin em li Îstio bigirin
Jixwe serîlêdanek we heye ku ji GKE re hatî şandin. loadgen dikare Kubernetes DNS bikar bîne (hellosvc:80) ji bo şandina daxwazan serverû hûn dikarin daxwazan bişînin server bi navnîşana IP ya derveyî. Her çend Kubernetes gelek taybetmendiyên xwe hene, di derheqê karûbaran de hin agahdarî winda ne:
Karûbar çawa têkilî dikin? Têkiliyên di navbera karûbaran de çi ne? Trafîka di navbera karûbaran de çawa diherike? Haya we jê heye loadgen daxwazan dişîne server, lê bifikirin ku hûn di derbarê serîlêdanê de tiştek nizanin. Ji bo bersiva van pirsan, werin em li navnîşa podên xebitandinê yên di GKE de binêrin.
Metrics. Çiqas server bersivê dide daxwazek hatî? Di çirkeyê de çend daxwaz ji hêla serverê ve têne wergirtin? Ma ew peyamên xeletiyê dide?
Agahiyên Ewlekariyê. Trafîka di navbera loadgen и server tenê derbas dibe HTTP an ji hêla mTLS?
Istio bersiva van pirsan dide. Ji bo kirina vê yekê, Istio proxyek sidecar bicîh dike Nûnerê di her qulikê de. Proxy Envoy hemî seyrûsefera ketin û derketinê ya berbi konteynerên serîlêdanê digire. Wateya wê ye server и loadgen bi rêya sidecar proxy Envoy bistînin, û hemî trafîkê ji loadgen к server bi navbeynkariya Envoy derbas dibe.
Têkiliyên di navbera proxeyên Envoy de tevnek karûbarê ava dikin. Mîmariya tevna karûbarê qatek kontrolê li ser Kubernetes peyda dike.
Ji ber ku proxeyên Envoy di konteynerên xwe de dimeşin, Istio dikare li ser komek GKE were saz kirin ku hema hema ti guheztina koda serîlêdanê tune. Lê we hin kar kiriye da ku serlêdana xwe amade bikin ku ji hêla Istio ve were rêvebirin:
Xizmetên ji bo hemî konteyneran. Ji bo belavkirinan server и loadgen bi karûbarê Kubernetes ve girêdayî ye. Hetta loadgen, ku daxwazên hatinê nagire, karûbarek heye.
Portên di karûbaran de divê navên wan hebin. Her çend portên karûbarê di GKE de bênav bêne hiştin, Istio ji we hewce dike ku hûn diyar bikin navê portê li gor protokola xwe. Di pelê YAML de porta ji bo server tê gotin httpji ber ku server protokolê bikar tîne HTTP... Ger xizmetkar bikaranîn gRPC, hûn ê navê portê bikin grpc.
Dabeşkirin têne nîşankirin. Ji ber vê yekê, hûn dikarin taybetmendiyên rêveberiya trafîkê ya Istio bikar bînin, wekî dabeşkirina seyrûseferê di navbera guhertoyên heman karûbarê de.
Sazkirina Istio
Du awayên sazkirina Istio hene. Kanîn Istio li ser dirêjkirina GKE çalak bike an guhertoya çavkaniya vekirî ya Istio saz bikin li ser komê. Bi Istio re li ser GKE, hûn dikarin bi hêsanî sazkirin û nûvekirinên Istio li seranserê çerxa jiyana koma GKE-yê bi rê ve bibin. Ger hûn guhertoya herî dawî ya Istio an bêtir kontrolê li ser veavakirina panela kontrola Istio-ya xwe dixwazin, li şûna Istio li ser dirêjkirina GKE guhertoya çavkaniya vekirî saz bikin. Ji bo ku li ser nêzîkbûnê biryar bidin, gotarê bixwînin Ma ez Istio li ser GKE hewce dikim?.
Vebijêrkek hilbijêrin, rêberê guncan binirxînin, û rêwerzan bişopînin da ku Istio li ser koma xwe saz bikin. Heke hûn dixwazin Istio bi serîlêdana xweya nû ve hatî saz kirin bikar bînin, pêkanîna sidecar çalak bike ji bo navan destçûnî.
Paqijkirin
Ji bo ku hûn ji bo çavkaniyên ku we di vê dersê de bikar anîne li hesabê xweya Google Cloud Platformê neyên barkirin, piştî ku we Istio saz kir û bi serîlêdana nimûneyê re lîstin komika konteynerê jêbirin. Ev ê hemî çavkaniyên komê, wekî nimûneyên hesabkirinê, dîskan, û çavkaniyên torê rake.