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

1. Genel Bakış

Laboratuvarın ilk bölümünde bir ASP.NET Core uygulaması oluşturdunuz, container mimarisine alınmış, bu uygulamayı Google Kubernetes Engine'e (GKE) dağıttınız ve trafiğini Istio tarafından yönetilecek şekilde yapılandırdınız.

Laboratuvarın bu ikinci bölümünde, Kubernetes kümenizin ve ilk laboratuvardaki uygulamanın çalıştırıldığınız varsayılır. Istio'nun minimum kod değişikliğiyle hizmetlerinizi yönetmenize, izlemenize ve güvenli hale getirmenize nasıl yardımcı olabileceğini göreceksiniz. Spesifik olarak metrikler, izleme, hizmet görselleştirme, dinamik trafik yönetimi, hata ekleme gibi Istio'nun özelliklerini keşfedeceksiniz.

Neler öğreneceksiniz?

  • Prometheus ile metrikleri sorgulama.
  • Grafana ile metrikleri görselleştirme.
  • Hizmetinizin yeni bir sürümünü oluşturma.
  • Bir hizmet belirli bir sürüme nasıl sabitlenir?
  • Trafiği farklı sürümler arasında bölme.
  • Hizmet çağrılarına hata ekleme.

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 Gereksinimler

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 G Suite hesabınız yoksa hesap oluşturmanız gerekir.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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ı ücretsiz deneme programından 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 dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw simgesini tıklayın.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Cloud Shell'i daha önce hiç çalıştırmadı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:

