Wdrażanie aplikacji ASP.NET Core w Kubernetes w Google Kubernetes Engine

1. Przegląd

ASP.NET Core to nowa platforma typu open source i na wielu platformach, która umożliwia tworzenie nowoczesnych aplikacji działających w chmurze i połączonych z internetem przy użyciu języka programowania C#.

Kubernetes to projekt typu open source, który może działać w wielu różnych środowiskach, od laptopów po klastry wielowęzłowe o wysokiej dostępności, od chmur publicznych po wdrożenia lokalne, od maszyn wirtualnych po sprzęt fizyczny.

W tym module wdrożysz prostą aplikację ASP.NET Core w Kubernetes działającym w Kubernetes Engine. Ten moduł opiera się na module Tworzenie i uruchamianie aplikacji ASP.NET Core za pomocą Google Cloud Shell. Zanim rozpoczniesz ten moduł, możesz najpierw wykonać tamten.

Celem tych ćwiczeń z programowania jest przekształcenie kodu (w tym przypadku prostej aplikacji Hello World ASP.NET Core) w replikowaną aplikację działającą w Kubernetes. Kod opracowany na komputerze przekształcasz w obraz kontenera Dockera, a następnie uruchamiasz go w Google Kubernetes Engine.

Aby ułatwić Ci zrozumienie, jak poszczególne elementy łączą się ze sobą, przedstawiamy diagram różnych części tego laboratorium. Korzystaj z niej w trakcie wykonywania ćwiczeń. Wszystko powinno stać się jasne, gdy dotrzesz do końca (ale na razie możesz to zignorować).

7dbdc973aceef1af.jpeg

Na potrzeby tego laboratorium użycie zarządzanego środowiska, takiego jak Kubernetes Engine (wersja Kubernetes hostowana przez Google i działająca w Compute Engine), pozwala skupić się na korzystaniu z Kubernetes, a nie na konfigurowaniu infrastruktury bazowej.

Jeśli chcesz uruchomić Kubernetes na komputerze lokalnym, np. na laptopie deweloperskim, prawdopodobnie zainteresuje Cię Minikube. Umożliwia to proste skonfigurowanie klastra Kubernetes z 1 węzłem na potrzeby programowania i testowania. Jeśli chcesz, możesz skorzystać z Minikube, aby przejść ten samouczek.

