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

1. Przegląd

W pierwszej części tego modułu utworzyliśmy aplikację ASP.NET Core, skonteneryzowaliśmy ją i wdrożyliśmy w Google Kubernetes Engine (GKE) oraz skonfigurowaliśmy zarządzanie ruchem przez Istio.

W tej drugiej części modułu zakłada się, że masz już klaster Kubernetes i aplikację z pierwszego modułu. Dowiesz się, jak Istio może pomóc w zarządzaniu usługami, ich monitorowaniu i zabezpieczaniu przy minimalnych zmianach w kodzie. Poznasz w nim funkcje Istio, takie jak pomiary, śledzenie, wizualizacja usług, dynamiczne zarządzanie ruchem, wstrzykiwanie błędów i inne.

Czego się nauczysz

  • Jak wysyłać zapytania o dane za pomocą Prometheusa.
  • Jak wizualizować dane za pomocą platformy Grafana
  • Jak utworzyć nową wersję usługi.
  • Jak przypiąć usługę do określonej wersji.
  • Jak dzielić ruch między różne wersje.
  • Jak wstrzykiwać błędy w wywołaniach usług.

Czego potrzebujesz

Jak zamierzasz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz korzystanie z Google Cloud Platform?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. (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, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.

  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów Google Cloud.

Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Wykonaj instrukcje z sekcji „Czyszczenie”, w której znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud możesz korzystać zdalnie na laptopie, ale w tym module użyjesz Google Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud.

Aktywowanie Cloud Shell

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

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni (część strony widoczna po przewinięciu) z opisem tego środowiska. W takim przypadku kliknij Dalej, a ten ekran nie będzie się już wyświetlać. Ten wyświetlany jednorazowo ekran wygląda tak:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce lub na Chromebooku.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik 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

Wynik polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Testowanie aplikacji

Zanim rozpoczniesz ten moduł, upewnij się, że aplikacja z poprzedniego modułu nadal działa. Przypominamy, że zewnętrzny adres IP i port bramy, które są wymienione w sekcji EXTERNAL-IP, możesz sprawdzić w ten sposób:

kubectl get svc istio-ingressgateway -n istio-system

Aby wyświetlić aplikację, otwórz przeglądarkę i przejdź na stronę http://<gatewayurl>:

f579a9baedc108a9.png

Jeśli nie widzisz aplikacji, wróć do poprzedniego ćwiczenia, aby upewnić się, że wszystkie kroki zostały wykonane, a aplikacja i Istio są zainstalowane i działają prawidłowo.

W tym momencie możesz się zastanawiać, jakie korzyści przynosi Istio. Pozwalając Istio zarządzać ruchem aplikacji, zyskujesz bezpłatnie funkcje takie jak pomiary, śledzenie, dynamiczne zarządzanie ruchem, wizualizacja usług, wstrzykiwanie błędów i inne.

W następnym kroku zaczniesz analizować dane.

4. Dane z Grafany i Prometheus

Domyślnie Istio generuje niektóre dane. Za pomocą dodatków możesz wysyłać zapytania dotyczące tych domyślnych danych i je wizualizować.

Prometheus

Prometheus to rozwiązanie do monitorowania typu open source. Za pomocą Prometheus możesz wysyłać zapytania o wskaźniki generowane 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 Prometheus jest uruchomiony:

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 do aplikacji trochę ruchu, odwiedzając stronę http://<gatewayurl> kilka razy lub uruchamiając polecenie curl.

Skonfiguruj przekierowanie portów dla interfejsu Prometheusa:

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

Aby wykonać zapytanie, kliknij przycisk Podgląd w przeglądarce w prawym górnym rogu Cloud Shell i kliknij Podejrzyj na porcie 8080:

772a5248aa493025.png

Interfejs Prometheusa pojawi się na nowej karcie:

272ee63c1fe0be16.png

Więcej informacji o Prometheus znajdziesz w artykule Wykonywanie zapytań o dane za pomocą Prometheus.

Grafana

Grafana to kolejny dodatek do wizualizacji danych.

Zainstaluj Grafanę. Zastąp istio-version bieżącą wersją Istio, np. 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 do aplikacji trochę ruchu, odwiedzając stronę http://<gatewayurl> kilka razy lub uruchamiając polecenie curl.

Skonfiguruj przekierowanie portów dla interfejsu 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świetlić, otwierając podgląd w przeglądarce:

806d696d85267a37.png

524cb9f6d66f8655.png

Więcej informacji o Grafanie znajdziesz w artykule Visualizing Metrics with Grafana (Wizualizacja danych za pomocą Grafany).

5. Tworzenie nowej wersji aplikacji

W pewnym momencie aplikacja wdrożona w środowisku produkcyjnym będzie wymagać poprawek lub dodatkowych funkcji. Zobaczmy, jak wygląda ten proces.

Najpierw zmodyfikujemy aplikację. Otwórz edytor kodu w Cloud Shell.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

W sekcji HelloWorldAspNetCore > Views > Home kliknij Index.cshtml i zaktualizuj jedną z wiadomości w karuzeli.

Znajdź ten wiersz:

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

Zmień go na:

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. W HelloWorldAspNetCore, skompiluj obraz Dockera:

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

i przekazać do Container Registry:

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

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

6. Tworzenie nowego wdrożenia

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

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

Znajduje się on w sekcji ZEWNĘTRZNY ADRES IP. Otwórz przeglądarkę w trybie incognito i wejdź na stronę http://<replace-with-external-ip>.

Po odświeżeniu czasami zobaczysz komunikat „Learn about building Web apps with ASP.NET Core” (Dowiedz się więcej o tworzeniu aplikacji internetowych za pomocą ASP.NET Core):

11d528132dbb6cee.png

Czasami zobaczysz komunikat „Dowiedz się, jak tworzyć aplikacje internetowe za pomocą ASP.NET Core w Google Cloud”:

3eb0d5be1b4cb40b.png

Dzieje się tak, ponieważ wdrożenia v1v2 są udostępniane za tą samą usługą Kubernetes (aspnetcore-service), a utworzona w poprzednim module usługa VirtualService (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 usługę do nowej wersji

W tym kroku przypinasz usługę, aby korzystała z wdrożenia v2. Możesz to zrobić za pomocą elementu DestinationRule. DestinationRule konfiguruje zestaw zasad, które mają być stosowane do żądania po wykonaniu operacji routingu VirtualService.

Reguła DestinationRule definiuje też adresowalne podzbiory, czyli nazwane wersje, odpowiedniego hosta docelowego. Te podzbiory są używane w specyfikacjach tras 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 DestinationRule. Spowoduje to utworzenie 2 podzbiorów (v1 i v2), których możesz używać w usłudze VirtualService:

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

Teraz wróć do pliku aspnetcore-virtualservice.yaml, aby zaktualizować VirtualService i używać 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 VirtualService:

kubectl apply -f aspnetcore-virtualservice.yaml

Otwórz przeglądarkę i przejdź na stronę http://<replace-with-external-ip>.. Nawet po wielokrotnym odświeżeniu powinna się wyświetlić wiadomość „Dowiedz się, jak tworzyć aplikacje internetowe za pomocą ASP.NET Core w Google Cloud”:

3eb0d5be1b4cb40b.png

8. Dzielenie ruchu między wersje

Czasami możesz chcieć podzielić ruch między wersje na potrzeby testów. Możesz na przykład wysyłać 75% ruchu do wersji 1 usługi, a 25% – do wersji 2. Możesz to łatwo osiągnąć za pomocą Istio. Utwórz nowy plik aspnetcore-virtualservice-weights.yaml, aby odwoływać się do 2 podzbiorów o różnych wagach:

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

kubectl apply -f aspnetcore-virtualservice-weights.yaml

Teraz po odświeżeniu przeglądarki powinny być widoczne wersje v1 i v2 wyświetlane w przybliżeniu w stosunku 3:1.

Więcej informacji znajdziesz w artykule Podział ruchu w Istio.

9. Wstrzykiwanie błędów

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

Możesz na przykład zwracać odpowiedź z błędem (HTTP 400) w przypadku 50% ruchu kierowanego do wersji 1. Utwórz plik aspnetcore-virtualservice-fault-abort.yaml o następującej zawartości:

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

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

Teraz, gdy odświeżysz przeglądarkę, zobaczysz, że w połowie przypadków usługa v1 zwraca kod odpowiedzi HTTP 400.

Możesz też dodać do żądań 5-sekundowe opóźnienie. Utwórz plik aspnetcore-virtualservice-fault-delay.yaml o następującej zawartości:

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

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

Teraz po odświeżeniu przeglądarki zobaczysz, że żądania są opóźnione o 5 sekund.

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

10. Gratulacje!

Mam nadzieję, że to laboratorium dało Ci przegląd tego, co Istio może zrobić dla Twoich usług od razu po zainstalowaniu. Więcej informacji 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.

Usuń aplikację

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 została usunięta:

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 zostało usunięte:

kubectl get pods -n istio-system

Usuwanie klastra Kubernetes

gcloud container clusters delete hello-dotnet-cluster