Wdrażanie aplikacji ASP.NET Core w Google Kubernetes Engine za pomocą Istio (część 2)

1. Omówienie

W pierwszej części modułu udało Ci się utworzyć aplikację ASP.NET Core, skonteneryzować ją i wdrożyć w Google Kubernetes Engine (GKE) oraz skonfigurować zarządzanie jej ruchem przez Istio.

W drugiej części modułu zakładamy, że masz już uruchomiony klaster Kubernetes oraz aplikację z pierwszego modułu. Przekonasz się, jak Istio może pomóc w zarządzaniu usługami oraz ich monitorowaniu i zabezpieczaniu przy użyciu minimalnych zmian w kodzie. Omówimy w szczególności funkcje Istio, takie jak wskaźniki, śledzenie, wizualizacja usług, dynamiczne zarządzanie ruchem, wstrzykiwanie błędów i inne.

Czego się nauczysz

  • Jak tworzyć zapytania dotyczące wskaźników za pomocą Prometheus.
  • Jak wizualizować wskaźniki za pomocą narzędzia Grafana.
  • Jak utworzyć nową wersję usługi.
  • Jak przypiąć usługę do określonej wersji.
  • Jak podzielić ruch między różne wersje.
  • Jak wstrzykiwać błędy w wywołaniach usługi.

Czego potrzebujesz

Jak wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenia z Google Cloud Platform?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć.

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w Codelabs będzie ona określana jako PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.

Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można zarządzać zdalnie z laptopa, ale w tym ćwiczeniu z programowania wykorzystasz Google Cloud Shell – środowisko wiersza poleceń działające w Google Cloud.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Jeśli dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_GcMujns

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość czynności z tego ćwiczenia z programowania można wykonać w przeglądarce lub na Chromebooku.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Testowanie aplikacji

Przed rozpoczęciem modułu sprawdź, czy aplikacja nadal działa z poprzedniego modułu. Dla przypomnienia zewnętrzny adres IP i port bramy są wymienione w sekcji EXTERNAL-IP:

kubectl get svc istio-ingressgateway -n istio-system

Aby wyświetlić aplikację, możesz otworzyć przeglądarkę i przejść do strony http://<gatewayurl>:

f579a9baedc108a9.png

Jeśli nie widzisz aplikacji, wróć do poprzedniego modułu, aby sprawdzić, czy wszystkie kroki zostały wykonane, a aplikacja i Istio zostały zainstalowane i działają prawidłowo.

Możesz się teraz zastanawiać, jakie korzyści daje Istio. Jeśli pozwolisz firmie Istio zarządzać ruchem w aplikacji, uzyskasz bezpłatne funkcje takie jak wskaźniki, śledzenie, dynamiczne zarządzanie ruchem, wizualizacja usług czy wstrzykiwanie błędów.

W następnym kroku zaczniesz od eksploracji danych.

4. Wskaźniki wykorzystujące rozwiązania Grafana i Prometheus

Domyślnie Istio generuje niektóre wskaźniki. Za pomocą dodatków możesz tworzyć zapytania i wizualizować te domyślne dane.

Prometheus

Prometheus to rozwiązanie do monitorowania typu open source. Za pomocą Prometheus możesz wykonywać zapytania o wskaźniki wygenerowane przez Istio, ale najpierw musisz zainstalować dodatek Prometheus.

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

Sprawdź, czy usługa Prometheus jest uruchomiona:

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

Wyślij trochę ruchu do aplikacji, otwierając kilka razy stronę http://<gatewayurl> lub uruchamiając polecenie curl.

Skonfiguruj przekierowanie portów dla interfejsu użytkownika Prometheus:

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

Możesz teraz wykonać zapytanie, klikając przycisk Podgląd w przeglądarce w prawym górnym rogu Cloud Shell, a następnie Podejrzyj na porcie 8080:

772a5248aa493025.png

W nowej karcie zobaczysz interfejs Prometheus:

