Ćwiczenie — wdrażanie rozwiązania z wieloma kontenerami w klastrze Kubernetes

Ukończone

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

  1. Zaloguj się do organizacji usługi Azure DevOps, a następnie przejdź do projektu.

  2. Wybierz Pipelines, a następnie wybierz swój pipeline.

  3. 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.

  4. 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.

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

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

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

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

  2. 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 przypadku createSecret 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.
  1. 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 przypadku deploy 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.
  2. 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

  1. Wybierz pozycję Zapisz w prawym górnym rogu strony. Wybierz pozycję Zapisz , aby potwierdzić komunikat zatwierdzenia.

  2. Wybierz Uruchom, potwierdź nazwę gałęzi, a następnie wybierz Uruchom, aby wyzwolić uruchomienie potoku.

  3. Wybierz Pipelines, a następnie wybierz swój potok, aby wyświetlić dzienniki podczas jego uruchamiania.

  4. Po ukończeniu przebiegu potoku wybierz z lewego okienka pozycję Environments, a następnie wybierz środowisko Dev, aby zobaczyć swoje zadania wdrażania.

  5. 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 .

  6. Przejdź do witryny Azure Portal, wybierz klaster usługi AKS, a następnie wybierz pozycję Services and ingresses.

    Zrzut ekranu przedstawiający, jak znaleźć zewnętrzne adresy IP dla usług internetowych i rankingowych.

  7. Wybierz zewnętrzny adres IP dla swojej usługi sieciowej, aby zobaczyć swoją witrynę w AKS.

    Zrzut ekranu witryny internetowej Space Game.

  8. 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.

  9. 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
    
  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.

    Zrzut ekranu przedstawiający przeglądarkę internetową z odpowiedzią JSON z usługi rankingu.

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.