Istio adalah alat yang mudah digunakan untuk menghubungkan, mengamankan, dan memantau aplikasi terdistribusi. Istio menggunakan berbagai teknologi untuk menjalankan dan mengelola perangkat lunak dalam skala besar, termasuk container untuk mengemas kode aplikasi dan dependensi untuk penerapan, dan Kubernetes untuk mengelola container tersebut. Oleh karena itu, untuk bekerja dengan Istio Anda harus mengetahui cara kerja aplikasi dengan berbagai layanan berdasarkan teknologi ini tanpa istio. Jika alat dan konsep ini sudah familiar bagi Anda, silakan lewati tutorial ini dan langsung ke bagiannya Menginstal Istio di Google Kubernetes Engine (GKE) atau memasang ekstensi Istio di GKE.
Ini adalah panduan langkah demi langkah di mana kami akan memandu seluruh proses mulai dari kode sumber hingga container GKE untuk memberi Anda pemahaman dasar tentang teknologi ini melalui sebuah contoh. Anda juga akan melihat bagaimana Istio memanfaatkan kekuatan teknologi ini. Ini mengasumsikan Anda tidak tahu apa pun tentang container, Kubernetes, service mesh, atau Istio.
tugas
Dalam tutorial ini, Anda akan menyelesaikan tugas-tugas berikut:
Mempelajari aplikasi hello world sederhana dengan berbagai layanan.
Jalankan aplikasi dari kode sumber.
Mengemas aplikasi dalam wadah.
Membuat cluster Kubernetes.
Menyebarkan kontainer ke dalam sebuah cluster.
Sebelum kamu memulai
Ikuti petunjuk untuk mengaktifkan Kubernetes Engine API:
Dalam tutorial ini, Anda dapat menggunakan Cloud Shell yang menyiapkan mesin virtual g1-kecil di Mesin Komputasi Google dengan Linux berbasis Debian, atau komputer Linux atau macOS.
Opsi A: Menggunakan Cloud Shell
Keuntungan menggunakan Cloud Shell:
Lingkungan pengembangan Python 2 dan Python 3 (termasuk virtualenv) dikonfigurasi sepenuhnya.
Alat Baris Perintah gcloud, buruh pelabuhan, git ΠΈ kubectl, yang akan kita gunakan sudah terinstal.
Contoh aplikasi ditulis dengan Python dan terdiri dari dua komponen yang berinteraksi menggunakan ISTIRAHAT:
Server: server sederhana dengan satu titik akhir MENDAPATKAN, /, yang mencetak "hello world" ke konsol.
memuatgen: skrip yang mengirimkan lalu lintas ke Server, dengan jumlah permintaan per detik yang dapat dikonfigurasi.
Menjalankan aplikasi dari kode sumber
Untuk menjelajahi aplikasi sampel, jalankan aplikasi tersebut di Cloud Shell atau di komputer Anda.
1) Dalam katalog istio-samples/sample-apps/helloserver Lari Server:
python3 server/server.py
Saat memulai Server berikut ini ditampilkan:
INFO:root:Starting server...
2) Buka jendela terminal lain untuk mengirim permintaan Server. Jika Anda menggunakan Cloud Shell, klik ikon tambahkan untuk membuka sesi lainnya.
3) Kirim permintaan ke Server:
curl http://localhost:8080
jawaban server:
Hello World!
4) Dari direktori tempat Anda mengunduh kode contoh, buka direktori yang berisi memuatgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Dari perspektif jaringan, seluruh aplikasi berjalan pada satu host (komputer lokal atau mesin virtual Cloud Shell). Oleh karena itu Anda dapat menggunakan localhostuntuk mengirim permintaan ke Server.
10) Untuk berhenti memuatgen ΠΈ Server, memasuki Ctrl-c di setiap jendela terminal.
11) Di jendela terminal memuatgen nonaktifkan lingkungan virtual:
deactivate
Mengemas aplikasi dalam wadah
Untuk menjalankan aplikasi di GKE, Anda perlu mengemas contoh aplikasi - Server ΠΈ memuatgen - di Wadah. Kontainer adalah cara mengemas aplikasi untuk mengisolasinya dari lingkungannya.
Untuk mengemas aplikasi ke dalam sebuah wadah, Anda memerlukan Dockerfile. Dockerfile adalah file teks yang mendefinisikan perintah untuk membangun kode sumber aplikasi dan dependensinya gambar buruh pelabuhan. Setelah dibuat, Anda mengunggah gambar ke registri kontainer seperti Docker Hub atau Registri Kontainer.
Contohnya sudah ada Dockerfile untuk Server ΠΈ memuatgen dengan semua perintah yang diperlukan untuk mengumpulkan gambar. 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" ]
Tim DARI python:3-slim sebagai basis memberitahu Docker untuk menggunakan yang terbaru gambar piton 3 sebagai basis.
Tim MENYALIN. . menyalin file sumber ke direktori kerja saat ini (hanya dalam kasus kami server.py) ke sistem file penampung.
TITIK MASUK mendefinisikan perintah yang digunakan untuk memulai wadah. Dalam kasus kami, perintah ini hampir sama dengan yang biasa Anda jalankan server.py dari kode sumber.
Tim MEMBUKA mengindikasikan bahwa Server menunggu data melalui port 8080. Tim ini tidak menyediakan port. Ini adalah semacam dokumentasi yang diperlukan untuk membuka port 8080 saat memulai wadah.
Bersiap untuk memasukkan aplikasi Anda ke dalam container
1) Tetapkan variabel lingkungan berikut. Mengganti PROJECT_ID ke ID proyek GCP Anda.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Menggunakan nilai PROJECT_ID ΠΈ GCR_REPO Anda menandai image Docker saat Anda membuatnya dan memasukkannya ke Container Registry pribadi.
2) Tetapkan proyek GCP default untuk alat baris perintah gcloud.
gcloud config set project $PROJECT_ID
3) Tetapkan zona default untuk alat baris perintah gcloud.
gcloud config set compute/zone us-central1-b
4) Pastikan layanan Container Registry diaktifkan di project GCP.
Tinjau daftar gambar di repositori dan verifikasi bahwa gambar telah diunggah:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Perintah tersebut menampilkan nama gambar yang baru diunggah:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Membuat kluster GKE.
Kontainer ini dapat dijalankan di mesin virtual Cloud Shell atau di komputer dengan perintah buruh pelabuhan. Namun dalam lingkungan produksi, Anda memerlukan cara untuk mengatur container secara terpusat. Misalnya, Anda memerlukan sistem yang memastikan container selalu berjalan, dan Anda memerlukan cara untuk meningkatkan dan menjalankan instance container tambahan jika lalu lintas meningkat.
Untuk menjalankan aplikasi dalam container yang dapat Anda gunakan G.K.E.. GKE adalah platform orkestrasi container yang menggabungkan mesin virtual ke dalam sebuah cluster. Setiap mesin virtual disebut node. Cluster GKE didasarkan pada sistem pengelolaan cluster Kubernetes open source. Kubernetes menyediakan mekanisme untuk berinteraksi dengan cluster.
Tim gcloud membuat kluster istioready di proyek GCP dan zona default yang Anda tentukan. Untuk menjalankan Istio, kami merekomendasikan memiliki setidaknya 4 node dan mesin virtual n1-standar-2.
Tim membuat cluster dalam beberapa menit. Ketika cluster sudah siap, perintah akan mengeluarkan sesuatu seperti ini Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
2) Berikan kredensial di alat baris perintah kubectluntuk menggunakannya untuk mengelola cluster:
3) Sekarang Anda dapat berkomunikasi dengan Kubernetes melalui kubectl. Misalnya, perintah berikut dapat mengetahui status node:
kubectl get nodes
Perintah ini menghasilkan daftar node:
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
Diagram menunjukkan aplikasi di GKE:
Sebelum Anda men-deploy container di GKE, pelajari konsep utama Kubernetes. Ada tautan di bagian paling akhir jika Anda ingin mempelajari lebih lanjut.
Node dan cluster. Di GKE, node adalah mesin virtual. Pada platform Kubernetes lainnya, sebuah node dapat berupa komputer atau mesin virtual. Klaster adalah kumpulan node yang dapat dianggap sebagai satu unit tempat Anda menyebarkan aplikasi dalam container.
Polong. Di Kubernetes, container dijalankan di pod. Sebuah Pod di Kubernetes adalah sebuah unit yang tidak dapat dipisahkan. Sebuah Pod menampung satu atau lebih kontainer. Anda menyebarkan kontainer server dan memuatgen dalam pod terpisah. Ketika ada beberapa container dalam sebuah pod (misalnya, server aplikasi dan server proxy), kontainer dikelola sebagai satu entitas dan berbagi sumber daya pod.
Penerapan. Di Kubernetes, penerapan adalah objek yang merupakan kumpulan pod yang identik. Deployment meluncurkan beberapa replika pod yang didistribusikan ke seluruh node cluster. Deployment secara otomatis menggantikan pod yang gagal atau tidak responsif.
layanan Kubernetes. Saat menjalankan kode aplikasi di GKE, koneksi antar memuatgen ΠΈ Server. Saat Anda memulai layanan di mesin virtual atau desktop Cloud Shell, Anda mengirimkan permintaan ke Server di localhost: 8080. Setelah di-deploy ke GKE, pod akan dieksekusi pada node yang tersedia. Secara default, Anda tidak memiliki kendali atas node mana yang menjalankan pod, begitu juga Anda polong tidak ada alamat IP permanen.
Untuk mendapatkan alamat IP untuk Server, Anda perlu mendefinisikan abstraksi jaringan di atas pod. Begitulah adanya layanan Kubernetes. Layanan Kubernetes menyediakan titik akhir persisten untuk sekumpulan pod. Ada beberapa jenis layanan. Server menggunakan Penyeimbang Beban, yang memberikan alamat IP eksternal untuk dihubungi Server dari luar cluster.
Kubernetes juga memiliki sistem DNS bawaan yang memberikan nama DNS (misalnya, helloserver.default.cluster.lokal) jasa. Berkat ini, pod-pod di dalam cluster berkomunikasi dengan pod-pod lain di cluster pada alamat yang konstan. Nama DNS tidak dapat digunakan di luar cluster, misalnya di Cloud Shell atau di komputer.
Kubernetes bermanifestasi
Saat Anda menjalankan aplikasi dari sumber, Anda menggunakan perintah imperatif python3
server.py
Imperatif menyiratkan kata kerja: βlakukan ini.β
Kubernet menggunakan model deklaratif. Artinya, kami tidak memberi tahu Kubernetes apa yang harus dilakukan, melainkan menjelaskan keadaan yang diinginkan. Misalnya, Kubernetes memulai dan menghentikan pod sesuai kebutuhan untuk menjaga keadaan sebenarnya dari sistem tetap konsisten dengan keadaan yang diinginkan.
Anda menunjukkan keadaan yang diinginkan dalam manifes atau file YAML. File YAML berisi spesifikasi untuk satu atau lebih objek Kubernetes.
Contoh ini berisi file YAML untuk Server ΠΈ memuatgen. Setiap file YAML menentukan status objek penerapan dan layanan Kubernetes yang diinginkan.
Bidang pertama spek berisi deskripsi keadaan yang diinginkan.
spec.replika menunjukkan jumlah pod yang diinginkan.
Bagian spec.template mendefinisikan templat pod. Ada kolom di spesifikasi pod gambar, yang menentukan nama gambar yang perlu diekstraksi dari Container Registry.
Penyeimbang Beban: Klien mengirimkan permintaan ke alamat IP penyeimbang beban, yang memiliki alamat IP persisten dan dapat diakses dari luar cluster.
Pelabuhan target: seperti yang Anda ingat, tim Paparan 8080 Π² Dockerfile tidak menyediakan port. Anda menyediakan port 8080sehingga Anda dapat menghubungi wadah tersebut Server di luar cluster. Dalam kasus kami hellosvc.default.cluster.local:80 (nama pendek: halovc) sesuai dengan port 8080 Alamat IP pod haloserver.
pelabuhan: Ini adalah nomor port dimana layanan lain dalam cluster akan mengirimkan permintaan.
loadgen.yaml
Penempatan menolak loadgen.yaml terlihat seperti server.yaml. Perbedaannya adalah objek penerapan berisi bagian env. Ini mendefinisikan variabel lingkungan yang diperlukan memuatgen dan yang Anda instal saat menjalankan aplikasi dari sumber.
waktu memuatgen tidak menerima permintaan masuk, untuk bidang tersebut mengetik ditunjukkan ClusterIP. Tipe ini menyediakan alamat IP persisten yang dapat digunakan oleh layanan dalam klaster, namun alamat IP ini tidak diekspos ke klien eksternal.
Mengganti PROJECT_ID ke ID proyek GCP Anda.
9) Simpan dan tutup loadgen.yaml, tutup editor teks.
10) Terapkan file YAML ke Kubernetes:
kubectl apply -f loadgen.yaml
Setelah berhasil diselesaikan, perintah menghasilkan kode berikut:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Periksa 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 dari pod memuatgen. Mengganti POD_ID ke pengidentifikasi dari jawaban sebelumnya.
kubectl logs loadgenerator-POD_ID
13) Dapatkan alamat IP eksternal halovc:
kubectl get service
Respons perintah terlihat 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) Kirim permintaan ke halovc: mengganti EKSTERNAL_IP ke alamat IP eksternal halovc.
curl http://EXTERNAL_IP
Mari kita hadapi Istio
Anda sudah memiliki aplikasi yang di-deploy ke GKE. memuatgen dapat menggunakan DNS Kubernetes (halosvc:80) untuk mengirim permintaan ke Serverdan Anda dapat mengirim permintaan ke Server berdasarkan alamat IP eksternal. Meskipun Kubernetes memiliki banyak fitur, ada beberapa informasi yang hilang mengenai layanan ini:
Bagaimana layanan berinteraksi? Apa hubungan antar layanan? Bagaimana arus lalu lintas antar layanan? Apakah kamu sadar akan hal itu memuatgen mengirimkan permintaan ke Server, tapi bayangkan Anda tidak tahu apa-apa tentang aplikasi tersebut. Untuk menjawab pertanyaan tersebut, mari kita lihat daftar pod yang berjalan di GKE.
Metrik. Berapa lama Server menanggapi permintaan masuk? Berapa banyak permintaan per detik yang diterima oleh server? Apakah itu memberikan pesan kesalahan?
informasi keamanan. Lalu lintas antar memuatgen ΠΈ Server baru saja melewatinya HTTP atau oleh mTLS?
Istio menjawab semua pertanyaan ini. Untuk melakukan ini, Istio menempatkan proxy sespan Utusan di setiap pod. Proksi Utusan mencegat semua lalu lintas masuk dan keluar ke kontainer aplikasi. Artinya Server ΠΈ memuatgen terima melalui utusan proxy sespan, dan semua lalu lintas dari memuatgen ΠΊ Server melewati proxy Utusan.
Koneksi antara proxy Utusan membentuk jaring layanan. Arsitektur service mesh menyediakan lapisan kontrol di atas Kubernetes.
Karena proxy Envoy berjalan di containernya sendiri, Istio dapat diinstal di atas cluster GKE hampir tanpa perubahan pada kode aplikasi. Namun Anda telah melakukan beberapa upaya agar aplikasi Anda siap dikelola oleh Istio:
Layanan untuk semua kontainer. Untuk penerapan Server ΠΈ memuatgen terkait dengan layanan Kubernetes. Bahkan memuatgen, yang tidak menerima permintaan masuk, ada layanan.
Port dalam layanan harus memiliki nama. Meskipun port layanan tidak boleh disebutkan namanya di GKE, Istio mengharuskan Anda untuk menentukannya nama pelabuhan sesuai dengan protokolnya. Dalam file YAML port untuk Server bernama httpkarena server menggunakan protokol HTTP... Jika layanan digunakan gRPC, Anda akan memberi nama portnya grpc.
Penerapan ditandai. Oleh karena itu, Anda dapat menggunakan fitur manajemen lalu lintas Istio, seperti membagi lalu lintas antar versi layanan yang sama.
Instalasi
Ada dua cara untuk menginstal Istio. Bisa aktifkan Istio pada ekstensi GKE ΠΈΠ»ΠΈ instal Istio versi open source di cluster. Dengan Istio di GKE, Anda dapat dengan mudah mengelola instalasi dan upgrade Istio di seluruh siklus hidup cluster GKE. Jika Anda menginginkan Istio versi terbaru atau kontrol lebih besar atas konfigurasi panel kontrol Istio Anda, instal versi open source alih-alih ekstensi Istio di GKE. Untuk memutuskan pendekatannya, baca artikelnya Apakah saya memerlukan Istio di GKE?.
Pilih salah satu opsi, baca panduan yang sesuai, dan ikuti petunjuk untuk menginstal Istio di cluster Anda. Jika Anda ingin menggunakan Istio dengan aplikasi yang baru Anda terapkan, mengaktifkan implementasi sespan untuk ruang nama kegagalan.
ΠΡΠΈΡΡΠΊΠ°
Untuk menghindari tagihan ke akun Google Cloud Platform Anda atas sumber daya yang Anda gunakan dalam tutorial ini, hapus kluster kontainer setelah Anda menginstal Istio dan bermain dengan aplikasi contoh. Tindakan ini akan menghapus semua sumber daya klaster, seperti instans komputasi, disk, dan sumber daya jaringan.