1. Genel Bakış
ASP.NET Core, C# programlama dilini kullanarak modern bulut tabanlı ve internete bağlı uygulamalar oluşturmaya yönelik açık kaynak 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üvence altına almak, 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ını dağıtacak ve Istio tarafından yönetilecek şekilde yapılandıracaksınız.
Laboratuvarın ikinci bölümünde metrikler, izleme, dinamik trafik yönetimi, hata ekleme gibi Istio'nun özelliklerini ayrıntılı olarak keşfedeceksiniz.
Neler öğreneceksiniz?
- Docker container'ında basit bir ASP.NET Core uygulaması oluşturup paketleme.
- Google Kubernetes Engine (GKE) ile Kubernetes kümesi oluşturma.
- GKE'deki bir Kubernetes kümesine Istio yükleme.
- ASP.NET Core uygulamanızı dağıtma ve Istio tarafından yönetilecek trafiği yapılandırma.
Gerekenler
Bu eğiticiden nasıl yararlanacaksınız?
Google Cloud Platform deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve şartlar
Kendi hızınızda ortam kurulumu
- Cloud Console'da oturum açıp 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.
Tüm Google Cloud projelerinde benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad zaten alınmış ve size uygun olmayacaktır!). Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT_ID
olarak adlandırılacaktır.
- Sonraki adımda, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. "Temizleme" bölümündeki talimatları izlediğinizden emin olun. bölümünde, bu eğiticinin dışında faturalandırmayla karşılaşmamanız için kaynakları nasıl kapatacağınız konusunda tavsiyelerde bulunuyoruz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Cloud Shell'i başlatma
Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de 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 simgesini 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ında) gösterilir. Bu durumda Devam'ı tıklayın (bunu bir daha görmezsiniz). Tek seferlik ekran şöyle görünür:
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
İhtiyaç duyduğunuz tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı yalnızca bir tarayıcı veya Chromebook'unuzla yapılabilir.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını görürsünüz.
- Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki 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 projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Doğru değilse aşağıdaki 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, Dotnet komut satırı aracının sürümünü kontrol ederek zaten yüklü olduğunu doğrulayabilirsiniz. Bu komut, yüklü Pointnet 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şturmalı ve projenin bağımlılarını geri yüklemelidir. 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ından 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 önizlemesi düğmesini tıklayıp "8080 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, uygulamayı kapatmak için Ctrl+C tuşlarına basın.
5. ASP.NET Core uygulamasını bir Docker container'ında paketleme
Ardından, uygulamanızı kapsayıcı olarak çalışmaya hazırlayın. İlk adım, kapsayıcıyı ve içeriğini tanımlamaktır.
Docker görüntüsünü tanımlamak için uygulamanın ana dizininde bir Dockerfile
oluşturun.
touch Dockerfile
Favori düzenleyicinizi (vim,
nano,emacs
veya Cloud Shell'in kod düzenleyicisini) kullanarak aşağıdakileri Dockerfile
öğesine 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ıza dahil olan önemli yapılandırmalardan biri, uygulamanın gelen trafiği (8080) dinlediği bağlantı noktasıdır. Bu işlem, ASP.NET Core uygulamalarının hangi bağlantı noktasını dinleyeceğini belirlemek için kullandığı ASPNETCORE_URLS
ortam değişkeni ayarlanarak gerçekleştirilir.
Bu Dockerfile
öğesini kaydedin. Şimdi de 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 şeyi indirip ayıklaması biraz zaman alabilir), görüntünün yerel olarak oluşturulduğunu ve kaydedildiğini görebilirsiniz:
docker images REPOSITORY TAG gcr.io/yourproject-XXXX/hello-dotnet v1
Yeni oluşturulan container görüntünüzden 8080 bağlantı noktası üzerinde yerel olarak bir Docker container'ı çalıştıran aşağıdaki komutla görüntüyü yerel olarak test edin:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Tekrar CloudShell'in Web önizlemesi özelliğinden yararlanın :
Varsayılan ASP.NET Core web sayfasını yeni bir sekmede görürsünüz.
Uygulamanın bir Docker container'ında yerel olarak düzgün çalıştığını doğruladıktan sonra, çalışan kapsayıcıyı Ctrl-> C
tarihine kadar durdurabilirsiniz.
Görüntünün beklendiği gibi çalıştığına göre artık görüntüyü Google Container Registry'ye aktarabilirsiniz. Google Container Registry, tüm Google Cloud projelerinden (ancak Google Cloud Platform dışından) erişilebilen Docker görüntüleriniz için özel bir depodur.
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Her şey yolunda giderse ve bir süre sonra kapsayıcı görüntüsünün Container Registry bölümünde listelendiğini görebilirsiniz. Bu aşamada, Kubernetes'in erişip düzenleyebileceği, birkaç dakika içinde göreceğiniz bir proje genelinde Docker görüntüsüne sahip olursunuz.
Merak ederseniz, Google Cloud Storage'da depolanan container görüntülerinin arasında şu bağlantıyı izleyerek gezinebilirsiniz: https://console.cloud.google.com/storage/browser/ (Tam 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. Aşağıdakilere benzer şekilde, 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. Google Cloud Platform konsolunun Kubernetes Engine bölümünde görebilirsiniz.
Bu codelab için istio.io'dan Istio'yu indirip yükleyeceğiz. GKE için Istio eklentisi ve Anthos Service Mesh gibi başka yükleme seçenekleri de mevcuttur. Bundan sonraki uygulama adımları herhangi bir Istio kurulumunda işe yarayacaktır.
Öncelikle Istio istemcisini ve örnekleri indirelim. Istio sürüm sayfası, çeşitli işletim sistemleri için indirme yapıları sunar. Örneğimizde, mevcut platformumuzun en son sürümünü indirmek ve çıkarmak için kullanışlı bir komut kullanabiliriz:
curl -L https://istio.io/downloadIstio | sh -
Komut dosyası, indirilen Istio sürümünü belirtir:
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
dosyanıza eklemek için sağlanan komutu kopyalayıp yapıştırın. Böylece istioctl
'yi kullanabilirsiniz:
export PATH="$PATH:/home/<YOURHOMEID>/istio-1.8.1/bin"
Kümenizin Istio için hazır olup olmadığını kontrol ederek istioctl
öğesinin kullanılabilir olduğunu doğrulayın:
istioctl x precheck
Install Pre-Check passed! The cluster is ready for Istio installation.
yazan bir mesaj göreceksiniz.
Demo profiliyle Istio'yu yükleyin:
istioctl install --set profile=demo
Istio, kümenize yüklendi.
Otomatik yardımcı dosya 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 Envoy yardımcı dosyaları, hizmet için her kapsüle otomatik olarak eklenir.
Bunun işe yaraması için, mikro hizmetlerinizde kullandığınız ad alanı ("varsayılan") alanında yardımcı dosya yerleştirmeyi 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
Çıkış, varsayılan ad alanı için yardımcı dosya eklemenin etkinleştirildiğini onaylar:
NAME STATUS AGE ISTIO-INJECTION default Active 3m enabled istio-system Active 63s disabled ...
7. Yüklemeyi 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 ("İnternetin geri kalanı için yardımcı proxy'ler" olarak düşünebilirsiniz).
kubectl get svc -n istio-system
Çıkışınız aşağıdaki gibi 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>
Giriş Ağ Geçidi LoadBalancer
türünde olduğundan internet üzerinden erişilebilir; diğerlerine ise yalnızca küme içinden erişilebilmelidir.
Ardından, ilgili Kubernetes kapsüllerinin dağıtıldığından ve tüm container'ların çalışır durumda olduğundan emin olun:
kubectl get pods -n istio-system
Tüm kapsüller çalışmaya başladıktan sonra 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ı dosyalarının yapılandırmasını ve programlanmasını, hizmet keşfini, sertifika dağıtımını ve yardımcı dosya yerleştirmeyi yönetiringress 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
Artık Istio'nun yüklendiğini ve çalıştığını doğruladınız. ASP.NET Core uygulamasını dağıtabilirsiniz.
Dağıtım ve Hizmet
İlk olarak favori düzenleyicinizi (vim, nano,emacs
veya Cloud Shell'in kod düzenleyicisi) kullanarak bir aspnetcore.yaml
dosyası oluşturun ve uygulamanın 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 standart Dağıtımlar ve Hizmetler'dir ve Istio'ya özgü herhangi 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 Ağ Geçidi ve VirtualService oluşturmanız gerekir.
Ağ geçidi, HTTP/TCP trafiği için bir yük dengeleyici yapılandırır. Bu trafik, genellikle bir uygulamanın giriş trafiğini etkinleştirmek için ağın ucunda çalışır. VirtualService, bir hizmet isteklerinin Istio hizmet ağı içinde nasıl yönlendirildiğini kontrol eden kuralları tanımlar.
Ağ Geçidini tanımlamak için bir 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ğ Geçidi'ni şununla dağıtmak için kubectl komutunu çalıştırı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! Istio'nun etkin olduğu bir uygulamayı az önce dağıttınız. Ardından, kullanılan uygulamayı görürsünüz.
9. Uygulamayı test etme
Sonunda uygulamanın çalıştığını 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 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
kodlu bir 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>
adresine giderek uygulamayı görüntüleyebilirsiniz:
10. Tebrikler!
Google Kubernetes Engine (GKE) üzerinde çalışan Kubernetes'e basit bir ASP.NET Core uygulamasını dağıttınız ve Istio tarafından yönetilecek şekilde yapılandırdınız.
" Istio'nun faydası nedir?" sorusunu merak ediyor olabilirsiniz. Çok güzel bir soru. Şu ana kadar, Istio'nun bu uygulamayı yönetmesinin herhangi bir avantajı yoktur. Laboratuvarın ikinci bölümünde, Istio'nun metrikler, izleme, dinamik trafik yönetimi, hizmet görselleştirme ve hata ekleme gibi özelliklerini daha yakından inceleyeceğiz.
Sonraki Adımlar
- IDFA'yı kullanarak ASP.NET Core uygulamasını GKE'ye 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ı silip Istio'yu kaldırabilir veya yalnızca 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
Isıhmet'i 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 sil
gcloud container clusters delete hello-istio