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

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?

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

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

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_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

Perlu waktu beberapa saat untuk menyediakan 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. 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>:

f579a9baedc108a9.png

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:

772a5248aa493025.png

Anda akan melihat UI Prometheus di tab baru:

272ee63c1fe0be16.png

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:

806d696d85267a37.png

524cb9f6d66f8655.png

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.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

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

11d528132dbb6cee.png

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

3eb0d5be1b4cb40b.png

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

3eb0d5be1b4cb40b.png

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

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