272ee63c1fe0be16.png

Więcej informacji o usłudze Prometheus znajdziesz w artykule Wykonywanie zapytań o wskaźniki za pomocą Prometheus.

Grafana

Grafana to kolejny dodatek do wizualizacji danych.

Zainstaluj Grafana. Zastąp istio-version bieżącą wersją Istio, na przykład 1.0.3-gke.3:

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

Sprawdź, czy Grafana jest uruchomiona:

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

Wyślij trochę ruchu do aplikacji, otwierając kilka razy stronę http://<gatewayurl> lub uruchamiając polecenie curl.

Skonfiguruj przekierowanie portów dla interfejsu użytkownika Grafana:

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

Panele Grafana możesz wyświetlać w podglądzie w przeglądarce:

806d696d85267a37.png

524cb9f6d66f8655.png

Więcej informacji o Granfana znajdziesz w artykule Wizualizacja wskaźników za pomocą Grafany.

5. Tworzenie nowej wersji aplikacji

Aplikacja wdrożona w wersji produkcyjnej będzie czasami wymagała poprawek błędów lub dodatkowych funkcji. Zobaczmy, jak wygląda ten proces.

Najpierw zmodyfikujmy aplikację. Otwórz edytor kodu z Cloud Shell.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

Przejdź do Index.cshtml pod adresem HelloWorldAspNetCore > Views > Home i zaktualizuj jeden z wiadomości karuzeli.

Znajdź ten wiersz:

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

I zmień go na taki:

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

Zapisz zmiany i wróć do Cloud Shell. Wewnątrz HelloWorldAspNetCore,utwórz obraz Dockera:

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

Potem wypchnij go do Container Registry:

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

Po przekazaniu obrazu kontenera możesz wdrożyć nową wersję w następnym kroku.

6. Utwórz nowe wdrożenie

Aby wdrożyć nową wersję, musisz najpierw utworzyć dla niej nowe wdrożenie w Kubernetes. Na końcu pliku aspnetcore.yaml dodaj:

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

Wdróż nową wersję w domyślnej przestrzeni nazw za pomocą kubectl:

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

Sprawdź, czy oczekiwane pody są uruchomione:

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

Teraz ponownie przetestuj aplikację. Uzyskaj zewnętrzny adres IP bramy:

kubectl get svc istio-ingressgateway -n istio-system

Jest on podany w sekcji EXTERNAL-IP. Otwórz przeglądarkę incognito i wejdź na http://<replace-with-external-ip>

Czasami po odświeżeniu strony może wyświetlić się komunikat „Więcej informacji o tworzeniu aplikacji internetowych za pomocą ASP.NET Core”:

11d528132dbb6cee.png

Może też pojawić się komunikat „Dowiedz się więcej o tworzeniu aplikacji internetowych za pomocą ASP.NET Core w Google Cloud”:

3eb0d5be1b4cb40b

Dzieje się tak, ponieważ wdrożenia v1 i v2 są udostępniane w ramach tej samej usługi Kubernetes (aspnetcore-service), a usługa VirtualService utworzona w poprzednim module (aspnetcore-virtualservice) używa tej usługi jako hosta.

W następnym kroku przypniesz usługę do wdrożenia v2 za pomocą DestinationRule.

7. Przypnij swoją usługę do nowej wersji

W tym kroku przypniesz swoją usługę do wdrożenia v2. Możesz to zrobić za pomocą DestinationRule. Reguła docelowa konfiguruje zbiór zasad, które mają być stosowane do żądania po wykonaniu operacji routingu usługi VirtualService.

Reguła docelowa określa też możliwe do adresu podzbiory, czyli nazwane wersje, odpowiedniego hosta docelowego. Te podzbiory są używane w specyfikacjach tras usługi VirtualService podczas wysyłania ruchu do określonych wersji usługi.

Utwórz nowy plik o nazwie aspnetcore-destinationrule.yaml:

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

