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şturup container mimarisine aldınız, 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, ilk laboratuvardaki Kubernetes kümenizin ve uygulamanın zaten çalıştığı varsayılır. Istio'nun, hizmetlerinizi minimum kod değişikliğiyle yönetmenize, izlemenize ve güvenli hale getirmenize nasıl yardımcı olabileceğini göreceksiniz. Özellikle metrikler, izleme, hizmet görselleştirme, dinamik trafik yönetimi ve hata yerleştirme gibi Istio özelliklerini keşfedersiniz.

Neler öğreneceksiniz?

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

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

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

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 dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw tıklayın.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Bu sanal makine, ihtiyaç duyacağınız 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`
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. Uygulamayı test etme

Laboratuvara başlamadan önce uygulamanın önceki laboratuvarda çalıştığından emin olun. Hatırlatma: Ağ geçidinin harici IP'sini ve bağlantı noktasını EXTERNAL-IP altında şu şekilde görürsünüz:

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 tüm adımları uyguladığınızdan ve hem uygulamanın hem de Istio'nun doğru şekilde yüklendiğinden ve çalıştığından emin olmak için önceki laboratuvara geri dönün.

Bu noktada "Istio'nun faydası nedir?" diye merak ediyor olabilirsiniz. Istio'nun uygulamanızın trafiğini yönetmesine izin vererek metrikler, izleme, dinamik trafik yönetimi, hizmet görselleştirme ve hata yerleştirme gibi özellikleri ücretsiz olarak kullanabilirsiniz.

Bir sonraki adımda metrikleri keşfetmeye başlayacaksınız.

4. Grafana ve Prometheus ile 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 tıklayıp 8080 bağlantı noktasında önizle'yi seçerek sorgu yürütebilirsiniz:

772a5248aa493025.png

Prometheus kullanıcı arayüzü yeni bir sekmede açılır:

272ee63c1fe0be16.png

Prometheus hakkında daha fazla bilgi edinmek için Prometheus ile Metrikleri Sorgulama başlıklı makaleyi inceleyin.

Grafana

Grafana, metrikleri görselleştirmek için kullanabileceğiniz diğer bir eklentidir.

Grafana'yı yükleyin. istio-version yerine mevcut Istio sürümünüzü (ör. 1.0.3-gke.3) girin:

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 önizlemesini ziyaret ederek Grafana kontrol panellerini görüntüleyebilirsiniz:

806d696d85267a37.png

524cb9f6d66f8655.png

Grafana hakkında daha fazla bilgi edinmek için Visualizing Metrics with Grafana (Grafana ile Metrikleri Görselleştirme) başlıklı makaleyi inceleyin.

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

Üretime dağıttığınız uygulama, bir noktada hata düzeltmeleri veya ek özellikler gerektirecektir. Bu sürecin nasıl göründüğüne bakalım.

Öncelikle uygulamayı değiştirelim. Cloud Shell'den kod düzenleyiciyi açın.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

HelloWorldAspNetCore > Views > Home bölümündeki Index.cshtml seçeneğine 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 

Ş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 kaydedip Cloud Shell'e geri dönün. HelloWorldAspNetCore,Docker görüntüsünü oluşturun:

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

Ve Container Registry'ye aktarın:

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

Container görüntüsünü gönderdikten sonraki adımda yeni sürümü dağıtabilirsiniz.

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

Yeni sürümü dağıtmak için öncelikle Kubernetes'te yeni bir dağıtım oluşturmanız gerekir. aspnetcore.yaml dosyasının sonuna aşağıdakileri 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 ile 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.

Yenilediğinizde bazen "ASP.NET Core ile web uygulamaları oluşturma hakkında bilgi edinin" mesajını görürsünüz:

11d528132dbb6cee.png

Diğer zamanlarda ise "Google Cloud'da ASP.NET Core ile web uygulamaları oluşturma hakkında bilgi edinin" mesajını görürsünüz:

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 oluşturduğunuz VirtualService'in (aspnetcore-virtualservice) bu hizmeti ana makine olarak kullanmasıdır.

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

7. Hizmetinizi yeni sürüme sabitleme

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

DestinationRule, adreslenebilir alt kümeleri (yani ilgili hedef ana makinenin adlandırılmış sürümlerini) de 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

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

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

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

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. Birden fazla kez yenileme yaptıktan sonra bile "Google Cloud'da ASP.NET Core ile web uygulamaları oluşturma hakkında bilgi edinin" mesajını görmeniz gerekir:

3eb0d5be1b4cb40b.png

8. Trafiği sürümler arasında bölme

Bazen, test için trafiği sürümler arasında bölmek isteyebilirsiniz. Örneğin, trafiğin% 75'ini hizmetin v1 sürümüne, %25'ini ise v2 sürümüne göndermek isteyebilirsiniz. Bu işlemi Istio ile kolayca gerçekleştirebilirsiniz. Farklı ağırlıklara sahip iki alt kümeye başvurmak 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

Artık tarayıcıyı yenilediğinizde v1 ve v2 sürümlerinin yaklaşık 3:1 oranında yayınlandığını görmeniz gerekir.

Daha fazla bilgi edinmek için Istio'da trafik bölme başlıklı makaleyi inceleyin.

9. Hata ekleme

Test için yapılması gereken bir diğer yararlı geliştirme görevi de trafiğe hatalar veya gecikmeler ekleyip hizmetlerin buna nasıl yanıt verdiğini görmektir.

Örneğin, v1 sürümüne gelen trafiğin% 50'si için hatalı istek (HTTP 400) yanıtı döndürmek isteyebilirsiniz. Aşağıdakilere uygun bir 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, v1 hizmetinin yarı zamanlı olarak HTTP 400 yanıt kodu döndürdüğünü görmelisiniz.

İsteklere 5 saniyelik bir gecikme eklemek de isteyebilirsiniz. Aşağıdakilere uygun bir 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 geciktiğini görmeniz gerekir.

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 özelliklerine bakın.

10. Tebrikler!

Umarız bu laboratuvar, Istio'nun hizmetleriniz için kutudan çıktığı haliyle neler yapabileceğine dair genel bir bakış sunmuştur. Istio ve GKE hakkında daha fazla bilgi edinmek için.

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

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-dotnet-cluster