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?
Google Cloud Platform deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- 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.)
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.
- 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
- Cloud Console'da Cloud Shell'i etkinleştir 'i
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ı) 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:
Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.
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.
- 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:

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:

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

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:


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

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:

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:

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