1. Genel Bakış
ASP.NET Core, C# programlama dilini kullanarak modern bulut tabanlı ve internete bağlı uygulamalar oluşturmaya yönelik açık kaynaklı ve platformlar arası bir çerçevedir.
Kubernetes, container mimarisine alınmış uygulamaların dağıtımını, ölçeklendirmesini ve yönetimini otomatikleştirmek için kullanılan açık kaynaklı bir sistemdir. Istio, hizmetleri bağlamak, güvenli hale getirmek, yönetmek ve izlemek için kullanılan açık bir çerçevedir.
Laboratuvarın bu ilk bölümünde, Google Kubernetes Engine (GKE) üzerinde çalışan Kubernetes'e basit bir ASP.NET Core uygulaması dağıtacak ve bu uygulamayı Istio tarafından yönetilecek şekilde yapılandıracaksınız.
Laboratuvarın ikinci bölümünde, metrikler, izleme, dinamik trafik yönetimi ve hata yerleştirme gibi Istio özelliklerini daha ayrıntılı bir şekilde keşfedeceksiniz.
Neler öğreneceksiniz?
- Docker container'da basit bir ASP.NET Core uygulaması oluşturma ve paketleme
- Google Kubernetes Engine (GKE) ile Kubernetes kümesi oluşturma
- GKE'deki bir Kubernetes kümesine Istio'yu yükleme
- ASP.NET Core uygulamanızı dağıtma ve trafiğini Istio tarafından yönetilecek şekilde yapılandırma
İhtiyacınız olanlar
Bu eğitimi nasıl kullanacaksınız?
Google Cloud Platform deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve şartlar
Yönlendirmesiz ortam kurulumu
- Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.



Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.
- Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de Google Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makine, ihtiyaç duyduğunuz tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Değilse şu komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Cloud Shell'de ASP.NET Core uygulaması oluşturma
Cloud Shell isteminde, sürümünü kontrol ederek dotnet komut satırı aracının zaten yüklü olduğunu doğrulayabilirsiniz. Bu komut, yüklü dotnet komut satırı aracının sürümünü yazdırmalıdır:
dotnet --version
Ardından yeni bir iskelet ASP.NET Core web uygulaması oluşturun.
dotnet new mvc -o HelloWorldAspNetCore
Bu komut bir proje oluşturur ve projenin bağımlılarını yeniler. Aşağıdakine benzer bir mesaj görürsünüz.
Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.
Restore succeeded.
4. ASP.NET Core uygulamasını çalıştırma
Uygulamamızı çalıştırmaya neredeyse hazırız. Uygulama klasörüne gidin.
cd HelloWorldAspNetCore
Son olarak uygulamayı çalıştırın.
dotnet run --urls=http://localhost:8080
Uygulama, 8080 numaralı bağlantı noktasında dinlemeye başlar.
Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.
Uygulamanın çalıştığını doğrulamak için sağ üstteki web önizleme düğmesini tıklayın ve "8080 numaralı bağlantı noktasında önizle"yi seçin.

Varsayılan ASP.NET Core web sayfasını görürsünüz:

