Ćwiczenie — wdrażanie rozwiązania z wieloma kontenerami w klastrze Kubernetes
Pipeline wdrożenia dostarczony z twoim projektem służy do tworzenia kontenera Docker i wdrażania rozwiązania w usłudze Azure App Service. Aby wesprzeć wdrożenie wielu kontenerów w klastrze Kubernetes, należy zmodyfikować ten pipeline.
W tej lekcji dowiesz się, jak wykonywać następujące działania:
- Zaktualizuj pipeline, aby uruchamiać przy zatwierdzeniu do gałęzi głównej.
- Zdefiniuj zmienne do współużytkowania w potoku.
- Tworzenie i publikowanie obrazów Dockera.
- Publikowanie manifestów platformy Kubernetes.
- Dodaj zadanie, aby utworzyć sekret pobierania obrazu do użycia między instancjami Kubernetes a rejestrem kontenerów.
- Wdróż zaktualizowane obrazy do klastra Kubernetes.
Zaktualizuj potok, aby obsługiwać wyzwalacze
Zaloguj się do organizacji usługi Azure DevOps, a następnie przejdź do projektu.
Wybierz Pipelines, a następnie wybierz swój pipeline.
Wybierz pozycję Edytuj, aby zmodyfikować plik azure-pipelines.yml.
Andy: To był etap budowy, który mieliśmy w miejscu dla poprzedniego rozwiązania z jednym kontenerem. Wiedziałem, że to nie będzie działać prawidłowo, więc wyłączyłem go. Rozpoczniemy od ponownego włączenia wyzwalaczy dla zatwierdzeń w gałęzi
main
.Zastąp istniejący wiersz
trigger
w górnej części pliku poniższym fragmentem kodu. Powoduje to uruchomienie potoku za każdym razem, gdy dokonuje się zatwierdzenia w głównej gałęzi.trigger: - 'main'
Definiowanie zmiennych dostępnych w całym potoku
Andy: Musimy dodać dwie zmienne rurociągu. Służy do określania nazwy repozytorium rankingu, czyli rankingu. Druga jest nazwą sekretu pobierania obrazu używanego do współdzielenia między wystąpieniami AKS i ACR w trakcie wdrażania.
Dodaj następujący wyróżniony kod do sekcji
variables
.variables: buildConfiguration: 'Release' leaderboardRepository: 'leaderboard' webRepository: 'web' tag: '$(Build.BuildId)' imagePullSecret: 'secret'
Kompilowanie i publikowanie obrazu platformy Docker w usłudze Azure Container Registry
Andy: Mamy już zadanie tworzenia aplikacji internetowej jako kontenera platformy Docker, które publikujemy w rejestrze kontenerów. Możemy po prostu użyć drugiego zadania, aby wykonać to samo dla naszej tablicy wyników.
Dodaj drugie zadanie
Docker@2
, aby skompilować i opublikować kontener rankingowy przy użyciu poniższego wyróżnionego fragmentu kodu. Dodaj to zadanie bezpośrednio po zadaniu kontenera webowego.- task: Docker@2 displayName: 'Build and push the web image to container registry' inputs: command: buildAndPush buildContext: $(Build.Repository.LocalPath) repository: $(webRepository) dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.Web/Dockerfile' containerRegistry: 'Container Registry Connection' tags: | $(tag) - task: Docker@2 displayName: 'Build and push the leaderboard image to container registry' inputs: command: buildAndPush buildContext: $(Build.Repository.LocalPath) repository: $(leaderboardRepository) dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.LeaderboardContainer/Dockerfile' containerRegistry: 'Container Registry Connection' tags: | $(tag)
Wskazówka
Upewnij się, że dodane tutaj zadanie używa spójnego wcięcia z poprzednim zadaniem, ponieważ spacje są ważne w pliku YAML.
Publikowanie manifestów platformy Kubernetes
Andy: Myślę, że możemy przejść do następnego etapu. Czy widzisz coś brakującego?
Mara: Wspomniano już, że w projekcie źródłowym istnieją pewne pliki manifestu, które definiują wdrożenie, oraz usługi, których potrzebuje platforma Kubernetes podczas wdrażania. Powinniśmy je opublikować przed zakończeniem tego etapu.
Andy: Czy musimy? Czy nadal nie będą znajdować się na dysku lokalnym?
Mara: Byłyby, gdybyśmy dodawali zadania wdrażania na tym samym etapie co kompilacja. Jednak ponieważ nasze zadania wdrażania są wykonywane we własnym etapie wdrażania, działa w nowym środowisku, prawdopodobnie nawet na innym agencie. Należy upewnić się, aby opublikować wszystko, co ten etap wytwarza, a czego potrzebuje inny etap.
Andy: To świetny punkt. Czy łatwo jest to zrobić? Musimy tylko upewnić się, że folder manifestów jest skopiowany na nowego agenta.
Mara: To właśnie jest zadanie PublishBuildArtifacts@1
. Tak jest powszechne, że nawet stosuje się skrót publish
.
Dodaj zadanie
publish
, które przechowuje manifesty dla przyszłego etapu, jak pokazano w poniższym fragmencie kodu. Upewnij się, że wcięcie tego zadania jest zgodne z poprzednim zadaniem.- task: Docker@2 displayName: 'Build and push the leaderboard image to container registry' inputs: command: buildAndPush buildContext: $(Build.Repository.LocalPath) repository: $(leaderboardRepository) dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.LeaderboardContainer/Dockerfile' containerRegistry: 'Container Registry Connection' tags: | $(tag) - publish: '$(Build.SourcesDirectory)/manifests' artifact: manifests
Zastąp etap wdrażania
Mara: zamierzam zastąpić nasz istniejący etap Deploy tym, który używa zadania wdrożenia. Zadanie wdrażania jest specjalnym rodzajem zadania, które pozwala nam skojarzyć wdrożenie ze środowiskiem usługi Azure DevOps utworzonym wcześniej. Ułatwia to śledzenie historii wdrażania, co będzie szczególnie przydatne, ponieważ nasze rozwiązania stają się bardziej zaawansowane.
Usuń istniejący etap wdrażania (wszystko po etapie kompilacji) i zastąp go poniższym fragmentem kodu. Zwróć uwagę na wyróżniony wiersz wskazujący środowisko wdrażania, które ma być używane.
- stage: 'Deploy' displayName: 'Deploy the containers' dependsOn: Build jobs: - deployment: Deploy displayName: Deploy pool: vmImage: 'ubuntu-20.04' environment: 'Dev' variables: - group: Release strategy: runOnce: deploy: steps:
Mara: Pierwszym krokiem, który dodamy na etapie wdrażania, jest pobranie artefaktów manifestu opublikowanych wcześniej przy użyciu zadania
DownloadBuildArtifacts@0
.Andy: Pozwól mi odgadnąć, czy jest
download
skrót dla tego zadania?Mara: Dokładnie poprawne! Możemy użyć specyfikatora
current
, aby wskazać, że chcemy uzyskać artefakt z bieżącego uruchomienia potoku.Dodaj wyróżnione wiersze jako pierwszy krok etapu wdrażania.
- stage: 'Deploy' displayName: 'Deploy the containers' dependsOn: Build jobs: - deployment: Deploy displayName: Deploy pool: vmImage: 'ubuntu-20.04' environment: 'spike.default' variables: - group: Release strategy: runOnce: deploy: steps: - download: current artifact: manifests
Andy: Teraz musimy utworzyć tajny klucz do pobierania obrazów, który będzie współużytkowany między naszymi instancjami ACR i AKS. Czy wiesz, czy istnieje zadanie, którego możemy użyć?
Mara: Po prostu szukałam tego i mamy szczęście. Zadanie
KubernetesManifest@0
wspiera działanie mające na celu utworzenie potrzebnej tajemnicy.
Zadanie manifestu platformy Kubernetes
Zadanie manifestu platformy Kubernetes zostało zaprojektowane tak, aby zarządzać wszystkimi głównymi operacjami wdrażania wymaganymi dla platformy Kubernetes. Obsługuje wiele opcji action
, które obejmują od tworzenia tajemnic po wdrażanie obrazów. W tym przypadku jest używana akcja createSecret
wraz z następującymi parametrami:
-
action
wskazuje funkcję do uruchomienia. W tym przypadkucreateSecret
tworzy wspólny klucz tajny. -
connectionType
określa typ połączenia z usługą do użycia. Opcje: azureResourceManager lub kubernetesServiceConnection. -
secretName
określa nazwę sekretu do utworzenia. -
dockerRegistryEndpoint
określa nazwę połączenia usług Azure Container Registry Services. -
azureSubscriptionConnection
określa nazwę połączenia usług ARM. -
azureResourceGroup
określa nazwę grupy zasobów. -
kubernetesCluster
określa nazwę klastra AKS. -
namespace
określa przestrzeń nazw Kubernetes, do których ma zastosowanie ta akcja.
Dodaj następujący fragment kodu na końcu potoku danych. Upewnij się, że zarówno nazwa grupy zasobów, jak i nazwa klastra odpowiadają nazwom, które utworzyłeś wcześniej. Upewnij się, że wcięcie tego zadania jest zgodne z wcięciem zadania pobierania .
- task: KubernetesManifest@1 displayName: Create imagePullSecret inputs: action: createSecret connectionType: azureResourceManager secretName: $(imagePullSecret) dockerRegistryEndpoint: 'Container Registry Connection' azureSubscriptionConnection: 'Kubernetes Cluster Connection' azureResourceGroup: 'tailspin-space-game-rg' kubernetesCluster: 'tailspinspacegame-24591' namespace: 'default'
Andy: Ostatnim krokiem jest uruchomienie wdrożenia naszych obrazów w klastrze Kubernetes. Na podstawie dokumentacji wygląda na to, że możemy użyć tego samego zadania, ale z inną akcją i parametrami.
-
action
wskazuje funkcję do uruchomienia. W tym przypadkudeploy
jest używane do wdrożenia w klastrze AKS. -
connectionType
określa typ połączenia z usługą do użycia. Opcje: azureResourceManager lub kubernetesServiceConnection. -
azureSubscriptionConnection
określa nazwę połączenia usług ARM. -
azureResourceGroup
określa nazwę grupy zasobów. -
kubernetesCluster
określa nazwę klastra AKS. -
namespace
określa przestrzeń nazw Kubernetes, do których ma zastosowanie ta akcja. -
imagePullSecrets
określa listę tajemnic potrzebnych do pobrania z rejestru kontenerów. -
containers
określa listę obrazów kontenerów do wdrożenia.
-
Dodajcie następujący fragment kodu na końcu potoku. Upewnij się, że zarówno nazwa grupy zasobów, jak i nazwa klastra odpowiadają nazwom, które utworzyłeś wcześniej. Upewnij się, że wcięcie tego zadania jest zgodne z poprzednim zadaniem.
- task: KubernetesManifest@1 displayName: Deploy to Kubernetes cluster inputs: action: deploy connectionType: azureResourceManager azureSubscriptionConnection: 'Kubernetes Cluster Connection' azureResourceGroup: 'tailspin-space-game-rg' kubernetesCluster: 'tailspinspacegame-24591' namespace: 'default' manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml imagePullSecrets: | $(imagePullSecret) containers: | $(RegistryName)/$(webRepository):$(tag) $(RegistryName)/$(leaderboardRepository):$(tag)
Uruchom swój potok
Wybierz pozycję Zapisz w prawym górnym rogu strony. Wybierz pozycję Zapisz , aby potwierdzić komunikat zatwierdzenia.
Wybierz Uruchom, potwierdź nazwę gałęzi, a następnie wybierz Uruchom, aby wyzwolić uruchomienie potoku.
Wybierz Pipelines, a następnie wybierz swój potok, aby wyświetlić dzienniki podczas jego uruchamiania.
Po ukończeniu przebiegu potoku wybierz z lewego okienka pozycję Environments, a następnie wybierz środowisko Dev, aby zobaczyć swoje zadania wdrażania.
Teraz zapoznajmy się z wdrożoną aplikacją internetową i punktem końcowym interfejsu API. W tym celu musimy uzyskać zewnętrzne adresy IP zarówno dla usług internetowych , jak i dla usług tablic rankingowych .
Przejdź do witryny Azure Portal, wybierz klaster usługi AKS, a następnie wybierz pozycję Services and ingresses.
Wybierz zewnętrzny adres IP dla swojej usługi sieciowej, aby zobaczyć swoją witrynę w AKS.
Wróć do okna Azure Portal, w którym zakończyłeś, a następnie skopiuj zewnętrzny adres IP dla usługi tablicy wyników. Ten adres IP to miejsce, w którym interfejs API rankingu jest publicznie hostowany.
Zastąp symbol zastępczy w poniższym linku skopiowanym zewnętrznym adresem IP. Możesz również dodać parametr zapytania
pageSize=10
, aby ułatwić wyświetlanie odpowiedzi JSON w przeglądarce. Użyj adresu URL, takiego jak poniższy na nowej karcie przeglądarki.http://[IP]/api/Leaderboard?pageSize=10
Możesz zobaczyć nieprzetworzoną odpowiedź JSON z interfejsu API listy rankingowej hostowanego w klastrze AKS. Masz teraz interfejs API REST, który można wywoływać z innych aplikacji.
Andy: Okazało się to wspaniałe! Myślę, że użycie platformy Kubernetes byłoby dla nas doskonałym sposobem na przyjęcie szerszej strategii mikrousług.