Następnie utwórz regułę docelową. Spowoduje to utworzenie 2 podzbiorów (v1 i v2), których możesz używać z usługi VirtualService:

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

Teraz wróć do pliku aspnetcore-virtualservice.yaml, aby zaktualizować usługę VirtualService tak, aby używała podzbioru v2:

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

Zaktualizuj usługę VirtualService:

kubectl apply -f aspnetcore-virtualservice.yaml

Otwórz przeglądarkę i odwiedź stronę http://<replace-with-external-ip>. Nawet po wielu odświeżeniach powinien pojawić się komunikat „Dowiedz się więcej o tworzeniu aplikacji internetowych za pomocą ASP.NET Core w Google Cloud”:

3eb0d5be1b4cb40b

8. Podziel ruch między wersje

Czasami może być konieczne rozdzielenie ruchu między wersje na potrzeby testów. Możesz na przykład wysyłać 75% ruchu do wersji v1 i 25% ruchu do wersji 2. Możesz to łatwo osiągnąć dzięki Istio. Utwórz nowy plik aspnetcore-virtualservice-weights.yaml, aby odwołać się do 2 podzbiorów o różnej wadze:

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

Zaktualizuj usługę VirtualService:

kubectl apply -f aspnetcore-virtualservice-weights.yaml

Teraz po odświeżeniu przeglądarki powinny być widoczne wersje v1 i v2 wyświetlane ze współczynnikiem około 3:1.

Więcej informacji znajdziesz w artykule o dzieleniu ruchu w Istio.

9. Błędy wstrzykiwania

Innym przydatnym zadaniem programistycznym do testowania jest wstrzykiwanie błędów lub opóźnień w ruchu i obserwowanie, jak usługi reagują na nie.

Możesz na przykład chcieć zwracać nieprawidłową odpowiedź na żądanie (HTTP 400) w przypadku 50% ruchu w wersji 1. Utwórz aspnetcore-virtualservice-fault-abort.yaml plik pasujący do tych elementów:

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

Zaktualizuj usługę VirtualService:

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

Teraz po odświeżeniu przeglądarki powinno być widać, że w połowie przypadków usługa w wersji 1 zwraca kod odpowiedzi HTTP 400s.

A może chcesz dodać do żądań 5-sekundowe opóźnienie? Utwórz aspnetcore-virtualservice-fault-delay.yaml plik pasujący do tych elementów:

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

Zaktualizuj usługę VirtualService:

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

Teraz po odświeżeniu przeglądarki powinna być widoczna informacja o opóźnieniu żądań o 5 sekund.

Więcej informacji o funkcjach Istio, takich jak czasy oczekiwania, ponawianie prób, reguły warunkowe, wyłączniki obwodu i inne, znajdziesz w artykule o funkcjach zarządzania ruchem.

10. Gratulacje!

Mamy nadzieję, że dzięki temu modułowi od razu dowiesz się, jak Istio może zaoferować Ci usługi. Aby dowiedzieć się więcej o Istio i GKE.

Następne kroki

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.

11. Czyszczenie

Możesz usunąć aplikację i odinstalować Istio lub po prostu usunąć klaster Kubernetes.

Usuwanie aplikacji

Aby usunąć aplikację:

kubectl delete -f aspnetcore-gateway.yaml
kubectl delete -f aspnetcore-virtualservice.yaml
kubectl delete -f aspnetcore-destinationrule.yaml
kubectl delete -f aspnetcore.yaml

Aby potwierdzić, że aplikacja zniknęła:

kubectl get gateway 
kubectl get virtualservices
kubectl get destinationrule
kubectl get pods

Odinstalowywanie Istio

Aby usunąć Istio:

kubectl delete -f install/kubernetes/istio-demo-auth.yaml

Aby potwierdzić, że Istio już nie istnieje:

kubectl get pods -n istio-system

Usuwanie klastra Kubernetes

gcloud container clusters delete hello-dotnet-cluster