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

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

Google Cloud Platform deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Kurulum ve şartlar

Yönlendirmesiz ortam kurulumu

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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.

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

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 4292cbf4971c9786.png 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ı) 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:

70f315d7b402b476.png

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

fbe3a0674c982259.png

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.

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

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

Screenshot from 2015-11-03 17:20:22.png

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

f579a9baedc108a9.png

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.

73558f3a54ce1c0c.png

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.

e46fd9c6ee82bcc4.png

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:

f579a9baedc108a9.png

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

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