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?
Jak oceniasz swoje doświadczenia z Google Cloud Platform?
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- 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ć.
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
.
- 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
- W konsoli Cloud kliknij Aktywuj Cloud Shell .
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:
Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
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.
- 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>
:
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:
W nowej karcie zobaczysz interfejs Prometheus:
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:
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.
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”:
Może też pojawić się komunikat „Dowiedz się więcej o tworzeniu aplikacji internetowych za pomocą ASP.NET Core w Google Cloud”:
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”:
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
- 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.
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