1. Ringkasan
Di bagian pertama lab, Anda membuat aplikasi ASP.NET Core, membuat container, dan men-deploy-nya ke Google Kubernetes Engine (GKE) serta mengonfigurasi traffic-nya agar dikelola oleh Istio.
Bagian kedua lab ini mengasumsikan bahwa Anda telah menjalankan cluster Kubernetes dan aplikasi dari lab pertama. Anda akan melihat bagaimana Istio dapat membantu mengelola, memantau, dan mengamankan layanan Anda dengan perubahan kode minimal. Secara khusus, Anda akan mempelajari fitur Istio seperti metrik, pelacakan, visualisasi layanan, pengelolaan traffic dinamis, injeksi kesalahan, dan banyak lagi.
Yang akan Anda pelajari
- Cara mengkueri metrik dengan Prometheus.
- Cara memvisualisasikan metrik dengan Grafana.
- Cara membuat versi baru layanan Anda.
- Cara menyematkan layanan ke versi tertentu.
- Cara memisahkan traffic antar-versi yang berbeda.
- Cara memasukkan kesalahan dalam panggilan layanan.
Yang Anda butuhkan
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman dengan Google Cloud Platform?
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)
Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.
- Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.
Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell
Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Google Cloud.
Mengaktifkan Cloud Shell
- Dari Cloud Console, klik Aktifkan Cloud Shell
.
Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:
Perlu waktu beberapa saat untuk menyediakan dan terhubung ke Cloud Shell.
Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser atau Chromebook.
Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
Output perintah
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
Output perintah
[core] project = <PROJECT_ID>
Jika tidak, Anda dapat menyetelnya dengan perintah ini:
gcloud config set project <PROJECT_ID>
Output perintah
Updated property [core/project].
3. Menguji aplikasi
Sebelum memulai lab, pastikan aplikasi masih berfungsi dari lab sebelumnya. Sebagai pengingat, berikut cara melihat IP eksternal dan port gateway, yang tercantum di bagian EXTERNAL-IP:
kubectl get svc istio-ingressgateway -n istio-system
Untuk melihat aplikasi, Anda dapat membuka browser dan membuka http://<gatewayurl>:

Jika Anda tidak melihat aplikasi, kembali ke lab sebelumnya untuk memastikan Anda telah mengikuti semua langkah dan aplikasi serta Istio telah diinstal dan berjalan dengan benar.
Pada titik ini, Anda mungkin bertanya-tanya "Apa manfaat Istio?". Dengan mengizinkan Istio mengelola traffic aplikasi Anda, Anda akan mendapatkan fitur seperti metrik, pelacakan, pengelolaan traffic dinamis, visualisasi layanan, injeksi kesalahan, dan lainnya secara gratis.
Anda akan mulai dengan mempelajari metrik di langkah berikutnya.
4. Metrik dengan Grafana dan Prometheus
Secara default, Istio menghasilkan beberapa metrik. Anda dapat menggunakan add-on untuk membuat kueri dan memvisualisasikan metrik default ini.
Prometheus
Prometheus adalah solusi pemantauan open source. Anda dapat menggunakan Prometheus untuk mengkueri metrik yang dihasilkan oleh Istio, tetapi Anda harus menginstal add-on Prometheus terlebih dahulu.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
Pastikan Prometheus sedang berjalan:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
Kirim beberapa traffic ke aplikasi dengan mengunjungi http://<gatewayurl> beberapa kali atau menjalankan perintah curl.
Siapkan penerusan port untuk UI Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
Sekarang Anda dapat menjalankan kueri dengan mengklik tombol Web Preview di pojok kanan atas Cloud Shell, lalu mengklik Preview on port 8080:

Anda akan melihat UI Prometheus di tab baru:

Untuk mempelajari Prometheus lebih lanjut, lihat Mengkueri Metrik dengan Prometheus.
Grafana
Grafana adalah add-on lain untuk memvisualisasikan metrik.
Instal Grafana. Ganti istio-version dengan versi Istio Anda saat ini,misalnya, 1.0.3-gke.3:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
Pastikan Grafana sedang berjalan:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
Kirim beberapa traffic ke aplikasi dengan mengunjungi http://<gatewayurl> beberapa kali atau menjalankan perintah curl.
Siapkan penerusan port untuk UI Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
Anda dapat melihat dasbor Grafana dengan membuka Pratinjau Web:


Untuk mempelajari Granfana lebih lanjut, lihat Memvisualisasikan Metrik dengan Grafana.
5. Buat versi baru aplikasi
Pada suatu saat, aplikasi yang telah Anda deploy ke produksi akan memerlukan perbaikan bug atau fitur tambahan. Mari kita lihat seperti apa prosesnya.
Pertama, mari kita modifikasi aplikasi. Buka editor kode dari Cloud Shell.
Buka Index.cshtml di bagian HelloWorldAspNetCore > Views > Home dan perbarui salah satu pesan carousel.
Temukan baris berikut:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
Lalu, ubah menjadi:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
Simpan perubahan, lalu kembali ke Cloud Shell. Di dalam HelloWorldAspNetCore,, bangun image Docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
Lalu, kirim ke Container Registry:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
Setelah mengirim image container, Anda dapat men-deploy versi baru pada langkah berikutnya.
6. Buat deployment baru
Untuk men-deploy versi baru, Anda harus membuat deployment baru untuk versi tersebut di Kubernetes terlebih dahulu. Tambahkan kode berikut di bagian akhir file aspnetcore.yaml:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-v2
spec:
replicas: 1
selector:
matchLabels:
app: aspnetcore
version: v2
template:
metadata:
labels:
app: aspnetcore
version: v2
spec:
containers:
- name: aspnetcore
image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
Deploy versi baru ke namespace default dengan kubectl:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
Verifikasi bahwa pod yang diharapkan sedang berjalan:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
Sekarang, uji aplikasi lagi. Dapatkan IP eksternal gateway:
kubectl get svc istio-ingressgateway -n istio-system
Alamat IP tersebut tercantum di bagian EXTERNAL-IP. Buka browser samaran, lalu buka http://<replace-with-external-ip>
Saat memuat ulang, terkadang Anda akan melihat pesan "Pelajari cara membuat aplikasi Web dengan ASP.NET Core":

