1. Ringkasan
Di bagian pertama lab ini, Anda membuat aplikasi ASP.NET Core, dalam 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 sudah menjalankan cluster Kubernetes dan aplikasi dari lab pertama yang berjalan. Anda akan melihat bagaimana Istio dapat membantu mengelola, memantau, dan mengamankan layanan Anda dengan perubahan kode minimal. Secara khusus, Anda akan menjelajahi fitur Istio seperti metrik, tracing, visualisasi layanan, pengelolaan traffic dinamis, injeksi kesalahan, dan banyak lagi.
Yang akan Anda pelajari
- Cara membuat kueri metrik dengan Prometheus.
- Cara memvisualisasikan metrik dengan Grafana.
- Cara membuat versi baru layanan Anda.
- Cara menyematkan layanan ke versi tertentu.
- Cara memisahkan traffic di antara 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 secara jarak jauh dari laptop Anda, dalam codelab ini Anda akan menggunakan Google Cloud Shell, yakni 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 penyediaan 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. Uji aplikasi.
Sebelum memulai lab, pastikan aplikasi masih bekerja dari lab sebelumnya. Sebagai pengingat, berikut adalah cara melihat IP eksternal dan port gateway, yang tercantum di 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 tersebut, kembali ke lab sebelumnya untuk memastikan Anda telah mengikuti semua langkah, dan baik aplikasi maupun Istio sudah diinstal dan berjalan dengan benar.
Pada tahap ini, Anda mungkin bertanya-tanya "Apa manfaat Istio?". Dengan mengizinkan Istio mengelola traffic aplikasi, Anda akan mendapatkan berbagai fitur seperti metrik, pelacakan, pengelolaan traffic dinamis, visualisasi layanan, injeksi kesalahan, dan lainnya secara gratis.
Anda akan mulai menjelajahi metrik di langkah berikutnya.
4. Metrik dengan Grafana dan Prometheus
Secara default, Istio menghasilkan beberapa metrik. Anda dapat menggunakan add-on untuk mengkueri dan memvisualisasikan metrik default ini.
Prometheus
Prometheus adalah solusi pemantauan open source. Anda dapat menggunakan Prometheus untuk membuat kueri 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 bahwa Prometheus 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 membuka 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
Kini 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 Membuat Kueri 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 sudah 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 membuka 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. Membuat versi baru aplikasi
Pada titik tertentu, aplikasi yang telah Anda deploy ke produksi akan memerlukan perbaikan bug atau fitur tambahan. Mari kita lihat bagaimana proses itu terlihat.
Pertama, mari kita ubah aplikasinya. Buka editor kode dari Cloud Shell.
Buka Index.cshtml
di bagian HelloWorldAspNetCore > Views > Home
dan perbarui salah satu pesan carousel.
Cari baris berikut:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
Dan ubah menjadi ini:
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,
build gambar Docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
Dan 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. Membuat deployment baru
Untuk men-deploy versi baru, Anda harus membuat deployment baru untuk versi baru tersebut di Kubernetes terlebih dahulu. Tambahkan kode berikut di 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
Pastikan pod yang diharapkan sudah 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
IP tersebut tercantum di bagian EXTERNAL-IP. Buka browser penyamaran dan kunjungi http://<replace-with-external-ip>
Saat memuat ulang, terkadang Anda akan melihat pesan "Pelajari cara membuat aplikasi Web dengan ASP.NET Core":
Pada lain waktu, Anda akan melihat pesan "Learn tentang 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. Menyematkan layanan Anda ke versi baru
Pada langkah ini, Anda menyematkan layanan untuk menggunakan deployment v2
dan 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 yang diberi nama, dari host tujuan yang sesuai. Subset ini digunakan dalam spesifikasi rute VirtualService saat mengirimkan 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
Berikutnya, 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 mengupdate VirtualService agar dapat 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
Update VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Buka browser Anda dan kunjungi http://<replace-with-external-ip>.
Meskipun setelah beberapa kali dimuat ulang, Anda akan melihat pesan "Pelajari cara membuat aplikasi Web dengan ASP.NET Core di Google Cloud":
8. Memisahkan traffic antar-versi
Terkadang, Anda mungkin ingin membagi traffic antarversi untuk pengujian. Misalnya, Anda mungkin ingin mengirim 75% traffic ke v1 dan 25% traffic ke layanan versi v2. Anda dapat mencapainya dengan mudah menggunakan Istio. Buat file aspnetcore-virtualservice-weights.yaml
baru untuk merujuk ke dua subset dengan bobot 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
Update VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
Sekarang, ketika Anda me-refresh browser, Anda akan melihat versi v1 vs v2 disajikan dengan rasio kira-kira 3:1.
Untuk mempelajari lebih lanjut, lihat pemisahan traffic di Istio.
9. Memasukkan kesalahan
Tugas pengembangan lain yang berguna untuk pengujian adalah memasukkan kesalahan atau penundaan ke dalam lalu lintas dan melihat bagaimana perilaku layanan sebagai respons.
Misalnya, Anda mungkin ingin menampilkan respons permintaan yang buruk (HTTP 400) untuk 50% traffic ke versi v1. Buat file aspnetcore-virtualservice-fault-abort.yaml
agar cocok 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
Update VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
Sekarang, ketika Anda me-refresh browser, Anda akan melihat bahwa setengah dari waktu itu, layanan v1 menampilkan kode respons HTTP 400s.
Atau mungkin Anda ingin menambah penundaan 5 detik ke permintaan. Buat file aspnetcore-virtualservice-fault-delay.yaml
agar cocok 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
Update VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
Sekarang, saat memuat ulang browser, Anda akan melihat bahwa permintaan tertunda selama 5 detik.
Untuk mempelajari lebih lanjut fitur Istio seperti waktu tunggu, percobaan ulang, aturan bersyarat, pemutus arus listrik, dan lainnya, lihat fitur pengelolaan traffic.
10. Selamat!
Semoga lab ini memberi Anda ringkasan tentang apa yang dapat dilakukan Istio untuk layanan Anda secara langsung. Untuk mempelajari Istio dan GKE lebih lanjut.
Langkah Berikutnya
- Pelajari Istio lebih lanjut.
- Pelajari Kubernetes lebih lanjut.
- Pelajari Google Kubernetes Engine lebih lanjut.
- Pelajari .NET di Google Cloud Platform lebih lanjut.
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
Meng-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