1. Omówienie
ASP.NET Core to wieloplatformowa platforma open source umożliwiająca tworzenie nowoczesnych aplikacji działających w chmurze i połączonych z internetem przy użyciu języka programowania C#.
Kubernetes to system open source do automatyzacji wdrażania i skalowania skonteneryzowanych aplikacji oraz zarządzania nimi. Istio to otwarta platforma do łączenia, zabezpieczania i monitorowania usług oraz zarządzania nimi.
W pierwszej części modułu wdrożysz prostą aplikację ASP.NET Core w Kubernetes działającej w Google Kubernetes Engine (GKE) i skonfigurujesz jej zarządzanie przez Istio.
W drugiej części modułu lepiej poznasz funkcje Istio, takie jak wskaźniki, śledzenie, dynamiczne zarządzanie ruchem czy wstrzykiwanie błędów.
Czego się nauczysz
- Jak utworzyć i spakować prostą aplikację ASP.NET Core w kontenerze Dockera.
- Jak utworzyć klaster Kubernetes w Google Kubernetes Engine (GKE).
- Jak zainstalować Istio w klastrze Kubernetes w GKE.
- Jak wdrożyć aplikację ASP.NET Core i skonfigurować jej ruch tak, aby był zarządzany przez Istio.
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 ani Google Workspace, 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`
- Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
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. Tworzenie aplikacji ASP.NET Core w Cloud Shell
Aby sprawdzić, czy narzędzie wiersza poleceń dotnet jest zainstalowane w wierszu poleceń Cloud Shell, sprawdź jego wersję. Powinna wyświetlić się wersja zainstalowanego narzędzia wiersza poleceń dotnet:
dotnet --version
Następnie utwórz nowy szkielet aplikacji internetowej ASP.NET Core.
dotnet new mvc -o HelloWorldAspNetCore
Powinno to utworzyć projekt i przywrócić jego zależności. Wyświetli się komunikat podobny do tego poniżej.
Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.
Restore succeeded.
4. Uruchamianie aplikacji ASP.NET Core
Jesteśmy prawie gotowi do uruchomienia naszej aplikacji. Przejdź do folderu aplikacji.
cd HelloWorldAspNetCore
Na koniec uruchom aplikację.
dotnet run --urls=http://localhost:8080
Aplikacja zaczyna nasłuchiwać na porcie 8080.
Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.
Aby sprawdzić, czy aplikacja jest uruchomiona, w prawym górnym rogu kliknij przycisk podglądu w przeglądarce i wybierz „Podejrzyj na porcie 8080”.
Zobaczysz domyślną stronę internetową ASP.NET Core:
Po sprawdzeniu, czy aplikacja działa, naciśnij Ctrl+C, aby ją wyłączyć.
5. Pakowanie aplikacji ASP.NET Core do kontenera Dockera
Następnie przygotuj aplikację do uruchomienia jako kontenera. Pierwszym krokiem jest zdefiniowanie kontenera i jego zawartości.
W katalogu podstawowym aplikacji utwórz Dockerfile
, aby zdefiniować obraz Dockera.
touch Dockerfile
Dodaj do Dockerfile
ten kod za pomocą swojego ulubionego edytora (vim,
nano,emacs
lub edytora kodu Cloud Shell).
# Use Microsoft's official build .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-sdk/ FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build WORKDIR /app # Install production dependencies. # Copy csproj and restore as distinct layers. COPY *.csproj ./ RUN dotnet restore # Copy local code to the container image. COPY . ./ WORKDIR /app # Build a release artifact. RUN dotnet publish -c Release -o out # Use Microsoft's official runtime .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/ FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS runtime WORKDIR /app COPY --from=build /app/out ./ # Make sure the app binds to port 8080 ENV ASPNETCORE_URLS http://*:8080 # Run the web service on container startup. ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]
Jedną z ważnych konfiguracji w pliku Dockerfile jest port, na którym aplikacja nasłuchuje ruchu przychodzącego (8080). Można to osiągnąć przez ustawienie zmiennej środowiskowej ASPNETCORE_URLS
, której aplikacje ASP.NET Core używają do określania portu nasłuchującego.
Zapisz element Dockerfile
. Teraz załóżmy ten obraz:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .
Po zakończeniu tego procesu (pobranie i wyodrębnienie wszystkich danych może trochę potrwać), zobaczysz, że obraz został utworzony i zapisany lokalnie:
docker images REPOSITORY TAG gcr.io/yourproject-XXXX/hello-dotnet v1
Przetestuj obraz lokalnie za pomocą tego polecenia, które spowoduje uruchomienie kontenera Dockera lokalnie na porcie 8080 z nowo utworzonego obrazu kontenera:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Jeszcze raz skorzystaj z funkcji podglądu w przeglądarce CloudShell :
W nowej karcie powinna wyświetlić się domyślna strona internetowa ASP.NET Core.
Gdy upewnisz się, że aplikacja działa prawidłowo lokalnie w kontenerze Dockera, możesz zatrzymać uruchomiony kontener do Ctrl-> C
.
Gdy obraz działa zgodnie z oczekiwaniami, możesz go przekazać do Google Container Registry – prywatnego repozytorium obrazów Dockera, które jest dostępne z każdego projektu Google Cloud (ale także spoza Google Cloud Platform) :
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Jeśli wszystko pójdzie dobrze, po chwili powinien być widoczny obraz kontenera wymieniony w sekcji Container Registry. W tej chwili dostępny jest obraz Dockera obejmujący cały projekt, do którego Kubernetes może uzyskać dostęp i którym może administrować – co będzie widoczne za kilka minut.
Jeśli chcesz przeglądać obrazy kontenerów przechowywane w Google Cloud Storage, kliknij ten link: https://console.cloud.google.com/storage/browser/ (pełny link powinien wyglądać tak: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).
6. Tworzenie klastra Kubernetes/GKE przy użyciu Istio
Najpierw upewnij się, że masz włączony interfejs Kubernetes Engine API:
gcloud services enable container.googleapis.com
utworzyć klaster Kubernetes, Możesz zmienić region na tak blisko siebie.
gcloud container clusters create hello-istio \ --cluster-version=latest \ --machine-type=n1-standard-2 \ --num-nodes=4 \ --region europe-west1
Zaczekaj chwilę, aż klaster zostanie skonfigurowany. Będzie on widoczny w sekcji Kubernetes Engine w konsoli Google Cloud Platform.
Na potrzeby tego ćwiczenia w Codelabs pobierzemy i zainstalujemy Istio z istio.io. Istnieją inne opcje instalacji, w tym dodatek Istio dla GKE i Anthos Service Mesh. Kolejne kroki aplikacji będą działać w każdej instalacji Istio.
Najpierw pobierz klienta i przykłady Istio. Na stronie wersji Istio znajdziesz artefakty do pobrania dla różnych systemów operacyjnych. W naszym przypadku możemy użyć wygodnego polecenia do pobrania i wyodrębnienia najnowszej wersji dla bieżącej platformy:
curl -L https://istio.io/downloadIstio | sh -
Skrypt poinformuje Cię o pobranej wersji Istio:
Istio has been successfully downloaded into the istio-1.8.1 folder on your system.
Katalog instalacji zawiera przykładowe aplikacje i plik binarny klienta istioctl
. Przejdź do tego katalogu:
cd istio-1.8.1
Skopiuj i wklej podane polecenie, aby dodać katalog bin
do katalogu PATH
i użyć narzędzia istioctl
:
export PATH="$PATH:/home/<YOURHOMEID>/istio-1.8.1/bin"
Sprawdź, czy klaster istioctl
jest dostępny, sprawdzając gotowość klastra do pracy z Istio:
istioctl x precheck
Powinien wyświetlić się komunikat: Install Pre-Check passed! The cluster is ready for Istio installation.
.
Zainstaluj Istio za pomocą profilu demonstracyjnego:
istioctl install --set profile=demo
Usługa Istio jest teraz zainstalowana w Twoim klastrze.
Automatyczne wstrzykiwanie aplikacji pomocniczej
Aby zacząć korzystać z Istio, nie musisz wprowadzać żadnych zmian w aplikacji. Gdy skonfigurujesz i uruchomisz usługi, pliki pomocnicze Envoy będą automatycznie wstrzykiwane do każdego poda związanego z usługą.
Aby to zadziałało, musisz włączyć wstrzykiwanie plików pomocniczych dla przestrzeni nazw („domyślnej”), której używasz w mikroserwisach. W tym celu dodaj etykietę:
kubectl label namespace default istio-injection=enabled
Aby sprawdzić, czy etykieta została zastosowana, uruchom to polecenie:
kubectl get namespace -L istio-injection
Dane wyjściowe potwierdzają, że wstrzykiwanie plików pomocniczych jest włączone dla domyślnej przestrzeni nazw:
NAME STATUS AGE ISTIO-INJECTION default Active 3m enabled istio-system Active 63s disabled ...
7. Sprawdzanie instalacji
Istio ma 3 usługi: platformę sterującą istiod
oraz bramy ruchu przychodzącego i wychodzącego (które możesz określić jako „pomocnicze serwery proxy dla reszty internetu”) o nazwach odpowiednio istio-ingressgateway
i istio-egressgateway
.
kubectl get svc -n istio-system
Dane wyjściowe powinny wyglądać tak:
NAME TYPE CLUSTER-IP EXTERNAL-IP AGE istio-egressgateway ClusterIP 10.55.252.182 <none> istio-ingressgateway LoadBalancer 10.55.250.185 35.233.118.42 istiod ClusterIP 10.55.253.217 <none>
Brama ruchu przychodzącego ma typ LoadBalancer
, dzięki czemu jest dostępna z internetu. pozostałe muszą być dostępne tylko z poziomu klastra.
Następnie sprawdź, czy odpowiednie pody Kubernetes zostały wdrożone i czy wszystkie kontenery są uruchomione:
kubectl get pods -n istio-system
Możesz kontynuować, gdy wszystkie pody będą uruchomione.
NAME READY STATUS istio-egressgateway-674988f895-m6tk4 1/1 Running istio-ingressgateway-6996f7dcc8-7lvm2 1/1 Running istiod-6bf5fc8b64-j79hj 1/1 Running
istiod
: platforma sterująca Istio. Obsługuje konfigurację i programowanie plików pomocniczych serwera proxy, wykrywanie usług, rozpowszechnianie certyfikatów i wstrzykiwanie plików pomocniczychingress gateway
: obsługuje żądania przychodzące spoza klastra.egress gateway
: obsługuje żądania wychodzące do punktów końcowych spoza klastra.
8. Wdrażanie aplikacji
Po sprawdzeniu, czy Istio jest zainstalowane i uruchomione, możesz wdrożyć aplikację ASP.NET Core.
Wdrożenie i usługa
Najpierw utwórz plik aspnetcore.yaml
w swoim ulubionym edytorze (vim, nano,emacs
lub edytorze kodu Cloud Shell) i zdefiniuj usługę oraz wdrożenie Kubernetes dla aplikacji:
apiVersion: v1 kind: Service metadata: name: aspnetcore-service labels: app: aspnetcore spec: ports: - port: 8080 name: http selector: app: aspnetcore --- apiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v1 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v1 template: metadata: labels: app: aspnetcore version: v1 spec: containers: - name: aspnetcore image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 8080
Zawartość tego pliku to standardowe wdrożenia i usługi, które pozwalają wdrożyć aplikację. Nie zawiera on żadnych informacji dotyczących Istio.
Wdróż usługi w domyślnej przestrzeni nazw za pomocą: kubectl
:
kubectl apply -f aspnetcore.yaml
service "aspnetcore-service" created deployment.extensions "aspnetcore-v1" created
Sprawdź, czy pody są uruchomione:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s
Brama i usługa VirtualService
Aby umożliwić ruch przychodzący do sieci typu mesh, musisz utworzyć Gateway i VirtualService.
Brama konfiguruje system równoważenia obciążenia dla ruchu HTTP/TCP, który najczęściej działa na brzegu siatki, aby umożliwić ruch przychodzący dla aplikacji. VirtualService definiuje reguły, które kontrolują kierowanie żądań usługi w siatce usług Istio.
Utwórz plik aspnetcore-gateway.yaml
, aby zdefiniować bramę:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: aspnetcore-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
Utwórz plik aspnetcore-virtualservice.yaml
, aby zdefiniować usługę VirtualService:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service
Uruchom polecenie kubectl, aby wdrożyć bramę za pomocą:
kubectl apply -f aspnetcore-gateway.yaml
Polecenie zwróci następujące dane wyjściowe:
gateway.networking.istio.io "aspnetcore-gateway" created
Następnie uruchom to polecenie, aby wdrożyć usługę VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Polecenie zwróci następujące dane wyjściowe:
virtualservice.networking.istio.io "aspnetcore-virtualservice" created
Sprawdź, czy wszystko działa:
kubectl get gateway
NAME AGE aspnetcore-gateway 28s
kubectl get virtualservice
NAME AGE aspnetcore-virtualservice 33s
Gratulacje! Właśnie udało Ci się wdrożyć aplikację z obsługą Istio. Zobaczysz, że aplikacja jest używana.
9. Testowanie aplikacji
Możesz wreszcie zobaczyć, jak działa aplikacja. Musisz uzyskać zewnętrzny adres IP i port bramy. Jest wymienione w EXTERNAL-IP
:
kubectl get svc istio-ingressgateway -n istio-system
Wyeksportuj zewnętrzny adres IP i port do zmiennej GATEWAY_URL
:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
Przetestuj aplikację za pomocą curl
. Usługa powinna odpowiedzieć, przesyłając kod odpowiedzi 200
:
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/
Aby wyświetlić aplikację, możesz też otworzyć przeglądarkę i przejść do aplikacji http://<gatewayurl>
:
10. Gratulacje!
Właśnie wdrożyliśmy w Kubernetes prostą aplikację ASP.NET Core w Google Kubernetes Engine (GKE) i skonfigurowaliśmy jej zarządzanie przez Istio.
Możesz się zastanawiać, jakie korzyści daje Istio. Dobre pytanie. Jak na razie zarządzanie tą aplikacją przez Istio nie przynosi żadnych korzyści. W drugiej części tego modułu przyjrzymy się bliżej funkcjom Istio, takim jak wskaźniki, śledzenie, dynamiczne zarządzanie ruchem, wizualizacja usług i wstrzykiwanie błędów.
Następne kroki
- Wdróż w GKE aplikację ASP.NET Core za pomocą Istio (część 2).
- 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
Jeżeli nie przechodzisz do drugiej części modułu, 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.yaml
Aby potwierdzić, że aplikacja została usunięta:
kubectl get gateway kubectl get virtualservices 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-istio