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?
Jak oceniasz korzystanie z Google Cloud Platform?
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- 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ć).
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.
- 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
- W konsoli Cloud kliknij Aktywuj Cloud Shell
.
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:
Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
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.
- 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>:

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:

Interfejs Prometheusa pojawi się na nowej karcie:

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:


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

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

Dzieje się tak, ponieważ wdrożenia v1 i v2 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”:

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
- Dowiedz się więcej o Istio.
- Dowiedz się więcej o Kubernetes.
- Dowiedz się więcej o Google Kubernetes Engine.
- Dowiedz się więcej o .NET w Google Cloud Platform.
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