Istio ialah alat mudah untuk menyambung, mengamankan dan memantau aplikasi yang diedarkan. Istio menggunakan pelbagai teknologi untuk menjalankan dan mengurus perisian secara berskala, termasuk bekas untuk membungkus kod aplikasi dan kebergantungan untuk penggunaan, dan Kubernetes untuk mengurus bekas tersebut. Oleh itu, untuk bekerja dengan Istio anda mesti tahu cara aplikasi dengan pelbagai perkhidmatan berdasarkan teknologi ini berfungsi tanpa Istio. Jika alatan dan konsep ini sudah biasa kepada anda, jangan ragu untuk melangkau tutorial ini dan pergi terus ke bahagian tersebut Memasang Istio pada Enjin Kubernetes Google (GKE) atau memasang sambungan Istio pada GKE.
Ini ialah panduan langkah demi langkah di mana kami akan menjalankan keseluruhan proses daripada kod sumber ke bekas GKE untuk memberi anda pemahaman asas tentang teknologi ini melalui contoh. Anda juga akan melihat cara Istio memanfaatkan kuasa teknologi ini. Ini menganggap anda tidak tahu apa-apa tentang bekas, Kubernetes, jaringan perkhidmatan atau Istio.
tugas-tugas
Dalam tutorial ini, anda akan menyelesaikan tugasan berikut:
Mempelajari aplikasi hello world yang mudah dengan pelbagai perkhidmatan.
Jalankan aplikasi daripada kod sumber.
Membungkus aplikasi dalam bekas.
Mencipta gugusan Kubernetes.
Menyebarkan bekas ke dalam kelompok.
Sebelum awak mula
Ikut arahan untuk mendayakan API Enjin Kubernetes:
Dalam tutorial ini, anda boleh menggunakan Cloud Shell, yang menyediakan mesin maya g1-kecil dalam Enjin Pengiraan Google dengan Linux berasaskan Debian, atau komputer Linux atau macOS.
Pilihan A: Menggunakan Cloud Shell
Faedah menggunakan Cloud Shell:
Persekitaran pembangunan Python 2 dan Python 3 (termasuk virtualenv) dikonfigurasikan sepenuhnya.
Alat Baris Perintah gcloud, docker, pergi ΠΈ kubectl, yang akan kami gunakan sudah dipasang.
Aplikasi sampel ditulis dalam Python dan terdiri daripada dua komponen yang berinteraksi menggunakan REST:
server: pelayan mudah dengan satu titik akhir DAPATKAN, /, yang mencetak "hello world" ke konsol.
loadgen: skrip yang menghantar trafik ke server, dengan bilangan permintaan yang boleh dikonfigurasikan sesaat.
Menjalankan aplikasi daripada kod sumber
Untuk meneroka aplikasi sampel, jalankan ia dalam Cloud Shell atau pada komputer anda.
1) Dalam katalog istio-samples/sample-apps/helloserver lari server:
python3 server/server.py
Pada permulaan server berikut dipaparkan:
INFO:root:Starting server...
2) Buka tetingkap terminal lain untuk menghantar permintaan server. Jika anda menggunakan Cloud Shell, klik ikon tambah untuk membuka sesi lain.
3) Hantar permintaan kepada server:
curl http://localhost:8080
balasan pelayan:
Hello World!
4) Dari direktori tempat anda memuat turun kod sampel, pergi ke direktori yang mengandungi loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Dari perspektif rangkaian, keseluruhan aplikasi berjalan pada satu hos (komputer tempatan atau mesin maya Cloud Shell). Oleh itu anda boleh menggunakan localhostuntuk menghantar permintaan kepada server.
10) Untuk berhenti loadgen ΠΈ server, masuk Ctrl-c dalam setiap tetingkap terminal.
11) Dalam tetingkap terminal loadgen nyahaktifkan persekitaran maya:
deactivate
Membungkus aplikasi dalam bekas
Untuk menjalankan aplikasi pada GKE, anda perlu membungkus aplikasi contoh β server ΠΈ loadgen - pada bekas. Bekas ialah cara untuk membungkus aplikasi untuk mengasingkannya daripada persekitarannya.
Untuk membungkus aplikasi ke dalam bekas, anda perlukan Dockerfile. Dockerfile ialah fail teks yang mentakrifkan arahan untuk membina kod sumber aplikasi dan kebergantungannya ke dalam Imej Docker. Setelah dibina, anda memuat naik imej ke pendaftaran kontena seperti Docker Hub atau Pendaftaran Kontena.
Contoh sudah ada Dockerfile untuk server ΠΈ loadgen dengan semua arahan yang diperlukan untuk mengumpul imej. Di bawah - Dockerfile untuk 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" ]
Pasukan DARI python:3-slim sebagai asas memberitahu Docker untuk menggunakan yang terkini Imej Python 3 sebagai asas.
Pasukan SALINAN. . menyalin fail sumber ke direktori kerja semasa (dalam kes kami sahaja pelayan.py) ke sistem fail bekas.
ENTRYPOINT mentakrifkan arahan yang digunakan untuk memulakan bekas. Dalam kes kami, arahan ini hampir sama seperti yang anda gunakan untuk menjalankan pelayan.py daripada kod sumber.
Pasukan DEDAHKAN menunjukkan bahawa server menunggu data melalui port 8080. Pasukan ini tidak menyediakan pelabuhan. Ini adalah sejenis dokumentasi yang diperlukan untuk membuka port 8080 semasa memulakan bekas.
Bersedia untuk menyimpan permohonan anda
1) Tetapkan pembolehubah persekitaran berikut. Gantikan PROJECT_ID ke ID projek GCP anda.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Menggunakan nilai PROJECT_ID ΠΈ GCR_REPO anda menandakan imej Docker apabila anda membinanya dan menolaknya ke Pendaftaran Kontena peribadi.
2) Tetapkan projek GCP lalai untuk alat baris arahan gcloud.
gcloud config set project $PROJECT_ID
3) Tetapkan zon lalai untuk alat baris arahan gcloud.
gcloud config set compute/zone us-central1-b
4) Pastikan perkhidmatan Pendaftaran Kontena didayakan dalam projek GCP.
Semak senarai imej dalam repositori dan sahkan bahawa imej telah dimuat naik:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Perintah memaparkan nama imej yang baru dimuat naik:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Mencipta gugusan GKE.
Bekas ini boleh dijalankan pada mesin maya Cloud Shell atau pada komputer dengan arahan berlari docker. Tetapi dalam persekitaran pengeluaran, anda memerlukan cara untuk mengatur kontena secara berpusat. Sebagai contoh, anda memerlukan sistem yang memastikan bekas sentiasa berjalan dan anda memerlukan cara untuk meningkatkan dan menaikkan contoh kontena tambahan jika trafik meningkat.
Untuk menjalankan aplikasi kontena yang boleh anda gunakan GKE. GKE ialah platform orkestrasi kontena yang mengagregatkan mesin maya ke dalam kelompok. Setiap mesin maya dipanggil nod. Kluster GKE adalah berdasarkan sistem pengurusan kluster Kubernetes sumber terbuka. Kubernetes menyediakan mekanisme untuk berinteraksi dengan kluster.
Pasukan gcloud mencipta gugusan istioready dalam projek GCP dan zon lalai yang anda tentukan. Untuk menjalankan Istio, kami mengesyorkan anda mempunyai sekurang-kurangnya 4 nod dan mesin maya n1-standard-2.
Pasukan mencipta kluster dalam beberapa minit. Apabila kluster sudah sedia, arahan akan mengeluarkan sesuatu seperti ini mesej itu.
2) Sediakan kelayakan dalam alat baris arahan kubectluntuk menggunakannya untuk mengurus kluster:
3) Kini anda boleh berkomunikasi dengan Kubernetes melalui kubectl. Sebagai contoh, arahan berikut boleh mengetahui status nod:
kubectl get nodes
Perintah menghasilkan senarai nod:
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 Utama Kubernetes
Rajah menunjukkan aplikasi pada GKE:
Sebelum anda menggunakan bekas dalam GKE, pelajari konsep utama Kubernetes. Terdapat pautan di hujung sekali jika anda ingin mengetahui lebih lanjut.
Nod dan kelompok. Dalam GKE, nod ialah mesin maya. Pada platform Kubernetes lain, nod boleh menjadi komputer atau mesin maya. Kluster ialah koleksi nod yang boleh dianggap sebagai satu unit tempat anda menggunakan aplikasi kontena.
Polong. Dalam Kubernetes, bekas dijalankan dalam pod. Pod dalam Kubernetes ialah unit yang tidak boleh dibahagikan. Pod memuatkan satu atau lebih bekas. Anda menggunakan bekas pelayan dan loadgen dalam pod berasingan. Apabila terdapat beberapa bekas dalam pod (contohnya, pelayan aplikasi dan pelayan proksi), bekas diuruskan sebagai satu entiti dan berkongsi sumber pod.
Kerahan. Dalam Kubernetes, penempatan ialah objek yang merupakan koleksi pod yang sama. Alokasi melancarkan berbilang replika pod yang diedarkan merentasi nod kelompok. Alokasi secara automatik menggantikan pod yang gagal atau tidak bertindak balas.
perkhidmatan Kubernetes. Apabila menjalankan kod aplikasi dalam GKE, sambungan antara loadgen ΠΈ server. Apabila anda memulakan perkhidmatan pada mesin maya atau desktop Cloud Shell, anda menghantar permintaan kepada server ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ localhost: 8080. Setelah digunakan ke GKE, pod dilaksanakan pada nod yang tersedia. Secara lalai, anda tidak mempunyai kawalan ke atas nod yang pod sedang dijalankan, jadi anda buah polong tiada alamat IP kekal.
Untuk mendapatkan alamat IP untuk server, anda perlu menentukan abstraksi rangkaian di atas pod. Itulah yang berlaku perkhidmatan Kubernetes. Perkhidmatan Kubernetes menyediakan titik akhir yang berterusan untuk satu set pod. Terdapat beberapa jenis perkhidmatan. server kegunaan LoadBalancer, yang menyediakan alamat IP luaran untuk dihubungi server dari luar kluster.
Kubernetes juga mempunyai sistem DNS terbina dalam yang memberikan nama DNS (contohnya, helloserver.default.cluster.local) perkhidmatan. Terima kasih kepada ini, pod dalam kluster berkomunikasi dengan pod lain dalam kluster pada alamat tetap. Nama DNS tidak boleh digunakan di luar kluster, seperti dalam Cloud Shell atau pada komputer.
Kubernetes menjelma
Apabila anda menjalankan aplikasi dari sumber, anda menggunakan perintah penting python3
pelayan.py
Imperatif membayangkan kata kerja: "buat ini."
Kubernetes menggunakan model deklaratif. Ini bermakna kami tidak memberitahu Kubernetes dengan tepat apa yang perlu dilakukan, sebaliknya menerangkan keadaan yang diingini. Contohnya, Kubernetes memulakan dan menghentikan pod seperti yang diperlukan untuk memastikan keadaan sebenar sistem konsisten dengan keadaan yang dikehendaki.
Anda menunjukkan keadaan yang dikehendaki dalam manifes atau fail YAML. Fail YAML mengandungi spesifikasi untuk satu atau lebih objek Kubernetes.
Contoh mengandungi fail YAML untuk server ΠΈ loadgen. Setiap fail YAML menentukan keadaan yang dikehendaki bagi objek penempatan dan perkhidmatan Kubernetes.
Medan pertama spec mengandungi perihalan keadaan yang dikehendaki.
spec.replika menunjukkan bilangan pod yang dikehendaki.
Seksyen spec.template mentakrifkan templat pod. Terdapat medan dalam spesifikasi pod gambar, yang menentukan nama imej yang perlu diekstrak daripada Pendaftaran Kontena.
LoadBalancer: Pelanggan menghantar permintaan ke alamat IP pengimbang beban, yang mempunyai alamat IP berterusan dan boleh diakses dari luar kluster.
targetPort: seperti yang anda ingat, pasukan DEDAH 8080 Π² Dockerfile tidak menyediakan pelabuhan. Anda menyediakan pelabuhan 8080supaya anda boleh menghubungi bekas server di luar kluster. Dalam kes kita hellosvc.default.cluster.local:80 (nama pendek: hellosvc) sepadan dengan pelabuhan 8080 Alamat IP pod helloserver.
pelabuhan: Ini ialah nombor port di mana perkhidmatan lain dalam kluster akan menghantar permintaan.
loadgen.yaml
Kerahan objek kepada loadgen.yaml seperti pelayan.yaml. Perbezaannya ialah objek penempatan mengandungi bahagian env. Ia mentakrifkan pembolehubah persekitaran yang diperlukan loadgen dan yang anda pasang semasa menjalankan aplikasi daripada sumber.
masa loadgen tidak menerima permintaan masuk, untuk medan jenis ditunjukkan KlusterIP. Jenis ini menyediakan alamat IP berterusan yang boleh digunakan oleh perkhidmatan dalam kluster, tetapi alamat IP ini tidak terdedah kepada pelanggan luaran.
Gantikan PROJECT_ID ke ID projek GCP anda.
9) Simpan dan tutup loadgen.yaml, tutup penyunting teks.
10) Sebarkan fail YAML ke Kubernetes:
kubectl apply -f loadgen.yaml
Setelah berjaya diselesaikan, arahan menghasilkan kod berikut:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Semak status pod:
kubectl get pods
Perintah menunjukkan status:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Ekstrak log aplikasi daripada pod loadgen. Gantikan POD_ID kepada pengecam daripada jawapan sebelumnya.
kubectl logs loadgenerator-POD_ID
13) Dapatkan alamat IP luaran hellosvc:
kubectl get service
Respons arahan kelihatan seperti ini:
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) Hantar permintaan kepada hellosvc: ganti EXTERNAL_IP kepada alamat IP luaran hellosvc.
curl http://EXTERNAL_IP
Mari kita lawan Istio
Anda sudah mempunyai aplikasi yang digunakan untuk GKE. loadgen boleh menggunakan DNS Kubernetes (hellosvc:80) untuk menghantar permintaan kepada serverdan anda boleh menghantar permintaan ke server dengan alamat IP luaran. Walaupun Kubernetes mempunyai banyak ciri, terdapat beberapa maklumat yang hilang tentang perkhidmatan:
Bagaimanakah perkhidmatan berinteraksi? Apakah hubungan antara perkhidmatan? Bagaimanakah aliran trafik antara perkhidmatan? Adakah anda sedar bahawa loadgen menghantar permintaan kepada server, tetapi bayangkan anda tidak tahu apa-apa tentang aplikasi itu. Untuk menjawab soalan ini, mari lihat senarai pod yang sedang berjalan dalam GKE.
Metrik. Berapa lama server membalas permintaan masuk? Berapa banyak permintaan sesaat yang diterima oleh pelayan? Adakah ia memberikan mesej ralat?
Maklumat Keselamatan. Trafik antara loadgen ΠΈ server hanya melalui HTTP atau oleh mTLS?
Istio menjawab semua soalan ini. Untuk melakukan ini, Istio meletakkan proksi kereta sampingan duta dalam setiap pod. Proksi Utusan memintas semua trafik masuk dan keluar ke bekas aplikasi. Maksudnya begitu server ΠΈ loadgen terima melalui Duta proksi sidecar, dan semua trafik dari loadgen ΠΊ server melalui proksi Utusan.
Sambungan antara proksi Utusan membentuk jaringan perkhidmatan. Seni bina mesh perkhidmatan menyediakan lapisan kawalan di atas Kubernetes.
Memandangkan proksi Envoy dijalankan dalam bekas mereka sendiri, Istio boleh dipasang di atas gugusan GKE tanpa perubahan pada kod aplikasi. Tetapi anda telah melakukan beberapa kerja untuk menyediakan permohonan anda untuk diuruskan oleh Istio:
Perkhidmatan untuk semua kontena. Kepada penempatan server ΠΈ loadgen terikat dengan perkhidmatan Kubernetes. Malah loadgen, yang tidak menerima permintaan masuk, terdapat perkhidmatan.
Pelabuhan dalam perkhidmatan mesti mempunyai nama. Walaupun port perkhidmatan boleh dibiarkan tanpa nama dalam GKE, Istio memerlukan anda untuk menentukan nama pelabuhan sesuai dengan protokolnya. Dalam fail YAML port untuk server dipanggil httpkerana pelayan menggunakan protokol HTTP. Jika perkhidmatan digunakan gRPC, anda akan menamakan pelabuhan itu grpc.
Kerahan dibenderakan. Oleh itu, anda boleh menggunakan ciri pengurusan trafik Istio, seperti membahagikan trafik antara versi perkhidmatan yang sama.
Memasang Istio
Terdapat dua cara untuk memasang Istio. boleh dayakan Istio pada sambungan GKE atau pasang versi sumber terbuka Istio pada kluster. Dengan Istio pada GKE, anda boleh mengurus pemasangan dan peningkatan Istio dengan mudah sepanjang kitaran hayat kelompok GKE. Jika anda mahukan versi terkini Istio atau lebih kawalan ke atas konfigurasi panel kawalan Istio anda, pasang versi sumber terbuka dan bukannya sambungan Istio pada GKE. Untuk memutuskan pendekatan, baca artikel Adakah saya memerlukan Istio pada GKE?.
Pilih pilihan, semak panduan yang sesuai dan ikut arahan untuk memasang Istio pada kluster anda. Jika anda ingin menggunakan Istio dengan aplikasi anda yang baru digunakan, membolehkan pelaksanaan sidecar untuk ruang nama lalai.
Pembersihan
Untuk mengelak daripada dicaj ke akaun Google Cloud Platform anda untuk sumber yang anda gunakan dalam tutorial ini, padamkan gugusan kontena setelah anda memasang Istio dan bermain dengan aplikasi sampel. Ini akan mengalih keluar semua sumber kluster, seperti contoh pengiraan, cakera dan sumber rangkaian.