Istio paylanmış proqramları birləşdirmək, qorumaq və izləmək üçün əlverişli vasitədir. Istio proqram təminatını miqyasda işə salmaq və idarə etmək üçün müxtəlif texnologiyalardan istifadə edir, o cümlədən tətbiq kodunu paketləşdirmək üçün konteynerlər və yerləşdirmə üçün asılılıqlar və bu konteynerləri idarə etmək üçün Kubernetes. Buna görə də, Istio ilə işləmək üçün bu texnologiyalara əsaslanan çoxsaylı xidmətləri olan tətbiqin necə işlədiyini bilməlisiniz olmadan Istio. Əgər bu alətlər və anlayışlar sizə artıq tanışdırsa, bu təlimatı atlayın və birbaşa bölməyə keçin. Google Kubernetes Mühərrikində (GKE) Istio quraşdırılması və ya uzantı quraşdırmaq GKE-də Istio.
Bu, nümunə vasitəsilə sizə bu texnologiyalar haqqında əsas anlayış vermək üçün mənbə kodundan GKE konteynerinə qədər bütün prosesi keçəcəyimiz addım-addım təlimatdır. Siz həmçinin Istio-nun bu texnologiyaların gücündən necə istifadə etdiyini görəcəksiniz. Bu, konteynerlər, Kubernetes, xidmət şəbəkələri və ya Istio haqqında heç nə bilmədiyinizi güman edir.
vəzifələri
Bu dərslikdə siz aşağıdakı tapşırıqları yerinə yetirəcəksiniz:
Çoxsaylı xidmətlərlə sadə bir salam dünya tətbiqini öyrənmək.
Proqramı mənbə kodundan işə salın.
Tətbiqin qablarda qablaşdırılması.
Kubernetes klasterinin yaradılması.
Konteynerlərin klasterə yerləşdirilməsi.
Başlamadan əvvəl
Kubernetes Engine API-ni aktivləşdirmək üçün təlimatlara əməl edin:
Bu dərslikdə virtual maşını hazırlayan Cloud Shell-dən istifadə edə bilərsiniz Google Compute Engine-də g1-kiçik Debian əsaslı Linux və ya Linux və ya macOS kompüteri ilə.
Seçim A: Cloud Shell-dən istifadə
Cloud Shell-dən istifadənin üstünlükləri:
Python 2 və Python 3 inkişaf mühitləri (o cümlədən virtualenv) tam konfiqurasiya edilmişdir.
Komanda xətti alətləri gcloud, docker, git и kubectlistifadə edəcəyimiz , artıq quraşdırılmışdır.
Nümunə proqram Python-da yazılmışdır və istifadə edərək qarşılıqlı əlaqədə olan iki komponentdən ibarətdir REST:
server: bir son nöqtə ilə sadə server GET, /, konsola "salam dünya" yazan.
yükləyici: trafik göndərən skript server, saniyədə konfiqurasiya edilə bilən sorğu sayı ilə.
Mənbə kodundan proqramın işə salınması
Nümunə proqramı araşdırmaq üçün onu Cloud Shell-də və ya kompüterinizdə işə salın.
1) Kataloqda istio-samples/sample-apps/helloserver qaçmaq server:
python3 server/server.py
Başlanğıcda server aşağıdakılar göstərilir:
INFO:root:Starting server...
2) Sorğu göndərmək üçün başqa terminal pəncərəsini açın server. Cloud Shell istifadə edirsinizsə, başqa bir sessiya açmaq üçün əlavə et işarəsinə klikləyin.
3) Sorğu göndərin server:
curl http://localhost:8080
server cavab verir:
Hello World!
4) Nümunə kodunu endirdiyiniz qovluqdan olan qovluğa keçin yükləyici:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Şəbəkə nöqteyi-nəzərindən bütün proqram bir hostda (yerli kompüter və ya Cloud Shell virtual maşını) işləyir. Buna görə də istifadə edə bilərsiniz localhostsorğular göndərmək server.
10) Dayanmaq yükləyici и server, daxil edin Ctrl-c hər terminal pəncərəsində.
11) Terminal pəncərəsində yükləyici virtual mühiti deaktiv edin:
deactivate
Tətbiqin konteynerlərdə qablaşdırılması
Tətbiqi GKE-də işə salmaq üçün nümunə tətbiqi paketləməlisiniz - server и yükləyici - in konteynerlər. Konteyner tətbiqi mühitindən təcrid etmək üçün onu qablaşdırmağın bir yoludur.
Tətbiqi konteynerə bağlamaq üçün sizə lazımdır Docker faylı. Docker faylı proqramın mənbə kodunu və ondan asılılıqları qurmaq üçün əmrləri müəyyən edən mətn faylıdır Docker şəkli. Quraşdırıldıqdan sonra şəkli Docker Hub və ya kimi konteyner reyestrinə yükləyirsiniz Konteyner reyestri.
Nümunə artıq var Docker faylı uğrunda server и yükləyici şəkilləri toplamaq üçün bütün lazımi əmrlərlə. Aşağıda - Docker faylı uğrunda 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" ]
Komanda FROM python: 3-əsas kimi incə Dockerə ən son istifadə etməyi deyir Python 3 şəkil əsas kimi.
Komanda KOPYALA. . mənbə fayllarını cari iş qovluğuna köçürür (yalnız bizim vəziyyətimizdə server.py) konteynerin fayl sisteminə.
GİRİŞ NÖQTƏSİ konteyneri işə salmaq üçün istifadə olunan əmri müəyyən edir. Bizim vəziyyətimizdə bu əmr demək olar ki, əvvəllər işlətdiyiniz əmrlə eynidir server.py mənbə kodundan.
Komanda TƏSİR olduğunu göstərir server port vasitəsilə məlumat gözləyir 8080. Bu komanda deyil portları təmin edir. Bu, portu açmaq üçün lazım olan bir növ sənəddir 8080 konteyneri işə saldıqda.
Tətbiqinizi konteynerləşdirməyə hazırlanır
1) Aşağıdakı mühit dəyişənlərini təyin edin. Əvəz edin PROJECT_ID GCP layihə identifikatorunuza.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Dəyərlərdən istifadə PROJECT_ID и GCR_REPO Docker şəklini yaratdığınız zaman onu işarələyin və şəxsi Konteyner Reyestrinə köçürürsünüz.
2) Komanda xətti aləti üçün standart GCP layihəsini təyin edin gcloud.
gcloud config set project $PROJECT_ID
3) Komanda xətti aləti üçün standart zonanı təyin edin gcloud.
gcloud config set compute/zone us-central1-b
4) Konteyner Reyestr xidmətinin GCP layihəsində aktiv olduğundan əmin olun.
Anbardakı şəkillərin siyahısını nəzərdən keçirin və şəkillərin yükləndiyini yoxlayın:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Komanda yeni yüklənmiş şəkillərin adlarını göstərir:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
GKE klasterinin yaradılması.
Bu konteynerlər Cloud Shell virtual maşınında və ya komanda ilə kompüterdə işlədilə bilər docker run. Ancaq istehsal mühitində konteynerləri mərkəzdən idarə etmək üçün bir yola ehtiyacınız var. Məsələn, konteynerlərin daim işlədiyinə əmin olan bir sistemə ehtiyacınız var və trafik artarsa, əlavə konteyner nümunələrini böyütmək və fırlatmaq üçün bir yola ehtiyacınız var.
Konteynerləşdirilmiş proqramları işə salmaq üçün istifadə edə bilərsiniz G.K.E.. GKE virtual maşınları klasterə birləşdirən konteyner orkestr platformasıdır. Hər bir virtual maşın bir node adlanır. GKE klasterləri açıq mənbəli Kubernetes klaster idarəetmə sisteminə əsaslanır. Kubernetes klaster ilə qarşılıqlı əlaqə mexanizmlərini təmin edir.
Komanda gcloud GCP layihəsində və qeyd etdiyiniz standart zonada istioready klaster yaradır. Istio-nu işə salmaq üçün ən azı 4 qovşaq və virtual maşına sahib olmağı məsləhət görürük n1-standart-2.
Komanda bir neçə dəqiqə ərzində klaster yaradır. Klaster hazır olduqda, əmr buna bənzər bir şey çıxarır сообщение.
2) Komanda xətti alətində etimadnamələri təmin edin kubectlklasteri idarə etmək üçün istifadə etmək üçün:
3) İndi Kubernetes ilə əlaqə saxlaya bilərsiniz kubectl. Məsələn, aşağıdakı əmr qovşaqların vəziyyətini öyrənə bilər:
kubectl get nodes
Komanda qovşaqların siyahısını yaradır:
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 əsas anlayışları
Diaqram GKE-də tətbiqi göstərir:
GKE-də konteynerləri yerləşdirməzdən əvvəl Kubernetes-in əsas anlayışlarını öyrənin. Daha çox öyrənmək istəyirsinizsə, ən sonunda bağlantılar var.
Düyünlər və çoxluqlar. GKE-də qovşaq virtual maşındır. Digər Kubernetes platformalarında qovşaq kompüter və ya virtual maşın ola bilər. Klaster, konteynerləşdirilmiş tətbiqi yerləşdirdiyiniz vahid vahid hesab edilə bilən qovşaqların toplusudur.
Podlar. Kubernetesdə qablar qablarda işləyir. Kubernetesdəki Pod bölünməz bir vahiddir. Pod bir və ya daha çox konteyner saxlayır. Siz server konteynerlərini yerləşdirirsiniz və yükləyici ayrı qablarda. Podda bir neçə konteyner olduqda (məsələn, proqram serveri və proxy server), konteynerlər tək bir qurum kimi idarə olunur və pod resurslarını paylaşır.
Yerləşdirmələr. Kubernetes-də yerləşdirmə eyni podların toplusundan ibarət obyektdir. Yerləşdirmə klaster qovşaqları arasında paylanmış podların çoxsaylı replikalarını işə salır. Yerləşdirmə uğursuz və ya cavab verməyən podları avtomatik əvəz edir.
Kubernetes xidməti. Tətbiq kodu GKE-də işləyərkən, arasında əlaqə yükləyici и server. Cloud Shell virtual maşınında və ya iş masasında xidmətlərə başladığınız zaman sorğu göndərdiniz server at localhost: 8080. GKE-də yerləşdirildikdən sonra podlar mövcud qovşaqlarda icra olunur. Varsayılan olaraq, podun hansı node üzərində işlədiyinə nəzarətiniz yoxdur, buna görə də siz qabıqlar daimi IP ünvanları yoxdur.
üçün IP ünvanı əldə etmək üçün server, podların üstündə şəbəkə abstraksiyasını təyin etməlisiniz. Bu budur Kubernetes xidməti. Kubernetes xidməti bir sıra podlar üçün davamlı son nöqtə təmin edir. Bir neçə var xidmət növləri. server istifadə edir LoadBalancer, əlaqə üçün xarici IP ünvanı təmin edir server klasterdən kənardan.
Kubernetes həmçinin DNS adlarını təyin edən daxili DNS sisteminə malikdir (məsələn, salamserver.default.cluster.local) xidmətlər. Bunun sayəsində klaster daxilindəki podlar klasterdəki digər podlarla daimi ünvanda əlaqə saxlayır. DNS adı Cloud Shell-də və ya kompüterdə olduğu kimi klasterdən kənarda istifadə edilə bilməz.
Kubernetes təzahür edir
Tətbiqi mənbədən işlətdiyiniz zaman imperativ əmrdən istifadə etdiniz python3
server.py
İmperativ bir feli nəzərdə tutur: “bunu et”.
Kubernetes istifadə edir deklarativ model. Bu o deməkdir ki, biz Kubernetesə dəqiq nə edəcəyimizi demirik, əksinə arzu olunan vəziyyəti təsvir edirik. Məsələn, Kubernetes sistemin faktiki vəziyyətinin istənilən vəziyyətə uyğun olmasını təmin etmək üçün lazım olduqda podları işə salır və dayandırır.
Siz manifestlərdə və ya fayllarda istədiyiniz vəziyyəti göstərirsiniz YAML. YAML faylı bir və ya daha çox Kubernetes obyekti üçün spesifikasiyaları ehtiva edir.
Nümunədə YAML faylı var server и yükləyici. Hər bir YAML faylı yerləşdirmə obyektinin və Kubernetes xidmətinin istənilən vəziyyətini müəyyən edir.
Birinci sahə spec arzu olunan vəziyyətin təsvirini ehtiva edir.
spec.replikalar istədiyiniz pods sayını göstərir.
Bölmə spec.şablon pod şablonunu müəyyən edir. Pod spesifikasiyasında sahə var təsvir, Konteyner Reyestrindən çıxarılması lazım olan şəklin adını müəyyən edir.
LoadBalancer: Müştərilər davamlı IP ünvanına malik olan və klasterdən kənardan əldə edilə bilən yük balanslaşdırıcısının IP ünvanına sorğular göndərirlər.
targetPort: xatırladığınız kimi, komanda 8080 в Docker faylı limanları təmin etməmişdir. Siz limanı təmin edirsiniz 8080konteynerlə əlaqə saxlamağınız üçün server klasterdən kənarda. Bizim vəziyyətimizdə hellovc.default.cluster.local:80 (qısa ad: hellovc) porta uyğundur 8080 Pod IP ünvanları salam server.
port: Bu, klasterdəki digər xidmətlərin sorğu göndərəcəyi port nömrəsidir.
loadgen.yaml
Yerləşdirmə obyekti loadgen.yaml oxşamaq server.yaml. Fərq ondadır ki, yerləşdirmə obyektində bölmə var env. Lazım olan mühit dəyişənlərini müəyyən edir yükləyici və tətbiqi mənbədən işlədərkən quraşdırdığınız.
Vaxt yükləyici sahə üçün daxil olan sorğuları qəbul etmir növü göstərdi ClusterIP. Bu tip klasterdəki xidmətlərin istifadə edə biləcəyi davamlı IP ünvanını təmin edir, lakin bu IP ünvanı xarici müştərilərə məruz qalmır.
Uğurlu başa çatdıqdan sonra əmr aşağıdakı kodu istehsal edir:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Podların vəziyyətini yoxlayın:
kubectl get pods
Komanda statusu göstərir:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Tətbiq qeydlərini poddan çıxarın yükləyici. Əvəz edin POD_ID əvvəlki cavabdan identifikatora.
kubectl logs loadgenerator-POD_ID
13) Xarici IP ünvanlarını əldə edin hellovc:
kubectl get service
Komanda cavabı belə görünür:
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) Sorğu göndərin hellovc: dəyişdirin EXTERNAL_IP xarici IP ünvanına hellovc.
curl http://EXTERNAL_IP
Gəlin Istio-nu götürək
Artıq GKE-də yerləşdirilmiş tətbiqiniz var. yükləyici Kubernetes DNS istifadə edə bilər (salam: 80) sorğu göndərmək servervə sorğu göndərə bilərsiniz server xarici IP ünvanı ilə. Kubernetes bir çox xüsusiyyətlərə malik olsa da, xidmətlər haqqında bəzi məlumatlar çatışmır:
Xidmətlər necə qarşılıqlı əlaqə qurur? Xidmətlər arasında hansı əlaqələr var? Xidmətlər arasında trafik axını necə olur? Bundan xəbəriniz varmı yükləyici ünvanına sorğular göndərir server, lakin tətbiq haqqında heç nə bilmədiyinizi təsəvvür edin. Bu suallara cavab vermək üçün gəlin GKE-də işləyən podların siyahısına baxaq.
Metriklər. Nə qədər server daxil olan sorğuya cavab verir? Server tərəfindən saniyədə neçə sorğu qəbul edilir? Səhv mesajları verirmi?
Təhlükəsizlik Məlumatı. arasında trafik yükləyici и server sadəcə keçir HTTP ya da mTLS?
İstio bütün bu suallara cavab verir. Bunu etmək üçün, Istio bir yan araba proxy yerləşdirir elçi hər podda. Elçi proksi proqram konteynerlərinə daxil olan və gedən bütün trafiki kəsir. Bu o deməkdir ki server и yükləyici yan vaqon proxy Elçisi və bütün trafik vasitəsilə qəbul edin yükləyici к server Elçi vəkilindən keçir.
Envoy proksiləri arasındakı əlaqələr xidmət şəbəkəsini təşkil edir. Xidmət mesh arxitekturası Kubernetes üzərində nəzarət qatını təmin edir.
Envoy proksiləri öz konteynerlərində işlədiyi üçün Istio tətbiq kodunda demək olar ki, heç bir dəyişiklik olmadan GKE klasterinin üstünə quraşdırıla bilər. Ancaq tətbiqinizi Istio tərəfindən idarə olunmağa hazırlamaq üçün bəzi işlər görmüsünüz:
Bütün konteynerlər üçün xidmətlər. Yerləşdirmələrə server и yükləyici Kubernetes xidmətinə bağlıdır. Hətta yükləyici, gələn sorğuları qəbul etməyən bir xidmət var.
Xidmətlərdəki portların adları olmalıdır. Baxmayaraq ki, xidmət portları GKE-də adsız qala bilər, Istio sizdən qeyd etməyi tələb edir port adı onun protokoluna uyğun olaraq. YAML faylında üçün port server deyilən httpçünki server protokoldan istifadə edir HTTP. Əgər xidmət istifadə olunur gRPC, limanın adını verərdiniz grpc.
Yerləşdirmələr qeyd olunur. Buna görə də, eyni xidmətin versiyaları arasında trafikin bölünməsi kimi Istio-nun trafikin idarə edilməsi xüsusiyyətlərindən istifadə edə bilərsiniz.
Quraşdırma
Istio quraşdırmağın iki yolu var. Bacarmaq GKE uzadılmasında Istio-nu aktivləşdirin və ya Istio-nun açıq mənbə versiyasını quraşdırın klaster üzərində. GKE-də Istio ilə siz GKE klasterinin həyat dövrü ərzində Istio quraşdırmalarını və təkmilləşdirmələrini asanlıqla idarə edə bilərsiniz. Istio-nun ən son versiyasını və ya Istio idarəetmə panelinizin konfiqurasiyasına daha çox nəzarət etmək istəyirsinizsə, Istio on GKE genişləndirilməsi əvəzinə açıq mənbə versiyasını quraşdırın. Yanaşma barədə qərar vermək üçün məqaləni oxuyun Mənə GKE-də Istio lazımdır?.
Seçimlərdən birini seçin, müvafiq təlimatı nəzərdən keçirin və Istio-nu klasterinizdə quraşdırmaq üçün təlimatlara əməl edin. Istio-dan yeni yerləşdirilmiş tətbiqinizlə istifadə etmək istəyirsinizsə, yan avtomobilin həyata keçirilməsini təmin edin ad sahəsi üçün default.
Təmizləmə
Bu dərslikdə istifadə etdiyiniz resurslara görə Google Bulud Platforması hesabınızdan ödəniş almamaq üçün Istio-nu quraşdırdıqdan və nümunə tətbiqi ilə oynadıqdan sonra konteyner klasterini silin. Bu, hesablama nümunələri, disklər və şəbəkə resursları kimi bütün klaster resurslarını siləcək.