Men-deploy aplikasi ASP.NET Core ke Google Kubernetes Engine dengan Istio (Bagian 2)

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?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Google Cloud Platform?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. 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.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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.

  1. 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

  1. Dari Cloud Console, klik Aktifkan Cloud Shell dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmeeFiW8jX08j.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzunsqM

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

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.

  1. 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>:

f579a9baedc108a9.png

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:

772a5248aa493025.pngS

Anda akan melihat UI Prometheus di tab baru:

272ee63c1fe0be16.pngS

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:

806d696d85267a37.pngS

524cb9f6d66f8655.png

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.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

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":

11d528132dbb6cee.pngS

Pada lain waktu, Anda akan melihat pesan "Learn tentang membangun aplikasi Web dengan ASP.NET Core di Google Cloud":

3eb0d5be1b4cb40b.pngS

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":

3eb0d5be1b4cb40b.pngS

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

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