Uygulamanın çalıştığını doğruladıktan sonra Ctrl+C tuşlarına basarak uygulamayı kapatın.
5. ASP.NET Core uygulamasını Docker container'ında paketleme
Ardından, uygulamanızı container olarak çalışmaya hazırlayın. İlk adım, kapsayıcıyı ve içeriğini tanımlamaktır.
Uygulamanın temel dizininde, Docker görüntüsünü tanımlamak için bir Dockerfile oluşturun.
touch Dockerfile
Sık kullandığınız düzenleyiciyi (vim, nano,emacs veya Cloud Shell'in kod düzenleyicisi) kullanarak Dockerfile dosyasına aşağıdakileri ekleyin.
# 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"]
Dockerfile'ınızda yer alan önemli bir yapılandırma, uygulamanın gelen trafiği dinlediği bağlantı noktasıdır (8080). Bu, ASP.NET Core uygulamalarının hangi bağlantı noktasının dinleneceğini belirlemek için kullandığı ASPNETCORE_URLS ortam değişkeni ayarlanarak gerçekleştirilir.
Bu Dockerfile kaydedin. Şimdi görüntüyü oluşturalım:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .
Bu işlem tamamlandıktan sonra (her şeyin indirilmesi ve ayıklanması biraz zaman alır) görüntünün oluşturulduğunu ve yerel olarak kaydedildiğini görebilirsiniz:
docker images REPOSITORY TAG gcr.io/yourproject-XXXX/hello-dotnet v1
Aşağıdaki komutla görüntüyü yerel olarak test edin. Bu komut, yeni oluşturduğunuz container görüntüsünden 8080 numaralı bağlantı noktasında yerel olarak bir Docker container'ı çalıştırır:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Cloud Shell'in web önizleme özelliğinden tekrar yararlanın :

Varsayılan ASP.NET Core web sayfasını yeni bir sekmede görmelisiniz.

Uygulamanın yerel olarak bir Docker kapsayıcısında sorunsuz çalıştığını doğruladıktan sonra Ctrl-> C ile çalışan kapsayıcıyı durdurabilirsiniz.
Görüntü artık beklendiği gibi çalıştığına göre, her Google Cloud projesinden (ancak Google Cloud Platform'un dışından da) erişilebilen Docker görüntüleriniz için özel bir depo olan Google Container Registry'ye aktarabilirsiniz:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Her şey yolunda giderse kısa bir süre sonra kapsayıcı resminin Container Registry bölümünde listelendiğini görürsünüz. Bu noktada, Kubernetes'in erişebileceği ve birkaç dakika içinde göreceğiniz gibi düzenleyebileceği proje genelinde bir Docker görüntüsüne sahip olursunuz.

Merak ediyorsanız Google Cloud Storage'da depolanan kapsayıcı resimlerine şu bağlantıyı kullanarak göz atabilirsiniz: https://console.cloud.google.com/storage/browser/ (Sonuç olarak elde edilen bağlantı şu biçimde olmalıdır: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).
6. Istio ile Kubernetes/GKE kümesi oluşturma
Öncelikle, Kubernetes Engine API'nin etkinleştirildiğinden emin olun:
gcloud services enable container.googleapis.com
Kubernetes kümesi oluşturun. İsterseniz bölgeyi size yakın bir yerle değiştirebilirsiniz:
gcloud container clusters create hello-istio \ --cluster-version=latest \ --machine-type=n1-standard-2 \ --num-nodes=4 \ --region europe-west1
Kümeniz sizin için ayarlanırken birkaç dakika bekleyin. Bu bilgi, Google Cloud Platform Console'un Kubernetes Engine bölümünde görünür.

Bu codelab'de Istio'yu istio.io adresinden indirip yükleyeceğiz. GKE için Istio eklentisi ve Anthos Service Mesh gibi başka yükleme seçenekleri de vardır. Bundan sonraki uygulama adımları, herhangi bir Istio yüklemesinde çalışır.
Öncelikle Istio istemcisini ve örneklerini indirelim. Istio sürüm sayfasında çeşitli işletim sistemleri için indirme yapıları sunulur. Bizim durumumuzda, mevcut platformumuz için en son sürümü indirip ayıklamak üzere uygun bir komut kullanabiliriz:
curl -L https://istio.io/downloadIstio | sh -
Komut dosyası, indirilen Istio sürümünü gösterir:
Istio has been successfully downloaded into the istio-1.8.1 folder on your system.
Yükleme dizini, örnek uygulamaları ve istioctl istemci ikili programını içerir. Bu dizine geçin:
cd istio-1.8.1
bin dizinini PATH dizininize eklemek için sağlanan komutu kopyalayıp yapıştırın. Böylece istioctl kullanabilirsiniz:
export PATH="$PATH:/home/<YOURHOMEID>/istio-1.8.1/bin"
Kümenizin Istio için hazır olduğunu kontrol ederek istioctl hizmetinin kullanılabildiğini doğrulayın:
istioctl x precheck
Install Pre-Check passed! The cluster is ready for Istio installation. mesajını görmeniz gerekir.
Istio'yu demo profiliyle yükleyin:
istioctl install --set profile=demo
Istio artık kümenize yüklendi.
Otomatik sidecar ekleme
Istio'yu kullanmaya başlamak için uygulamada herhangi bir değişiklik yapmanız gerekmez. Hizmetleri yapılandırıp çalıştırdığınızda, hizmetle ilgili her bir kapsüle Envoy yardımcı dosyaları otomatik olarak eklenir.
Bunun çalışması için mikro hizmetlerinizde kullandığınız ad alanı ("default") için sidecar eklemeyi etkinleştirmeniz gerekir. Bunu bir etiket uygulayarak yapabilirsiniz:
kubectl label namespace default istio-injection=enabled
Etiketin başarıyla uygulandığını doğrulamak için aşağıdaki komutu çalıştırın:
kubectl get namespace -L istio-injection
Çıktı, varsayılan ad alanı için yardımcı kapsayıcı eklemenin etkinleştirildiğini onaylar:
NAME STATUS AGE ISTIO-INJECTION default Active 3m enabled istio-system Active 63s disabled ...
7. Kurulumu doğrulama
Istio üç hizmetle birlikte gelir: istiod kontrol düzlemi ve sırasıyla istio-ingressgateway ve istio-egressgateway olarak adlandırılan giriş ve çıkış ağ geçitleri (bunları "İnternet'in geri kalanı için sidecar proxy'ler" olarak düşünebilirsiniz).
kubectl get svc -n istio-system
Çıkışınız şu şekilde görünmelidir:
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>
Ingress ağ geçidinin türü LoadBalancer olduğundan internetten erişilebilir. Diğerlerine ise yalnızca küme içinden erişilmesi gerekir.
Ardından, ilgili Kubernetes kapsüllerinin dağıtıldığından ve tüm kapsayıcıların çalışır durumda olduğundan emin olun:
kubectl get pods -n istio-system
Tüm pod'lar çalışır duruma geldiğinde devam edebilirsiniz.
NAME READY STATUS istio-egressgateway-674988f895-m6tk4 1/1 Running istio-ingressgateway-6996f7dcc8-7lvm2 1/1 Running istiod-6bf5fc8b64-j79hj 1/1 Running
istiod: Istio kontrol düzlemi. Proxy yardımcı birimlerinin yapılandırılması ve programlanması, hizmet keşfi, sertifika dağıtımı ve yardımcı birim yerleştirme işlemlerini yönetir.ingress gateway: Kümenizin dışından gelen istekleri işler.egress gateway: Kümenizin dışındaki uç noktalara giden istekleri işler.
8. Uygulamayı dağıtın
Istio'nun yüklendiğini ve çalıştığını doğruladığınıza göre ASP.NET Core uygulamasını dağıtabilirsiniz.
Dağıtım ve Hizmet
İlk olarak, en sevdiğiniz düzenleyiciyi (vim, nano,emacs veya Cloud Shell'in kod düzenleyicisi) kullanarak bir aspnetcore.yaml dosyası oluşturun ve uygulama için Kubernetes dağıtımını ve hizmetini tanımlayın:
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
Dosyanın içeriği, uygulamayı dağıtmak için kullanılan standart dağıtımlar ve hizmetlerdir ve Istio'ya özgü hiçbir şey içermez.
Hizmetleri kubectl ile varsayılan ad alanına dağıtın:
kubectl apply -f aspnetcore.yaml
service "aspnetcore-service" created deployment.extensions "aspnetcore-v1" created
Kapsüllerin çalıştığını doğrulayın:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s
Ağ Geçidi ve VirtualService
Giriş trafiğinin ağa ulaşmasına izin vermek için Gateway ve VirtualService oluşturmanız gerekir.
Ağ geçidi, HTTP/TCP trafiği için bir yük dengeleyiciyi yapılandırır. En yaygın olarak, bir uygulamaya gelen trafiği etkinleştirmek için ağın kenarında çalışır. VirtualService, bir hizmete yönelik isteklerin Istio hizmet ağında nasıl yönlendirileceğini kontrol eden kuralları tanımlar.
Ağ geçidini tanımlamak için aspnetcore-gateway.yaml dosyası oluşturun:
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:
- "*"
VirtualService'i tanımlamak için bir aspnetcore-virtualservice.yaml dosyası oluşturun:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
Aşağıdaki kubectl komutunu çalıştırarak ağ geçidini dağıtın:
kubectl apply -f aspnetcore-gateway.yaml
Komut aşağıdaki çıkışı üretir:
gateway.networking.istio.io "aspnetcore-gateway" created
Ardından, VirtualService'i dağıtmak için aşağıdaki komutu çalıştırın:
kubectl apply -f aspnetcore-virtualservice.yaml
Komut aşağıdaki çıkışı üretir:
virtualservice.networking.istio.io "aspnetcore-virtualservice" created
Her şeyin çalıştığını doğrulayın:
kubectl get gateway
NAME AGE aspnetcore-gateway 28s
kubectl get virtualservice
NAME AGE aspnetcore-virtualservice 33s
Tebrikler! Yeni bir Istio özellikli uygulama dağıttınız. Ardından, kullanılan uygulamayı görürsünüz.
9. Uygulamayı test etme
Son olarak, uygulamayı çalışırken görebilirsiniz. Ağ geçidinin harici IP'sini ve bağlantı noktasını almanız gerekir. EXTERNAL-IP altında listelenir:
kubectl get svc istio-ingressgateway -n istio-system
Harici IP'yi ve bağlantı noktasını bir GATEWAY_URL değişkenine aktarın:
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
Uygulamayı test etmek için curl kullanın. Hizmet, 200 yanıt koduyla yanıt vermelidir:
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/
Alternatif olarak, tarayıcıyı açıp http://<gatewayurl> simgesine giderek uygulamayı görüntüleyebilirsiniz:

10. Tebrikler!
Google Kubernetes Engine (GKE) üzerinde çalışan Kubernetes'e basit bir ASP.NET Core uygulaması dağıttınız ve bu uygulamayı Istio tarafından yönetilecek şekilde yapılandırdınız.
"Istio'nun avantajı nedir?" diye merak ediyor olabilirsiniz. Çok güzel bir soru. Şu ana kadar Istio'nun bu uygulamayı yönetmesinin herhangi bir avantajı yok. Laboratuvarın ikinci bölümünde, metrikler, izleme, dinamik trafik yönetimi, hizmet görselleştirme ve hata yerleştirme gibi Istio özelliklerini daha ayrıntılı olarak inceleyeceğiz.
Sonraki Adımlar
- Istio ile GKE'ye ASP.NET Core uygulaması dağıtma (2. Bölüm).
- Istio hakkında daha fazla bilgi edinin.
- Kubernetes hakkında daha fazla bilgi edinin.
- Google Kubernetes Engine hakkında daha fazla bilgi edinin.
- Google Cloud Platform'da.NET hakkında daha fazla bilgi edinin.
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.
11. Temizleme
Laboratuvarın ikinci bölümüne devam etmeyecekseniz uygulamayı silebilir ve Istio'yu kaldırabilir ya da Kubernetes kümesini silebilirsiniz.
Uygulamayı silme
Uygulamayı silmek için:
kubectl delete -f aspnetcore-gateway.yaml Kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore.yaml
Uygulamanın kaldırıldığını onaylamak için:
kubectl get gateway kubectl get virtualservices kubectl get pods
Istio'yu kaldırma
Istio'yu silmek için:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Istio'nun kaldırıldığını onaylamak için:
kubectl get pods -n istio-system
Kubernetes kümesini silme
gcloud container clusters delete hello-istio