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

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?

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 ani Google Workspace, musisz je utworzyć.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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 4292cbf4971c9786.png.

bce75f34b2c53987.png

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:

70f315d7b402b476.png

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

fbe3a0674c982259.png

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`
  1. 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”.

Capture.PNG

Zobaczysz domyślną stronę internetową ASP.NET Core:

f579a9baedc108a9.png

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 :

Zrzut ekranu z 2015-11-03 17:20:22.png

W nowej karcie powinna wyświetlić się domyślna strona internetowa ASP.NET Core.

f579a9baedc108a9.png

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.

73558f3a54ce1c0c.png

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.

e46fd9c6ee82bcc4.png

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 pomocniczych
  • ingress 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>:

f579a9baedc108a9.png

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

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