Istio mangrupikeun alat anu gampang pikeun nyambungkeun, ngamankeun sareng ngawaskeun aplikasi anu disebarkeun. Istio ngagunakeun rupa-rupa téknologi pikeun ngajalankeun sareng ngatur parangkat lunak dina skala, kalebet wadah pikeun ngarangkep kode aplikasi sareng katergantungan pikeun panyebaran, sareng Kubernetes pikeun ngatur wadah éta. Janten, pikeun damel sareng Istio anjeun kedah terang kumaha aplikasi sareng sababaraha jasa dumasar kana téknologi ieu tanpa Istio. Upami alat sareng konsép ieu parantos wawuh ka anjeun, punten luncat kana tutorial ieu sareng langsung ka bagian éta Masang Istio dina Google Kubernetes Engine (GKE) atanapi masang ekstensi Istio on GKE.
Ieu mangrupikeun pituduh léngkah-léngkah dimana urang bakal ngalangkungan sadayana prosés tina kode sumber ka wadahna GKE supados anjeun ngartos dasar téknologi ieu sareng conto. Anjeun ogé bakal ningali kumaha Istio ngamangpaatkeun kakuatan téknologi ieu. Ieu nganggap anjeun henteu terang naon-naon ngeunaan wadah, Kubernetes, jaring jasa, atanapi Istio.
pancén
Dina tutorial ieu, anjeun bakal ngalengkepan tugas di handap ieu:
Diajar aplikasi halo dunya anu sederhana sareng sababaraha jasa.
Jalankeun aplikasi tina kode sumber.
Bungkusan aplikasi dina peti.
Nyieun klaster Kubernetes.
Deploying peti kana klaster.
Sateuacan anjeun ngamimitian
Turutan parentah pikeun ngaktipkeun Kubernetes Engine API:
Dina tutorial ieu, anjeun tiasa nganggo Cloud Shell, anu nyiapkeun mesin virtual g1-leutik dina Google Compute Engine sareng Linux basis Debian, atanapi komputer Linux atanapi macOS.
Pilihan A: Ngagunakeun Cloud Shell
Kauntungan ngagunakeun Cloud Shell:
Lingkungan pangembangan Python 2 sareng Python 3 (kalebet virtualenv) geus pinuh ngonpigurasi.
Paréntah Line Pakakas gcloud, docker, séwang и kubectl, anu bakal kami anggo parantos dipasang.
Ngajalajah hiji aplikasi kalawan sababaraha layanan
Aplikasi sampel ditulis dina Python sarta diwangun ku dua komponén anu berinteraksi ngagunakeun ngaso:
server: server basajan kalawan hiji titik tungtung KANGGO,/, nu prints "halo dunya" pikeun konsol nu.
loadgen: Aksara nu ngirim lalulintas keur server, kalawan jumlah configurable of requests per detik.
Ngajalankeun aplikasi tina kode sumber
Pikeun ngajalajah aplikasi sampel, jalankeun dina Cloud Shell atawa dina komputer Anjeun.
1) Dina katalog istio-sampel / sampel-aplikasi / helloserver lumpat server:
python3 server/server.py
Dina ngamimitian server di handap ieu dipintonkeun:
INFO:root:Starting server...
2) Buka jandela terminal sejen pikeun ngirim requests ka server. Upami anjeun nganggo Cloud Shell, klik ikon tambihan pikeun muka sési anu sanés.
3) Kirim pamundut ka server:
curl http://localhost:8080
jawaban server:
Hello World!
4) Tina diréktori dimana anjeun unduh kode sampel, angkat ka diréktori anu ngandung loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Tina sudut pandang jaringan, sadaya aplikasi dijalankeun dina hiji host (komputer lokal atanapi mesin virtual Cloud Shell). Ku kituna anjeun bisa make localhostpikeun ngirim requests ka server.
10) Pikeun eureun loadgen и server, asupkeun Ctrl-c dina unggal jandela terminal.
11) Dina jandela terminal loadgen nganonaktipkeun lingkungan virtual:
deactivate
Bungkusan aplikasi dina peti
Pikeun ngajalankeun aplikasi dina GKE, anjeun kedah ngarangkep conto aplikasi − server и loadgen - at peti. Wadah mangrupikeun cara pikeun ngarangkep aplikasi pikeun ngasingkeunana tina lingkunganana.
Pikeun ngarangkep aplikasi kana wadahna, anjeun peryogi dockerfile. dockerfile nyaéta file téks anu netepkeun paréntah pikeun ngawangun kode sumber aplikasi sareng dependensi na Gambar Docker. Saatos diwangun, anjeun unggah gambar kana pendaptaran wadah sapertos Docker Hub atanapi pendaptaran wadahna.
Contona geus boga dockerfile keur server и loadgen kalayan sagala paréntah diperlukeun pikeun ngumpulkeun gambar. Di handap - dockerfile keur 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" ]
regu FROM python: 3-langsing salaku dasar ngabejaan Docker ngagunakeun panganyarna gambar Python 3 salaku dasar.
regu NYALIN. . nyalin file sumber kana diréktori kerja ayeuna (dina kasus urang wungkul server.py) kana sistem file wadahna.
ENTRYPOINT ngahartikeun paréntah anu dipaké pikeun ngamimitian wadahna. Dina kasus urang, paréntah ieu ampir sami sareng anu anjeun biasa jalankeun server.py tina kode sumber.
regu NGABUNGKEUN nunjukkeun yén server ngantosan data ngaliwatan port 8080. Tim ieu henteu nyadiakeun palabuhan. Ieu sababaraha jenis dokuméntasi anu diperlukeun pikeun muka port nu 8080 nalika ngamimitian wadahna.
Nyiapkeun pikeun wadahna aplikasi anjeun
1) Atur variabel lingkungan di handap ieu. Ngaganti PROJECT_ID ka ID proyék GCP Anjeun.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Ngagunakeun nilai PROJECT_ID и GCR_REPO Anjeun méré tag gambar Docker nalika anjeun ngawangun sareng nyorong kana pendaptaran Wadahna pribadi.
2) Setel proyék GCP standar pikeun alat baris paréntah gcloud.
gcloud config set project $PROJECT_ID
3) Setel zona standar pikeun alat garis paréntah gcloud.
gcloud config set compute/zone us-central1-b
4) Pastikeun yén layanan Container Registry diaktipkeun dina proyék GCP.
Pariksa daptar gambar dina gudang sareng pariksa yén gambar éta parantos diunggah:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Paréntah nampilkeun nami gambar anu nembé diunggah:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Nyieun klaster GKE.
Wadah ieu tiasa dijalankeun dina mesin virtual Cloud Shell atanapi dina komputer nganggo paréntah docker ngaji. Tapi dina lingkungan produksi, anjeun peryogi cara pikeun ngatur wadahna. Salaku conto, anjeun peryogi sistem anu mastikeun yén wadahna sok dijalankeun, sareng anjeun peryogi cara pikeun skala sareng spin up instansi wadahna tambahan upami lalu lintas ningkat.
Pikeun ngajalankeun aplikasi containerized Anjeun tiasa make G.K.E.. GKE mangrupikeun platform orkestrasi wadah anu ngahijikeun mesin virtual kana klaster. Unggal mesin virtual disebut node. Klaster GKE dumasar kana sistem manajemen klaster Kubernetes open source. Kubernetes nyadiakeun mékanisme pikeun interaksi jeung klaster.
regu gcloud nyiptakeun kluster istioready dina proyék GCP sareng zona standar anu anjeun atur. Pikeun ngajalankeun Istio, kami nyarankeun gaduh sahenteuna 4 titik sareng mesin virtual n1-baku-2.
Tim nyiptakeun klaster dina sababaraha menit. Nalika kluster parantos siap, paréntah kaluaran sapertos kieu pesen.
2) Nyadiakeun Kapercayaan dina alat garis paréntah kubectlngagunakeun éta pikeun ngatur klaster:
3) Ayeuna anjeun tiasa komunikasi sareng Kubernetes via kubectl. Contona, paréntah di handap ieu bisa manggihan status titik:
kubectl get nodes
Paréntah ngahasilkeun daptar titik:
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
Konsep konci Kubernetes
Diagram nunjukkeun aplikasi dina GKE:
Sateuacan anjeun nyebarkeun wadah dina GKE, diajar konsép konci Kubernetes. Aya tautan di tungtung upami anjeun hoyong diajar langkung seueur.
Titik sareng klaster. Dina GKE, titik mangrupikeun mesin virtual. Dina platform Kubernetes anu sanés, node tiasa janten komputer atanapi mesin virtual. Kluster mangrupikeun kumpulan titik anu tiasa dianggap unit tunggal dimana anjeun nyebarkeun aplikasi wadahna.
Polong. Dina Kubernetes, wadahna dijalankeun dina pods. Pod di Kubernetes mangrupikeun unit anu teu tiasa dipisahkeun. A Pod nahan hiji atawa leuwih wadahna. Anjeun nyebarkeun wadah server na loadgen dina pods misah. Nalika aya sababaraha wadah dina pod (contona, server aplikasi sareng server proxy), wadahna dikokolakeun salaku éntitas tunggal sareng ngabagi sumberdaya pod.
Deployments. Dina Kubernetes, panyebaran mangrupikeun obyék anu mangrupikeun kumpulan pods idéntik. Deployment ngaluncurkeun sababaraha réplika pods anu disebarkeun dina titik kluster. Deployment otomatis ngagentos pods anu gagal atanapi henteu responsif.
jasa Kubernetes. Nalika ngajalankeun kode aplikasi dina GKE, sambungan antara loadgen и server. Nalika anjeun ngamimitian jasa dina mesin virtual atanapi desktop Cloud Shell, anjeun ngirim pamundut ka server ku alamat localhost: 8080. Sakali disebarkeun ka GKE, pods dieksekusi dina titik anu sayogi. Sacara standar, anjeun teu boga kontrol leuwih titik nu pod ngajalankeun on, jadi Anjeun polong euweuh alamat IP permanén.
Pikeun ménta alamat IP pikeun server, Anjeun kudu nangtukeun hiji abstraksi jaringan dina luhureun pods. Éta naon éta jasa Kubernetes. Ladenan Kubernetes nyadiakeun endpoint persisten pikeun sakumpulan pods. Aya sababaraha jenis jasa. server ngagunakeun LoadBalancer, nu nyadiakeun alamat IP éksternal pikeun kontak server ti luar klaster.
Kubernetes ogé gaduh sistem DNS anu diwangun anu masihan nami DNS (contona, helloserver.default.cluster.local) jasa. Hatur nuhun kana ieu, pods dina kluster komunikasi sareng pods séjén dina kluster dina alamat konstan. Ngaran DNS teu tiasa dianggo di luar klaster, sapertos dina Cloud Shell atanapi dina komputer.
Kubernetes manifests
Nalika anjeun ngajalankeun aplikasi tina sumber, anjeun nganggo paréntah imperatif python3
server.py
Imperative ngandung harti kecap pagawéan: "ngalakukeun ieu."
Kubernetes ngagunakeun modél déklaratif. Ieu ngandung harti yén urang teu ngabejaan Kubernetes persis naon anu kudu dipigawé, tapi rada ngajelaskeun kaayaan nu dipikahoyong. Contona, Kubernetes ngamimitian jeung ngeureunkeun pods sakumaha diperlukeun pikeun ngajaga kaayaan sabenerna sistem konsisten jeung kaayaan nu dipikahoyong.
Anjeun nunjukkeun kaayaan anu dipikahoyong dina manifests atanapi file YAML. Berkas YAML ngandung spésifikasi pikeun hiji atanapi sababaraha objék Kubernetes.
Conto ngandung file YAML pikeun server и loadgen. Unggal file YAML netepkeun kaayaan anu dipikahoyong pikeun objék panyebaran sareng jasa Kubernetes.
Widang munggaran Spesifikasina ngandung pedaran ngeunaan kaayaan dipikahoyong.
spec.replicas nunjukkeun jumlah nu dipikahoyong tina pods.
Bagian spec.template ngahartikeun template pod. Aya widang dina spésifikasi pod gambaran, anu nangtukeun nami gambar anu kedah diékstrak tina Pendaptaran Wadahna.
LoadBalancer: Klién ngirim requests ka alamat IP tina beban balancer, nu boga alamat IP pengkuh tur diaksés ti luar klaster.
targetPort: sakumaha anjeun apal, tim EXPOSE 8080 в dockerfile teu nyadiakeun palabuhan. Anjeun nyadiakeun port 8080ku kituna anjeun bisa ngahubungan wadahna server luar klaster. Dina hal urang hellosvc.default.cluster.local:80 (ngaran pondok: hellosvc) pakait jeung port 8080 Alamat IP Pod helloserver.
palabuhan: Ieu nomer port mana jasa lianna di kluster bakal ngirim requests.
loadgen.yaml
Obyék deployment pikeun loadgen.yaml mirip server.yaml. Bédana nyaéta yén obyék deployment ngandung bagian utusan. Éta netepkeun variabel lingkungan anu diperyogikeun loadgen sareng anu anjeun pasang nalika ngajalankeun aplikasi tina sumber.
sakali loadgen teu nampa requests asup, pikeun sawah ngetik tandana KlusterIP. Jenis ieu nyadiakeun alamat IP pengkuh yén layanan dina klaster bisa ngagunakeun, tapi alamat IP ieu teu kakeunaan klien éksternal.
Ngaganti PROJECT_ID ka ID proyék GCP Anjeun.
9) Simpen jeung nutup loadgen.yaml, tutup pangropéa téksu.
10) Nyebarkeun file YAML ka Kubernetes:
kubectl apply -f loadgen.yaml
Saatos parantosan suksés, paréntah ngahasilkeun kode ieu:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Pariksa status pods:
kubectl get pods
Paréntah nunjukkeun status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Ékstrak log aplikasi tina pod loadgen. Ngaganti POD_ID kana identifier tina jawaban saméméhna.
kubectl logs loadgenerator-POD_ID
13) Kéngingkeun alamat IP éksternal hellosvc:
kubectl get service
Tanggapan paréntah sigana sapertos kieu:
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) Kirim pamundut ka hellosvc: ngaganti EXTERNAL_IP ka alamat IP éksternal hellosvc.
curl http://EXTERNAL_IP
Hayu urang nyandak Istio
Anjeun geus boga hiji aplikasi deployed ka GKE. loadgen tiasa nganggo DNS Kubernetes (hellosvc:80) pikeun ngirim requests ka servertur anjeun bisa ngirim requests ka server ku alamat IP éksternal. Sanaos Kubernetes gaduh seueur fitur, aya sababaraha inpormasi anu leungit ngeunaan jasa:
Kumaha jasa interaksi? Naon hubungan antara jasa? Kumaha aliran lalulintas antara jasa? Naha anjeun sadar éta loadgen ngirimkeun requests ka server, tapi ngabayangkeun nu teu nyaho nanaon tentang aplikasi. Pikeun ngajawab patarosan ieu, hayu urang tingali daptar pods jalan di GKE.
Métrik. Sakumaha lami server ngabales hiji pamundut asup? Sabaraha pamundut per detik anu ditampi ku server? Naha éta masihan pesen kasalahan?
Émbaran Kaamanan. Lalulintas antara loadgen и server ngan ngaliwat HTTP atanapi ku mTLS?
Istio ngajawab sakabéh patarosan ieu. Jang ngalampahkeun ieu, Istio nempatkeun proxy sidecar utusan dina unggal pod. Proksi Utusan nyegat sadaya lalu lintas asup sareng kaluar kana wadah aplikasi. Éta hartosna server и loadgen nampi via sidecar proxy Utusan, sarta sakabeh lalulintas ti loadgen к server ngaliwatan proxy Utusan.
Sambungan antara proksi Utusan ngabentuk bolong jasa. Arsitéktur bolong jasa nyadiakeun lapisan kontrol dina luhureun Kubernetes.
Kusabab proxies Utusan dijalankeun dina peti sorangan, Istio bisa dipasang dina luhureun hiji klaster GKE kalawan ampir euweuh parobahan kode aplikasi. Tapi anjeun parantos ngalaksanakeun sababaraha padamelan pikeun nyiapkeun aplikasi anjeun pikeun dikelola ku Istio:
Jasa pikeun sakabéh wadahna. Pikeun deployments server и loadgen dihijikeun ka layanan Kubernetes. Komo loadgen, nu teu narima requests asup, aya layanan a.
Palabuhan dina jasa kedah gaduh nami. Sanajan palabuhan jasa bisa ditinggalkeun unnamed di GKE, Istio merlukeun anjeun nangtukeun ngaran port saluyu jeung protokolna. Dina file YAML port pikeun server eta anu disebut httpsabab server ngagunakeun protokol HTTP... Upami palayanan dipaké gRPC, Anjeun bakal ngaranan port grpc.
Deployments anu flagged. Ku alatan éta, anjeun tiasa nganggo fitur pangaturan lalu lintas Istio, sapertos ngabagi lalu lintas antara versi jasa anu sami.
Masang Istio
Aya dua cara pikeun masang Istio. Tiasa Aktipkeun Istio on GKE extension atawa install versi open source of Istio dina klaster. Kalawan Istio on GKE, anjeun bisa kalayan gampang ngatur pamasangan Istio sarta upgrades sapanjang siklus hirup klaster GKE. Upami anjeun hoyong versi panganyarna tina Istio atanapi langkung kontrol kana konfigurasi panel kontrol Istio anjeun, pasang versi open source tinimbang ekstensi Istio on GKE. Pikeun mutuskeun dina pendekatan, baca artikel Naha kuring peryogi Istio dina GKE?.
Pilih hiji pilihan, pariksa pituduh luyu, tur turutan parentah pikeun install Istio on klaster Anjeun. Upami anjeun hoyong nganggo Istio sareng aplikasi anu nembé dipasang, ngaktipkeun palaksanaan sidecar pikeun namespace standar.
Beberesih
Pikeun ngahindarkeun ditagihkeun ka akun Google Cloud Platform anjeun pikeun sumber daya anu anjeun anggo dina tutorial ieu, hapus klaster wadahna saatos anjeun pasang Istio sareng maén sareng aplikasi conto. Ieu bakal ngahapus sadaya sumber kluster, sapertos conto komputasi, disk, sareng sumber jaringan.