1. Ringkasan
ASP.NET Core adalah framework open source dan lintas platform untuk membangun aplikasi modern berbasis cloud dan terhubung internet menggunakan bahasa pemrograman C#.
Kubernetes adalah sistem open source untuk mengotomatiskan deployment, penskalaan, dan pengelolaan aplikasi dalam container. Istio adalah framework terbuka untuk menghubungkan, mengamankan, mengelola, dan memantau layanan.
Di bagian pertama lab ini, Anda akan men-deploy aplikasi ASP.NET Core sederhana ke Kubernetes yang berjalan di Google Kubernetes Engine (GKE) dan mengonfigurasinya agar dikelola oleh Istio.
Di bagian kedua lab ini, Anda akan mempelajari lebih lanjut fitur Istio seperti metrik, pelacakan, pengelolaan traffic dinamis, injeksi kesalahan, dan lain-lain.
Yang akan Anda pelajari
- Cara membuat dan mengemas aplikasi ASP.NET Core sederhana dalam container Docker.
- Cara membuat cluster Kubernetes dengan Google Kubernetes Engine (GKE).
- Cara menginstal Istio di cluster Kubernetes di GKE.
- Cara men-deploy aplikasi ASP.NET Core dan mengonfigurasi traffic-nya agar dikelola oleh Istio.
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 lalu buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, 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 dimuat dengan semua alat pengembangan yang Anda butuhkan. 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`
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
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. Membuat aplikasi ASP.NET Core di Cloud Shell
Pada prompt Cloud Shell, Anda dapat memastikan bahwa alat command line dotnet sudah terinstal dengan memeriksa versinya. Perintah ini akan mencetak versi alat command line dotnet yang terinstal:
dotnet --version
Selanjutnya, buat aplikasi web ASP.NET Core skeleton baru.
dotnet new mvc -o HelloWorldAspNetCore
Perintah ini akan membuat project dan memulihkan dependensinya. Anda seharusnya melihat pesan yang mirip seperti di bawah ini.
Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.
Restore succeeded.
4. Menjalankan aplikasi ASP.NET Core
Aplikasi hampir siap untuk dijalankan. Buka folder aplikasi.
cd HelloWorldAspNetCore
Terakhir, jalankan aplikasi.
dotnet run --urls=http://localhost:8080
Aplikasi mulai memproses di port 8080.
Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.
Untuk memastikan aplikasi sudah berjalan, klik tombol pratinjau web di kanan atas, lalu pilih 'Preview on port 8080'.
Anda akan melihat halaman web ASP.NET Core default:
Setelah Anda memverifikasi bahwa aplikasi berjalan, tekan Ctrl+C untuk mematikan aplikasi.
5. Mengemas aplikasi ASP.NET Core dalam container Docker
Selanjutnya, siapkan aplikasi Anda untuk dijalankan sebagai container. Langkah pertama adalah menentukan penampung dan kontennya.
Di direktori dasar aplikasi, buat Dockerfile
untuk menentukan image Docker.
touch Dockerfile
Tambahkan kode berikut ke Dockerfile
menggunakan editor favorit Anda (vim,
nano,emacs
atau editor kode Cloud Shell).
# Use Microsoft's official build .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-sdk/ FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build WORKDIR /app # Install production dependencies. # Copy csproj and restore as distinct layers. COPY *.csproj ./ RUN dotnet restore # Copy local code to the container image. COPY . ./ WORKDIR /app # Build a release artifact. RUN dotnet publish -c Release -o out # Use Microsoft's official runtime .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/ FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS runtime WORKDIR /app COPY --from=build /app/out ./ # Make sure the app binds to port 8080 ENV ASPNETCORE_URLS http://*:8080 # Run the web service on container startup. ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]
Salah satu konfigurasi penting yang disertakan dalam Dockerfile Anda adalah port tempat aplikasi memproses traffic masuk (8080). Hal ini dilakukan dengan menyetel variabel lingkungan ASPNETCORE_URLS
, yang digunakan aplikasi ASP.NET Core untuk menentukan port yang akan dipantau.
Simpan Dockerfile
ini. Sekarang, mari kita bangun image:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .
Setelah selesai (perlu waktu untuk mendownload dan mengekstrak semuanya), Anda dapat melihat bahwa image dibuat dan disimpan secara lokal:
docker images REPOSITORY TAG gcr.io/yourproject-XXXX/hello-dotnet v1
Uji image secara lokal dengan perintah berikut yang akan menjalankan container Docker secara lokal di port 8080 dari image container yang baru dibuat:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Sekali lagi, manfaatkan fitur pratinjau Web CloudShell :
Anda akan melihat halaman web ASP.NET Core default di tab baru.
Setelah memastikan bahwa aplikasi berjalan dengan baik secara lokal di container Docker, Anda dapat menghentikan container yang sedang berjalan dengan Ctrl-> C
.
Setelah image berfungsi sebagaimana mestinya, Anda dapat mengirimkannya ke Google Container Registry, yakni repositori pribadi untuk image Docker yang dapat diakses dari setiap project Google Cloud (tetapi juga dari luar Google Cloud Platform) :
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Jika semuanya berjalan lancar dan setelah beberapa saat, Anda akan dapat melihat image container yang tercantum di bagian Container Registry. Pada tahap ini, Anda sekarang memiliki image Docker di seluruh project yang dapat diakses dan diorkestrasi oleh Kubernetes seperti yang akan Anda lihat dalam beberapa menit.
Jika ingin tahu, Anda dapat membuka image container yang tersimpan di Google Cloud Storage dengan mengikuti link ini: https://console.cloud.google.com/storage/browser/ (link lengkap yang dihasilkan seharusnya dalam bentuk ini: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).
6. Membuat cluster Kubernetes/GKE dengan Istio
Pertama, pastikan Anda telah mengaktifkan Kubernetes Engine API:
gcloud services enable container.googleapis.com
Membuat cluster Kubernetes. Anda dapat mengubah region ke suatu tempat yang dekat dengan Anda, jika mau:
gcloud container clusters create hello-istio \ --cluster-version=latest \ --machine-type=n1-standard-2 \ --num-nodes=4 \ --region europe-west1
Tunggu beberapa saat selagi cluster disiapkan. Token tersebut akan terlihat di bagian Kubernetes Engine pada Google Cloud Platform Console.
Untuk codelab ini, kita akan mendownload dan menginstal Istio dari istio.io. Ada opsi penginstalan lainnya, termasuk add-on Istio untuk GKE dan Anthos Service Mesh. Langkah-langkah penerapan setelah yang ini akan berfungsi pada penginstalan Istio apa pun.
Mari kita download klien dan sampel Istio terlebih dahulu. Halaman rilis Istio menawarkan artefak download untuk beberapa OS. Dalam kasus ini, kita dapat menggunakan perintah yang mudah digunakan untuk mendownload dan mengekstrak rilis terbaru untuk platform kita saat ini:
curl -L https://istio.io/downloadIstio | sh -
Skrip akan memberi tahu Anda versi Istio yang telah didownload:
Istio has been successfully downloaded into the istio-1.8.1 folder on your system.
Direktori penginstalan berisi aplikasi contoh dan biner klien istioctl
. Ubah ke direktori tersebut:
cd istio-1.8.1
Salin dan tempel perintah yang disediakan untuk menambahkan direktori bin
ke PATH
Anda sehingga Anda dapat menggunakan istioctl
:
export PATH="$PATH:/home/<YOURHOMEID>/istio-1.8.1/bin"
Pastikan bahwa istioctl
tersedia dengan memeriksa apakah cluster Anda sudah siap untuk Istio:
istioctl x precheck
Anda akan melihat pesan yang menyatakan Install Pre-Check passed! The cluster is ready for Istio installation.
Instal Istio dengan profil demo:
istioctl install --set profile=demo
Istio kini telah terinstal di cluster Anda.
Injeksi file bantuan otomatis
Untuk mulai menggunakan Istio, Anda tidak perlu melakukan perubahan apa pun pada aplikasi. Saat Anda mengonfigurasi dan menjalankan layanan, file bantuan Envoy akan otomatis dimasukkan ke dalam setiap pod untuk layanan tersebut.
Agar dapat berfungsi, Anda harus mengaktifkan injeksi file bantuan untuk namespace ('default') yang digunakan untuk microservice. Anda melakukannya dengan menerapkan label:
kubectl label namespace default istio-injection=enabled
Untuk memverifikasi bahwa label berhasil diterapkan, jalankan perintah berikut:
kubectl get namespace -L istio-injection
Outputnya mengonfirmasi bahwa injeksi file bantuan diaktifkan untuk namespace default:
NAME STATUS AGE ISTIO-INJECTION default Active 3m enabled istio-system Active 63s disabled ...
7. Memverifikasi penginstalan
Istio dilengkapi dengan tiga layanan: bidang kontrol istiod
, serta gateway masuk dan keluar (yang dapat Anda anggap sebagai "proxy file bantuan untuk internet yang lain") , yang bernama istio-ingressgateway
dan istio-egressgateway
masing-masing.
kubectl get svc -n istio-system
Output Anda akan terlihat seperti ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP AGE istio-egressgateway ClusterIP 10.55.252.182 <none> istio-ingressgateway LoadBalancer 10.55.250.185 35.233.118.42 istiod ClusterIP 10.55.253.217 <none>
Gateway Ingress memiliki jenis LoadBalancer
sehingga dapat diakses dari Internet; yang lain hanya perlu
dapat diakses dari dalam cluster.
Selanjutnya, pastikan pod Kubernetes yang sesuai telah di-deploy dan semua container aktif dan berjalan:
kubectl get pods -n istio-system
Ketika semua pod berjalan, Anda dapat melanjutkan.
NAME READY STATUS istio-egressgateway-674988f895-m6tk4 1/1 Running istio-ingressgateway-6996f7dcc8-7lvm2 1/1 Running istiod-6bf5fc8b64-j79hj 1/1 Running
istiod
: Bidang kontrol Istio. Menangani konfigurasi dan pemrograman file bantuan proxy, penemuan layanan, distribusi sertifikat, dan injeksi file bantuaningress gateway
: Menangani permintaan masuk dari luar cluster Anda.egress gateway
: Menangani permintaan keluar ke endpoint di luar cluster.
8. Men-deploy aplikasi
Sekarang, setelah Anda memverifikasi bahwa Istio telah diinstal dan berjalan, Anda dapat men-deploy aplikasi ASP.NET Core.
Deployment dan Layanan
Pertama, buat file aspnetcore.yaml
menggunakan editor favorit Anda (vim, nano,emacs
atau editor kode Cloud Shell) dan tentukan Deployment dan Service Kubernetes untuk aplikasi:
apiVersion: v1 kind: Service metadata: name: aspnetcore-service labels: app: aspnetcore spec: ports: - port: 8080 name: http selector: app: aspnetcore --- apiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v1 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v1 template: metadata: labels: app: aspnetcore version: v1 spec: containers: - name: aspnetcore image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 8080
Konten file adalah Deployment dan Layanan standar untuk men-deploy aplikasi dan tidak berisi apa pun yang khusus untuk Istio.
Deploy layanan ke namespace default dengan kubectl
:
kubectl apply -f aspnetcore.yaml
service "aspnetcore-service" created deployment.extensions "aspnetcore-v1" created
Pastikan bahwa pod sedang berjalan:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s
Gateway dan VirtualService
Agar traffic masuk dapat menjangkau mesh, Anda perlu membuat Gateway dan VirtualService.
Gateway mengonfigurasi load balancer untuk traffic HTTP/TCP, yang paling sering beroperasi di tepi mesh guna mengaktifkan traffic masuk untuk aplikasi. VirtualService mendefinisikan aturan yang mengontrol bagaimana permintaan untuk layanan dirutekan dalam mesh layanan Istio.
Buat file aspnetcore-gateway.yaml
untuk menentukan Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: aspnetcore-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
Buat file aspnetcore-virtualservice.yaml
untuk menentukan VirtualService:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service
Jalankan perintah kubectl untuk men-deploy Gateway dengan:
kubectl apply -f aspnetcore-gateway.yaml
Perintah tersebut menghasilkan output berikut:
gateway.networking.istio.io "aspnetcore-gateway" created
Selanjutnya, jalankan perintah berikut untuk men-deploy VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Perintah tersebut menghasilkan output berikut:
virtualservice.networking.istio.io "aspnetcore-virtualservice" created
Pastikan semuanya berjalan dengan baik:
kubectl get gateway
NAME AGE aspnetcore-gateway 28s
kubectl get virtualservice
NAME AGE aspnetcore-virtualservice 33s
Selamat! Anda baru saja men-deploy aplikasi yang mendukung Istio. Selanjutnya, Anda melihat aplikasi yang digunakan.
9. Uji aplikasi.
Anda akhirnya dapat melihat cara kerja aplikasi. Anda perlu mendapatkan IP eksternal dan port gateway. ID ini tercantum di bawah EXTERNAL-IP
:
kubectl get svc istio-ingressgateway -n istio-system
Ekspor IP eksternal dan port ke variabel GATEWAY_URL
:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
Gunakan curl
untuk menguji aplikasi. Layanan akan merespons dengan kode respons 200
:
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/
Atau, Anda dapat membuka browser, membuka http://<gatewayurl>
untuk melihat aplikasi:
10. Selamat!
Anda baru saja men-deploy aplikasi ASP.NET Core sederhana ke Kubernetes yang berjalan di Google Kubernetes Engine (GKE) dan mengonfigurasinya agar dikelola oleh Istio.
Anda mungkin bertanya-tanya "Apa manfaat Istio?". Pertanyaan yang bagus. Sejauh ini, tidak ada keuntungan dari Istio mengelola aplikasi ini. Di bagian kedua lab ini, kita akan mempelajari lebih lanjut fitur Istio, seperti metrik, tracing, pengelolaan traffic dinamis, visualisasi layanan, dan injeksi kesalahan.
Langkah Berikutnya
- Deploy aplikasi ASP.NET Core ke GKE dengan Istio (Bagian 2).
- 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
Jika Anda tidak melanjutkan ke bagian kedua lab ini, 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.yaml
Untuk mengonfirmasi bahwa aplikasi telah hilang:
kubectl get gateway kubectl get virtualservices 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-istio