Terkadang, Anda akan melihat pesan "Pelajari cara membangun aplikasi Web dengan ASP.NET Core di Google Cloud":

Hal ini karena deployment v1 dan v2 diekspos di belakang layanan Kubernetes yang sama (aspnetcore-service) dan VirtualService yang Anda buat di lab sebelumnya (aspnetcore-virtualservice) menggunakan layanan tersebut sebagai host.
Pada langkah berikutnya, Anda menyematkan layanan ke deployment v2 menggunakan DestinationRule.
7. Sematkan layanan Anda ke versi baru
Pada langkah ini, Anda menyematkan layanan untuk menggunakan deployment v2 dan Anda dapat melakukannya dengan DestinationRule. DestinationRule mengonfigurasi kumpulan kebijakan yang akan diterapkan ke permintaan setelah operasi perutean VirtualService terjadi.
DestinationRule juga menentukan subset yang dapat dialamatkan, yang berarti versi bernama, dari host tujuan yang sesuai. Subset ini digunakan dalam spesifikasi rute VirtualService saat mengirim traffic ke versi layanan tertentu.
Buat file baru yang disebut aspnetcore-destinationrule.yaml:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: aspnetcore-destinationrule
spec:
host: aspnetcore-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Selanjutnya, buat DestinationRule. Tindakan ini akan membuat dua subset (v1 dan v2) yang dapat Anda gunakan dari VirtualService:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
Sekarang, kembali ke file aspnetcore-virtualservice.yaml untuk memperbarui VirtualService agar menggunakan subset v2:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v2
Perbarui VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Buka browser Anda dan kunjungi http://<replace-with-external-ip>. Bahkan setelah beberapa kali memuat ulang, Anda akan melihat pesan "Learn about building Web apps with ASP.NET Core on Google Cloud":

8. Membagi traffic antar-versi
Terkadang, Anda mungkin ingin memisahkan traffic antar-versi untuk pengujian. Misalnya, Anda mungkin ingin mengirim 75% traffic ke v1 dan 25% traffic ke versi v2 layanan. Anda dapat melakukannya dengan mudah menggunakan Istio. Buat file aspnetcore-virtualservice-weights.yaml baru untuk merujuk ke dua subset dengan ketebalan yang berbeda:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v1
weight: 75
- destination:
host: aspnetcore-service
subset: v2
weight: 25
Perbarui VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
Sekarang, saat memuat ulang browser, Anda akan melihat versi v1 vs. v2 ditayangkan dengan rasio sekitar 3:1.
Untuk mempelajari lebih lanjut, lihat pemisahan traffic di Istio.
9. Menyuntikkan kesalahan
Tugas pengembangan berguna lainnya yang dapat dilakukan untuk pengujian adalah menyuntikkan kesalahan atau penundaan ke dalam traffic dan melihat perilaku layanan sebagai respons.
Misalnya, Anda mungkin ingin menampilkan respons permintaan yang tidak valid (HTTP 400) untuk 50% traffic ke versi v1. Buat file aspnetcore-virtualservice-fault-abort.yaml agar sesuai dengan yang berikut:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
abort:
percentage:
value: 50
httpStatus: 400
route:
- destination:
host: aspnetcore-service
subset: v1
Perbarui VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
Sekarang, saat memuat ulang browser, Anda akan melihat bahwa setengah dari waktu, layanan v1 menampilkan kode respons HTTP 400.
Atau mungkin Anda ingin menambahkan penundaan 5 detik pada permintaan. Buat file aspnetcore-virtualservice-fault-delay.yaml agar sesuai dengan yang berikut:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
delay:
fixedDelay: 5s
percentage:
value: 100
route:
- destination:
host: aspnetcore-service
subset: v1
Perbarui VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
Sekarang, saat memuat ulang browser, Anda akan melihat bahwa permintaan ditunda selama 5 detik.
Untuk mempelajari lebih lanjut fitur Istio seperti waktu tunggu, percobaan ulang, aturan bersyarat, pemutus sirkuit, dan lainnya, lihat fitur pengelolaan traffic.
10. Selamat!
Semoga lab ini memberi Anda ringkasan tentang kemampuan Istio untuk layanan Anda secara langsung. Untuk mempelajari Istio dan GKE lebih lanjut.
Langkah Berikutnya
- Pelajari Istio lebih lanjut.
- Pelajari Kubernetes lebih lanjut.
- Pelajari lebih lanjut Google Kubernetes Engine.
- Pelajari lebih lanjut .NET di Google Cloud Platform.
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.
11. Pembersihan
Anda dapat menghapus aplikasi dan meng-uninstal Istio atau cukup menghapus cluster Kubernetes.
Menghapus aplikasi
Untuk menghapus aplikasi:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
Untuk mengonfirmasi bahwa aplikasi sudah tidak ada:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
Uninstal Istio
Untuk menghapus Istio:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Untuk mengonfirmasi bahwa Istio sudah tidak ada:
kubectl get pods -n istio-system
Menghapus cluster Kubernetes
gcloud container clusters delete hello-dotnet-cluster