Czego się nauczysz

  • Jak spakować prostą aplikację ASP.NET Core jako kontener Dockera.
  • Jak utworzyć klaster Kubernetes w Google Kubernetes Engine (GKE).
  • Jak wdrożyć aplikację ASP.NET Core w pode.
  • Jak zezwolić na ruch zewnętrzny do poda.
  • Jak skalować w górę usługę i wdrażać uaktualnienia.
  • Jak uruchomić graficzny panel Kubernetes.

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu musi być unikalny we wszystkich projektach Google Cloud i jest niezmienny (nie można go zmienić po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i będzie obowiązywać przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module praktycznym będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

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:

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
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. Tworzenie aplikacji ASP.NET Core w Cloud Shell

W wierszu poleceń Cloud Shell możesz sprawdzić, czy narzędzie wiersza poleceń dotnet jest już zainstalowane, sprawdzając jego wersję. Powinna się wyświetlić wersja zainstalowanego narzędzia wiersza poleceń dotnet:

dotnet --version

Następnie utwórz nową szkieletową aplikację internetową ASP.NET Core.

dotnet new mvc -o HelloWorldAspNetCore

Spowoduje to utworzenie projektu i przywrócenie 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

Nasza aplikacja jest już prawie gotowa do uruchomienia. Otwórz folder 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 działa, kliknij przycisk podglądu w przeglądarce w prawym górnym rogu i wybierz „Podejrzyj na porcie 8080”.

Capture.PNG

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

f42271880ce4d572.png

Gdy sprawdzisz, czy aplikacja działa, naciśnij Ctrl+C, aby ją wyłączyć.

5. Spakuj aplikację ASP.NET Core jako kontener Dockera.

Następnie przygotuj aplikację do uruchomienia jako kontener. Pierwszym krokiem jest zdefiniowanie kontenera i jego zawartości.

W katalogu głównym aplikacji utwórz plik Dockerfile, aby zdefiniować obraz Dockera.

touch Dockerfile

Dodaj poniższy kod do pliku Dockerfile w ulubionym edytorze (vim, nano,emacs lub edytorze kodu Cloud Shell).

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:6.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:6.0-alpine-amd64 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"]

Ważną konfiguracją zawartą w pliku Dockerfile jest port, na którym aplikacja nasłuchuje ruchu przychodzącego (8080). Możesz to zrobić, ustawiając zmienną środowiskową ASPNETCORE_URLS, której aplikacje ASP.NET Core używają do określania portu, na którym mają nasłuchiwać.

Zapisz to Dockerfile. Teraz utwórzmy obraz:

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

Gdy proces się zakończy (pobieranie i wyodrębnianie wszystkich plików zajmie trochę czasu), 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 uruchomi kontener Dockera lokalnie na porcie 8080 z nowo utworzonego obrazu kontenera:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

Ponownie skorzystaj z funkcji podglądu w przeglądarce Cloud Shell :

Screenshot from 2015-11-03 17:20:22.png

W nowej karcie powinna być widoczna domyślna strona internetowa ASP.NET Core.

f42271880ce4d572.png

Gdy sprawdzisz, że aplikacja działa prawidłowo lokalnie w kontenerze Dockera, możesz zatrzymać działający kontener, klikając Ctrl-> C.

Teraz, gdy obraz działa zgodnie z oczekiwaniami, możesz przesłać go do Google Container Registry, czyli prywatnego repozytorium obrazów Dockera dostępnego z każdego projektu w chmurze Google (ale też spoza Google Cloud Platform) :

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

Jeśli wszystko przebiegnie pomyślnie, po chwili obraz kontenera powinien pojawić się w sekcji Container Registry. W tym momencie masz już dostępny obraz Dockera w całym projekcie, do którego Kubernetes może uzyskać dostęp i którym może zarządzać, co zobaczysz za kilka minut.

576374602b52f4e4.png

Jeśli chcesz, możesz przejrzeć obrazy kontenerów przechowywane w Google Cloud Storage, klikając ten link: https://console.cloud.google.com/storage/browser/ (pełny link powinien mieć postać https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).

6. Utwórz klaster Kubernetes

Możesz już utworzyć klaster GKE, ale najpierw przejdź do sekcji Google Kubernetes Engine w konsoli internetowej i poczekaj, aż system się zainicjuje (powinno to zająć tylko kilka sekund).

d5f6e3c267feea1a.png

Klaster składa się z serwera Kubernetes Master API zarządzanego przez Google i zestawu węzłów roboczych. Węzły robocze to maszyny wirtualne Compute Engine.

Użyj interfejsu gcloud CLI w sesji Cloud Shell, aby utworzyć klaster. Dostosuj strefę do miejsca, w którym się znajdujesz ( lista stref). Wykonanie tych czynności zajmie kilka minut:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

Na koniec powinien pojawić się utworzony klaster.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

Powinien być teraz dostępny w pełni funkcjonalny klaster Kubernetes obsługiwany przez Google Kubernetes Engine:

eefb8d9b7f39598b.png

Czas wdrożyć własną skonteneryzowaną aplikację w klastrze Kubernetes. Od teraz będziesz używać wiersza poleceń kubectl (jest on już skonfigurowany w środowisku Cloud Shell). W pozostałej części tego modułu wymagane jest, aby wersja klienta i serwera Kubernetes była co najmniej 1.2. kubectl version wyświetli aktualną wersję polecenia.

7. Utwórz wdrożenie

Pod Kubernetes to grupa kontenerów połączonych ze sobą na potrzeby administracji i sieci. Może zawierać 1 kontener lub większą ich liczbę. W tym przypadku użyjesz po prostu jednego kontenera utworzonego za pomocą obrazu ASP.NET Core przechowywanego w prywatnym rejestrze kontenerów. Będzie on udostępniać treści na porcie 8080.

Utwórz plik hello-dotnet.yaml w ulubionym edytorze (vim, nano,emacs lub edytorze kodu Cloud Shell) i zdefiniuj wdrożenie Kubernetes dla poda:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Wdróż w domyślnej przestrzeni nazw za pomocą polecenia kubectl:

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

Jak widzisz, udało Ci się utworzyć obiekt wdrożenia. Wdrożenia to zalecany sposób tworzenia i skalowania podów. Nowe wdrożenie zarządza tu jedną repliką poda z obrazem hello-dotnet:v1.

Aby wyświetlić właśnie utworzone wdrożenie, uruchom to polecenie:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

Aby wyświetlić poda utworzonego przez wdrożenie, uruchom to polecenie:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

Teraz jest dobry moment, aby zapoznać się z kilkoma interesującymi poleceniami kubectl (żadne z nich nie zmieni stanu klastra, pełna dokumentacja jest dostępna tutaj):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

W tym momencie kontener powinien działać pod kontrolą Kubernetes, ale nadal musisz udostępnić go do użytku publicznego.

8. Zezwalaj na ruch zewnętrzny

Domyślnie pod jest dostępny tylko przez wewnętrzny adres IP w klastrze. Aby kontener hello-dotnet był dostępny spoza wirtualnej sieci Kubernetes, musisz udostępnić poda jako usługę Kubernetes.

W Cloud Shell możesz udostępnić poda w publicznym internecie za pomocą polecenia kubectl expose w połączeniu z flagą --type="LoadBalancer". Ta flaga jest wymagana do utworzenia adresu IP dostępnego z zewnątrz :

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

Flaga użyta w tym poleceniu określa, że będziesz używać systemu równoważenia obciążenia udostępnianego przez infrastrukturę bazową (w tym przypadku systemu równoważenia obciążenia Compute Engine). Pamiętaj, że udostępniasz wdrożenie, a nie bezpośrednio poda. Spowoduje to, że usługa będzie równoważyć obciążenie we wszystkich podach zarządzanych przez wdrożenie (w tym przypadku tylko 1 pod, ale później dodasz więcej replik).

Węzeł główny Kubernetes tworzy system równoważenia obciążenia oraz powiązane reguły przekierowania Compute Engine, pule docelowe i reguły zapory, aby usługa była w pełni dostępna spoza Google Cloud Platform.

Aby znaleźć publicznie dostępny adres IP usługi, po prostu poproś kubectl o wyświetlenie listy wszystkich usług klastra:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

Zwróć uwagę, że w przypadku Twojej usługi są wymienione 2 adresy IP, które obsługują port 8080. Jeden to wewnętrzny adres IP widoczny tylko w Twojej wirtualnej sieci w chmurze, a drugi to zewnętrzny adres IP z równoważeniem obciążenia. W tym przykładzie zewnętrzny adres IP to 104.155.20.69.

Usługa powinna być teraz dostępna pod tym adresem: http://<EXTERNAL_IP>:8080

6b053874002827fe.png

W tym momencie zyskujesz co najmniej kilka funkcji dzięki przejściu na kontenery i Kubernetes – nie musisz określać, na którym hoście ma być uruchomione Twoje obciążenie, a także korzystasz z monitorowania i ponownego uruchamiania usługi. Sprawdź, co jeszcze możesz zyskać dzięki nowej infrastrukturze Kubernetes.

9. Skalowanie usługi

Jedną z najważniejszych funkcji Kubernetes jest łatwość skalowania aplikacji. Załóżmy, że nagle potrzebujesz większej mocy obliczeniowej dla aplikacji. Wystarczy, że poinformujesz kontroler replikacji, aby zarządzał nową liczbą replik w przypadku poda:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

Zwróć uwagę na podejście deklaratywne – zamiast uruchamiać lub zatrzymywać nowe instancje deklarujesz, ile instancji powinno działać przez cały czas. Pętle uzgadniania Kubernetes po prostu sprawdzają, czy rzeczywistość jest zgodna z Twoimi żądaniami, i w razie potrzeby podejmują odpowiednie działania.

Oto diagram podsumowujący stan klastra Kubernetes:

6af0243662464ca9.png

Możesz też bardzo łatwo skalować w dół swoją usługę. Oto jak skalować w dół z 4 podów do 2 podów.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. Testowanie odporności

Kubernetes (a dokładniej ReplicaSet) monitoruje pody i jeśli coś jest z nimi nie tak i ulegną awarii, od razu tworzy nowe. Sprawdźmy, jak to działa.

Najpierw pobierz listę zasobników:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

Usuń jeden z podów, podając jego nazwę:

kubectl delete pod hello-dotnet-714049816-g4azy

Jeśli ponownie sprawdzisz listę podów, zobaczysz, że nowy pod jest tworzony i od razu uruchamiany:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. Wdrażanie uaktualnienia usługi

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.

f487389b8b1cc105.png

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 

Kubernetes może teraz bezproblemowo zaktualizować kontroler replikacji do nowej wersji aplikacji. Aby zmienić etykietę obrazu uruchomionego kontenera, musisz edytować istniejący plik hello-dotnet deployment i zmienić obraz z gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 na gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2.

Aby to zrobić, użyj polecenia kubectl edit. Spowoduje to otwarcie edytora tekstu z pełną konfiguracją wdrożenia w formacie YAML. Nie musisz teraz rozumieć całej konfiguracji YAML. Wystarczy, że wiesz, że aktualizując pole spec.template.spec.containers.image w konfiguracji, informujesz wdrożenie, aby zaktualizowało pody i używało nowego obrazu.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

Po wprowadzeniu zmiany zapisz i zamknij plik (w tym celu w edytorze vi naciśnij klawisz „Esc”, a potem wpisz :wq i naciśnij klawisz „Enter”).

deployment "hello-dotnet" edited

Spowoduje to zaktualizowanie wdrożenia o nowy obraz, utworzenie nowych podów z nowym obrazem i usunięcie starych podów.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

W tym czasie użytkownicy usług nie powinni zauważyć żadnych przerw w działaniu. Po pewnym czasie zaczną korzystać z nowej wersji aplikacji.

fb9f41e814dda653.png

Więcej informacji o aktualizacjach kroczących znajdziesz w dokumentacji Kubernetes.

Mamy nadzieję, że dzięki tym funkcjom wdrażania, skalowania i aktualizacji zgodzisz się, że po skonfigurowaniu środowiska (w tym przypadku klastra GKE lub Kubernetes) Kubernetes może pomóc Ci skupić się na aplikacji, a nie na zarządzaniu infrastrukturą.

12. Cloud Build

Do tej pory tworzyliśmy kontenery za pomocą zwykłych poleceń Dockera (docker build …), a następnie ręcznie przenosiliśmy obraz do Container Registry w Google Cloud Platform. Możesz też odłożyć oba kroki na stronę serwera Cloud Build, która może tworzyć i przekazywać obraz kontenera bez konieczności lokalnej instalacji Dockera.

Najpierw włącz Cloud Build API w Menedżerze interfejsów API > Biblioteka. Wyszukaj Cloud Build i kliknij Cloud Build API:

f8b0239fa7719f29.png

Jeśli interfejs API nie jest jeszcze włączony, kliknij Włącz API. Na koniec powinien pojawić się włączony interfejs API:

ea6053f9603613b5.png

Po włączeniu interfejsu Cloud Build API możesz uruchomić to polecenie, aby skompilować i wypchnąć obraz z usługi Container Builder:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

Obraz jest automatycznie przechowywany w Container Registry.

13. Uruchamianie graficznego panelu Kubernetes

W najnowszych wersjach Kubernetes wprowadzono graficzny interfejs użytkownika (panel). Ten interfejs użytkownika umożliwia szybkie rozpoczęcie pracy i korzystanie z niektórych funkcji dostępnych w CLI w bardziej przystępny i łatwiejszy do odkrycia sposób interakcji z systemem.

Aby skonfigurować dostęp do panelu klastra Kubernetes, w oknie Cloud Shell wpisz te polecenia :

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

Następnie ponownie użyj funkcji podglądu Cloud Shell, aby przejść do portu 8081:

port8081.png

Powinno to spowodować przejście do punktu końcowego interfejsu API. Może pojawić się strona „Nieautoryzowany”, ale nie musisz się tym przejmować. Aby przejść do panelu, usuń „?authuser=3” i zastąp go ciągiem „/ui”.

Korzystaj z graficznego panelu Kubernetes do wdrażania aplikacji skonteneryzowanych oraz monitorowania klastrów i zarządzania nimi.

177789527b650f6b.png

Możesz też otworzyć panel na komputerze deweloperskim lub lokalnym, postępując zgodnie z instrukcjami wyświetlanymi po naciśnięciu w konsoli internetowej przycisku „Połącz” przy klastrze, który chcesz monitorować.

da1ccc707dd6647.png

a51c7160e237f32f.png

Gdy skończysz korzystać z panelu, możesz zatrzymać serwer proxy, naciskając Control + C. Więcej informacji o panelu Kubernetes znajdziesz w przewodniku po panelu.

14. Logowanie

Możesz użyć polecenia kubectl logs, aby pobrać dzienniki kontenera działającego w Kubernetes. Gdy używasz Google Kubernetes Engine do uruchamiania zarządzanych klastrów Kubernetes, wszystkie logi są automatycznie przekazywane i przechowywane w Google Cloud Logging. Aby wyświetlić wszystkie dane wyjściowe logów z podów, w konsoli Google Cloud otwórz Stackdriver → Logowanie → Logi:

b63159b959ba5010.png

W konsoli logowania możesz przejść do sekcji Kontener GKE, aby wyświetlić wszystkie logi zebrane z STDOUT:

43e9aab3e02358d5.png

Możesz stąd wyeksportować dzienniki do Google BigQuery, aby przeprowadzić dalszą analizę, lub skonfigurować alerty oparte na dziennikach. Nie będziemy tego robić podczas dzisiejszych zajęć.

15. Gratulacje!

To już koniec tych prostych ćwiczeń z programowania, które wprowadziły Cię w ASP.NET Core i Kubernetes. Zaledwie zarysowaliśmy tę technologię. Zachęcamy do dalszego poznawania jej możliwości za pomocą własnych podów, kontrolerów replikacji i usług, a także do zapoznania się z sondami żywotności (kontrolami stanu) i rozważenia bezpośredniego korzystania z interfejsu Kubernetes API.

Czyszczenie danych

To wszystko. Czas na wyczyszczenie używanych zasobów (aby zaoszczędzić i być dobrym użytkownikiem chmury).

Usuń wdrożenie (co spowoduje też usunięcie działających podów) i usługę (co spowoduje też usunięcie zewnętrznego systemu równoważenia obciążenia):

Najpierw usuń usługę i wdrożenie, co spowoduje też usunięcie zewnętrznego systemu równoważenia obciążenia:

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

Następnie usuń klaster:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

Spowoduje to usunięcie wszystkich instancji Google Compute Engine, na których działa klaster.

Na koniec usuń zasobnik pamięci rejestru Dockera, w którym znajdują się obrazy:

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

Możesz też usunąć cały projekt, ale stracisz wtedy wszystkie skonfigurowane ustawienia płatności (najpierw musisz wyłączyć płatności za projekt). Usunięcie projektu spowoduje wstrzymanie naliczania opłat dopiero po zakończeniu bieżącego cyklu rozliczeniowego.

Omówione zagadnienia

  • Jak spakować prostą aplikację ASP.NET Core jako kontener Dockera.
  • Jak utworzyć klaster Kubernetes w Google Kubernetes Engine.
  • Jak wdrożyć aplikację ASP.NET Core w pode.
  • Jak zezwolić na ruch zewnętrzny do poda.
  • Jak skalować w górę usługę i wdrażać uaktualnienia.
  • Jak uruchomić graficzny panel Kubernetes.

Następne kroki

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.