ASP.NET Core uygulamasını Istio ile Google Kubernetes Engine'e dağıtma (1. Bölüm)

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?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Google Cloud Platform deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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.

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

  1. Cloud Console'da, Cloud Shell'i etkinleştir 4292cbf4971c9786.png simgesini tıklayın.

bce75f34b2c53987.png

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:

70f315d7b402b476.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

fbe3a0674c982259.png

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

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

Capture.PNG

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

f579a9baedc108a9.png

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 :

Ekran görüntüsü: 2015-11-03 17:20:22.png

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

f579a9baedc108a9.png

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.

73558f3a54ce1c0c.png

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.

e46fd9c6ee82bcc4.png

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

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:

f579a9baedc108a9.png

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

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