Z

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 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`
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. Uygulamayı test etme

Laboratuvara başlamadan önce uygulamanın önceki laboratuvarda çalışan bir uygulama olduğundan emin olun. EXTERNAL-IP altında listelenen harici IP'yi ve ağ geçidinin bağlantı noktasını aşağıdaki şekilde göreceğinizi hatırlatmak isteriz:

kubectl get svc istio-ingressgateway -n istio-system

Uygulamayı görüntülemek için tarayıcınızı açıp http://<gatewayurl> adresine gidebilirsiniz:

f579a9baedc108a9.png

Uygulamayı görmüyorsanız önceki laboratuvara geri dönüp tüm adımları uyguladığınızdan ve hem uygulamanın hem de Istio'nun düzgün bir şekilde yüklendiğinden ve çalıştığından emin olun.

Bu noktada, "Istismar'ın faydası nedir?" sorusunu merak ediyor olabilirsiniz. Istio'nun uygulamanızın trafiğini yönetmesine izin vererek metrikler, izleme, dinamik trafik yönetimi, hizmet görselleştirme, hata ekleme ve daha birçok özelliği ücretsiz olarak kullanabilirsiniz.

Sonraki adımda metrikleri inceleyerek başlayacaksınız.

4. Grafana ve Prometheus ile ilgili metrikler

Istio, varsayılan olarak bazı metrikler oluşturur. Bu varsayılan metrikleri sorgulamak ve görselleştirmek için eklentileri kullanabilirsiniz.

Prometheus

Prometheus, açık kaynaklı bir izleme çözümüdür. Istio tarafından oluşturulan metrikleri sorgulamak için Prometheus'u kullanabilirsiniz, ancak önce Prometheus eklentisini yüklemeniz gerekir.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml

Prometheus'un çalıştığını doğrulayın:

kubectl get svc prometheus -n istio-system

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
prometheus   ClusterIP   10.31.243.62   <none>        9090/TCP   1d

http://<gatewayurl> adresini birkaç kez ziyaret ederek veya curl komutunu çalıştırarak uygulamaya biraz trafik gönderin.

Prometheus kullanıcı arayüzü için bağlantı noktası yönlendirmeyi ayarlayın:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090

Artık Cloud Shell'in sağ üst köşesindeki Web Önizlemesi düğmesini ve 8080 bağlantı noktasında önizle'yi tıklayarak sorguyu yürütebilirsiniz:

772a5248aa493025.png

Prometheus kullanıcı arayüzünü yeni bir sekmede görürsünüz:

272ee63c1fe0be16.png

Prometheus hakkında daha fazla bilgi edinmek için Querying Metrics with Prometheus (Prometheus ile Metrikleri Sorgulama) bölümünü inceleyin.

Grafana

Grafana, metrikleri görselleştirmeye yönelik başka bir eklentidir.

Grafana'yı yükleyin. istio-version öğesini mevcut Istio sürümünüzle değiştirin (örneğin, 1.0.3-gke.3):

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml

Grafana'nın çalıştığını doğrulayın:

kubectl get svc grafana -n istio-system

NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
grafana   ClusterIP   10.31.248.230   <none>        3000/TCP   1d

http://<gatewayurl> adresini birkaç kez ziyaret ederek veya curl komutunu çalıştırarak uygulamaya biraz trafik gönderin.

Grafana kullanıcı arayüzü için bağlantı noktası yönlendirmeyi ayarlayın:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000

Web Önizlemesi'ni ziyaret ederek Grafana kontrol panellerini görüntüleyebilirsiniz:

806d696d85267a37.png

524cb9f6d66f8655.png

Granfana hakkında daha fazla bilgi edinmek için Grafana ile Metrikleri Görselleştirme bölümünü inceleyin.

5. Uygulamanın yeni bir sürümünü oluştur

Bir noktada, üretime dağıttığınız uygulama için hata düzeltmeleri veya ek özellikler gerekecek. Şimdi bu sürecin nasıl olduğuna bakalım.

İlk olarak uygulamayı değiştirelim. Cloud Shell'den kod düzenleyiciyi açın.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

HelloWorldAspNetCore > Views > Home altında Index.cshtml bölümüne gidin ve bant mesajlarından birini güncelleyin.

Aşağıdaki satırı bulun:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core 

Ardından şu şekilde değiştirin:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud

Değişiklikleri kaydedin ve Cloud Shell'e geri dönün. Docker HelloWorldAspNetCore, görüntüsünün içinde:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 . 

Ardından Container Registry'ye aktarın:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 

Container görüntüsünü aktardıktan sonra yeni sürümü bir sonraki adımda dağıtabilirsiniz.

6. Yeni dağıtımı oluşturma

Yeni sürümü dağıtmak için önce Kubernetes'te yeni bir dağıtım oluşturmanız gerekir. aspnetcore.yaml dosyasının sonuna aşağıdakini ekleyin:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: aspnetcore-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: aspnetcore
      version: v2
  template:
    metadata:
      labels:
        app: aspnetcore
        version: v2
    spec:
      containers:
      - name: aspnetcore
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Yeni sürümü kubectl kullanarak varsayılan ad alanına dağıtın:

kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged
deployment.extensions "aspnetcore-v1" unchanged
deployment.extensions "aspnetcore-v2" created

Beklenen 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
aspnetcore-v2-5d765db-l9xmg   2/2       Running   0          1m

Şimdi uygulamayı tekrar test edin. Ağ geçidinin harici IP'sini alın:

kubectl get svc istio-ingressgateway -n istio-system

EXTERNAL-IP altında listelenir. Gizli bir tarayıcı açıp http://<replace-with-external-ip> adresini ziyaret edin

Bazen yenileme yaptığınızda "ASP.NET Core ile Web uygulamaları oluşturma hakkında bilgi edinin" mesajını görürsünüz:

11d528132dbb6cee.png

Bazı durumlarda ise "Google Cloud'da ASP.NET Core ile web uygulamaları oluşturma hakkında bilgi edinin" mesajı gösterilir:

3eb0d5be1b4cb40b.png

Bunun nedeni, hem v1 hem de v2 dağıtımlarının aynı Kubernetes hizmetinin (aspnetcore-service) arkasında kullanıma sunulması ve önceki laboratuvarda (aspnetcore-virtualservice) oluşturduğunuz VirtualService'in bu hizmeti ana makine olarak kullanmasıdır.

Sonraki adımda, bir DestinationRule kullanarak hizmeti v2 dağıtımına sabitleyeceksiniz.

7. Hizmetinizi yeni sürüme sabitleyin

Bu adımda, hizmetinizi v2 dağıtımını kullanacak şekilde sabitlersiniz ve bunu bir DestinationRule ile yapabilirsiniz. TargetRule, bir VirtualService yönlendirme işlemi gerçekleştikten sonra isteğe uygulanacak politika grubunu yapılandırır.

TargetRule, karşılık gelen hedef ana makinenin adreslenebilir alt kümelerini (adlandırılmış sürümleri) da tanımlar. Bu alt kümeler, hizmetin belirli sürümlerine trafik gönderirken VirtualService rota spesifikasyonlarında kullanılır.

aspnetcore-destinationrule.yaml adlı yeni bir dosya oluşturun:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: aspnetcore-destinationrule
spec:
  host: aspnetcore-service
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Sonra, DestinationRule'u oluşturun. Bu işlem, VirtualService'ten kullanabileceğiniz iki alt küme oluşturur (v1 ve v2):

kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created

Şimdi, aspnetcore-virtualservice.yaml dosyasına geri dönüp VirtualService'i v2 alt kümesini kullanacak şekilde güncelleyin:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - route:
    - destination:
        host: aspnetcore-service
        subset: v2

VirtualService'i güncelleyin:

kubectl apply -f aspnetcore-virtualservice.yaml

Tarayıcınızı açıp http://<replace-with-external-ip>. adresini ziyaret edin. Birçok yenileme yapıldıktan sonra bile "Google Cloud'da ASP.NET Core ile Web uygulamaları oluşturma hakkında bilgi edinin" mesajı gösterilir:

3eb0d5be1b4cb40b.png

8. Sürümler arasında trafiği bölme

Bazen, test için trafiği sürümler arasında bölmek isteyebilirsiniz. Örneğin, trafiğin% 75'ini v1'e, %25'ini ise hizmetin v2 sürümüne göndermek isteyebilirsiniz. Bunu Istio ile kolayca yapabilirsiniz. Farklı ağırlıklara sahip iki alt kümeye başvuruda bulunmak için yeni bir aspnetcore-virtualservice-weights.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
        subset: v1
      weight: 75
    - destination:
        host: aspnetcore-service
        subset: v2
      weight: 25

VirtualService'i güncelleyin:

kubectl apply -f aspnetcore-virtualservice-weights.yaml

Şimdi, tarayıcıyı yenilediğinizde, v1 ve v2 sürümlerinin yaklaşık 3:1 oranında sunulduğunu göreceksiniz.

Daha fazla bilgi edinmek için isteme'de trafiği bölme bölümünü inceleyin.

9. Hata ekleme

Test için yapılacak bir diğer faydalı geliştirme görevi de trafiğe hata veya gecikme eklemek ve hizmetlerin bunlara karşılık nasıl davrandığını görmektir.

Örneğin, v1 sürümüne gelen trafiğin% 50'si için hatalı bir istek (HTTP 400) yanıtı döndürmek isteyebilirsiniz. Aşağıdakilerle eşleşecek aspnetcore-virtualservice-fault-abort.yaml dosyası oluşturun:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - fault:
      abort:
        percentage:
          value: 50
        httpStatus: 400
    route:
    - destination:
        host: aspnetcore-service
        subset: v1

VirtualService'i güncelleyin:

kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml

Artık tarayıcıyı yenilediğinizde, zamanın yarısında v1 hizmetinin HTTP 400s yanıt kodu döndürdüğünü göreceksiniz.

Ya da isteklere 5 saniyelik gecikme eklemek isteyebilirsiniz. Aşağıdakilerle eşleşecek aspnetcore-virtualservice-fault-delay.yaml dosyası oluşturun:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - fault:
      delay:
        fixedDelay: 5s
        percentage:
          value: 100
    route:
    - destination:
        host: aspnetcore-service
        subset: v1

VirtualService'i güncelleyin:

kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml

Artık tarayıcıyı yenilediğinizde isteklerin 5 saniye gecikmeli olduğunu göreceksiniz.

Zaman aşımları, yeniden denemeler, koşullu kurallar ve devre kesiciler gibi Istio özellikleri hakkında daha fazla bilgi edinmek için trafik yönetimi özelliklerini inceleyin.

10. Tebrikler!

Bu laboratuvarın, hizmetleriniz için kullanıma hazır şekilde neler yapabileceğine dair genel bir bakış sunacağını umuyoruz. Istio ve GKE hakkında daha fazla bilgi edinin.

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

Uygulamayı silip Istio'yu kaldırabilir veya 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-destinationrule.yaml
kubectl delete -f aspnetcore.yaml

Uygulamanın kaldırıldığını onaylamak için:

kubectl get gateway 
kubectl get virtualservices
kubectl get destinationrule
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-dotnet-cluster