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?
Google Cloud Platform deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- 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.)
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.
- 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
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
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:
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
İ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.
- 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:
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:
Prometheus kullanıcı arayüzünü yeni bir sekmede görürsünüz:
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:
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.
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:
Bazı durumlarda ise "Google Cloud'da ASP.NET Core ile web uygulamaları oluşturma hakkında bilgi edinin" mesajı gösterilir:
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:
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
- 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ı 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