Cvičení – nasazení řešení s více kontejnery do clusteru Kubernetes

Dokončeno

Kanál verze poskytovaný vaším projektem je navržený tak, aby sestavil řešení jako kontejner Dockeru a nasadil ho do služby Aplikace Azure Service. Pokud chcete podporovat nasazení více kontejnerů do clusteru Kubernetes, musíte tento kanál upravit.

V této lekci se naučíte:

  • Aktualizujte kanál tak, aby se aktivoval při potvrzení do hlavní větve.
  • Definujte proměnné, které se mají sdílet v rámci kanálu.
  • Sestavte a publikujte image Dockeru.
  • Publikování manifestů Kubernetes
  • Přidejte úlohu pro vytvoření tajného kódu pro vyžádání image pro použití mezi instancemi registru Kubernetes a kontejneru.
  • Nasazení aktualizovaných imagí do clusteru Kubernetes

Aktualizace kanálu pro podporu triggerů

  1. Přihlaste se ke své organizaci Azure DevOps a přejděte k projektu.

  2. Vyberte Kanály a pak svůj kanál.

  3. Vyberte Upravit a upravte azure-pipelines.yml.

    Andy: Toto byla fáze sestavení, kterou jsme použili pro předchozí řešení s jedním kontejnerem. Věděl jsem, že to nebude fungovat správně, takže jsem ho zakázal. Můžeme začít opětovným povolením triggerů při potvrzeních ve main větvi.

  4. Nahraďte existující trigger řádek v horní části souboru následujícím fragmentem kódu. Tím se aktivuje spuštění kanálu při každém potvrzení do hlavní větve.

    trigger:
    - 'main'
    

Definování proměnných přístupných v rámci kanálu

Andy: Budeme muset přidat dvě proměnné kanálu. Jedno pro zadání názvu úložiště tabulky výsledků, což je tabulka výsledků. Druhým je název tajného klíče pro vyžádání obsahu image, který se používá ke sdílení mezi instancemi AKS a ACR během nasazování.

  1. Do oddílu variables přidejte následující zvýrazněný kód.

    variables:
      buildConfiguration: 'Release'
      leaderboardRepository: 'leaderboard'
      webRepository: 'web'
      tag: '$(Build.BuildId)'
      imagePullSecret: 'secret'
    

Sestavení a publikování image Dockeru do služby Azure Container Registry

Andy: Už máme úlohu pro vytvoření webové aplikace jako kontejneru Dockeru, který publikujeme do registru kontejneru. Druhý úkol můžeme použít jenom k tomu, abychom to udělali pro naši tabulku výsledků.

  1. Přidejte druhý Docker@2 úkol pro sestavení a publikování kontejneru tabulky výsledků pomocí následujícího zvýrazněného fragmentu kódu. Přidejte tento úkol přímo za úlohu webového kontejneru.

    - 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)
    

Tip

Ujistěte se, že zde přidaný úkol používá konzistentní odsazení s předchozím úkolem jako prázdné znaky v souboru YAML.

Publikování manifestů Kubernetes

Andy: Myslím, že můžeme přejít na další fázi. Vidíte něco, co chybí?

Mara: Zmínili jste se, že ve zdrojovém projektu byly nějaké soubory manifestu, které definují nasazení a služby, které Kubernetes potřebuje při nasazení. Před dokončením této fáze bychom je měli publikovat.

Andy: Potřebujeme? Nebudou stále na místním disku?

Mara: Kdybysme přidali úlohy nasazení ve stejné fázi jako sestavení. Vzhledem k tomu, že naše úlohy nasazení probíhají ve své vlastní fázi nasazení , běží v novém prostředí, pravděpodobně i na jiném agentovi. Měli bychom být jisti, že publikovat cokoli tato fáze vytvoří, že druhá fáze potřebuje.

Andy: To je skvělý bod. Je to snadné? Stačí zajistit, aby se složka manifestů zkopírovala do nového agenta.

Mara: To je to PublishBuildArtifacts@1 , k čemu je úkol. Je to tak běžné, že tam je dokonce i zkratka pro to, publish.

  1. publish Přidejte úlohu, která ukládá složku manifestů pro budoucí fázi, jak je znázorněno v následujícím fragmentu kódu. Ujistěte se, že odsazení tohoto úkolu odpovídá odsazení předchozího úkolu.

    - 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
    

Nahrazení fáze nasazení

Mara: Nahradím naši stávající fázi nasazení tím, která používá úlohu nasazení. Úloha nasazení je speciální druh úlohy, která nám umožňuje přidružit nasazení k prostředí Azure DevOps vytvořenému dříve. To usnadňuje sledování historie nasazení, což bude zvlášť užitečné, protože naše řešení jsou propracovanější.

  1. Odeberte existující fázi nasazení (vše po fázi sestavení) a nahraďte ji následujícím fragmentem kódu. Poznamenejte si zvýrazněný řádek, který označuje, které prostředí nasazení se má využít.

    - 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: Prvním krokem, který přidáme do fáze nasazení, je stažení artefaktů manifestu publikovaných dříve pomocí DownloadBuildArtifacts@0 úlohy.

    Andy: Uhádnu, je tu zkratka download pro tento úkol?

    Mara: Přesně správně! Specifikátor můžeme použít current k označení, že chceme artefakt z aktuálního spuštění kanálu.

  2. Přidejte zvýrazněné řádky jako první krok fáze nasazení .

    - 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: Teď potřebujeme vytvořit tajný kód pro vyžádání image, který se bude sdílet mezi instancemi ACR a AKS. Víte, jestli existuje úkol, který můžeme použít?

    Mara: Jen jsem to hledala a máme štěstí. Úkol KubernetesManifest@0 podporuje akci pro vytvoření potřebného tajného kódu.

Úloha manifestu Kubernetes

Úloha manifestu Kubernetes je navržená tak, aby spravuje všechny hlavní operace nasazení vyžadované pro Kubernetes. Podporuje několik action možností, od vytváření tajných kódů až po nasazování imagí. V tomto případě createSecret se akce použije spolu s následujícími parametry:

  • action označuje funkci, která se má spustit. V tomto případě createSecret vytvoří sdílený tajný klíč.
  • connectionType určuje typ připojení služby, které se má použít. Možnosti: azureResourceManager nebo kubernetesService Připojení ion.
  • secretName určuje název tajného kódu, který se má vytvořit.
  • dockerRegistryEndpoint určuje název připojení služby Azure Container Registry Services.
  • azureSubscriptionConnection určuje název připojení služeb ARM.
  • azureResourceGroup určuje název vaší skupiny prostředků.
  • kubernetesCluster určuje název vašeho clusteru AKS.
  • namespace určuje obor názvů Kubernetes, na který se tato akce vztahuje.
  1. Na konec kanálu přidejte následující fragment kódu. Ujistěte se, že název skupiny prostředků i název clusteru odpovídají názvům dříve vytvořených skupin prostředků. Ujistěte se, že odsazení tohoto úkolu odpovídá odsazení úkolu stahování .

    - 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: Posledním krokem je aktivace nasazení našich imagí do clusteru Kubernetes. Na základě dokumentace to vypadá, že můžeme použít stejný úkol, ale s jinou akcí a parametry.

    • action označuje funkci, která se má spustit. V tomto případě deploy se nasadí do clusteru AKS.
    • connectionType určuje typ připojení služby, které se má použít. Možnosti: azureResourceManager nebo kubernetesService Připojení ion.
    • azureSubscriptionConnection určuje název připojení služeb ARM.
    • azureResourceGroup určuje název vaší skupiny prostředků.
    • kubernetesCluster určuje název vašeho clusteru AKS.
    • namespace určuje obor názvů Kubernetes, na který se tato akce vztahuje.
    • imagePullSecrets určuje seznam tajných kódů potřebných k načtení z registru kontejneru.
    • containers určuje seznam imagí kontejneru, které se mají nasadit.
  2. Na konec kanálu přidejte následující fragment kódu. Ujistěte se, že název skupiny prostředků i název clusteru odpovídají názvům dříve vytvořených skupin prostředků. Ujistěte se, že odsazení tohoto úkolu odpovídá odsazení předchozího úkolu.

    - 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)
    

Spuštění kanálu

  1. V pravém horním rohu stránky vyberte Uložit . Výběrem možnosti Uložit potvrďte potvrzení zprávy.

  2. Vyberte Spustit, potvrďte název větve a pak vyberte Spustit , aby se aktivovalo spuštění kanálu.

  3. Vyberte Kanály a pak vyberte kanál, abyste zobrazili protokoly při spuštění kanálu.

  4. Po dokončení spuštění kanálu vyberte v levém podokně prostředí a pak vyberte vývojové prostředí, abyste zobrazili úlohy nasazení.

  5. Teď se podívejme na naši nasazenou webovou aplikaci a koncový bod rozhraní API. K tomu potřebujeme získat externí IP adresy pro webové služby i služby tabulky výsledků.

  6. Přejděte na web Azure Portal, vyberte cluster AKS a pak vyberte Služby a příchozí přenos dat.

    Screenshot of how to find the external IPs for your web and leaderboard services.

  7. Vyberte externí IP adresu pro vaši webovou službu a zobrazte web v AKS.

    Screenshot of the Space Game web site.

  8. Vraťte se do okna webu Azure Portal, kde jste skončili, a zkopírujte externí IP adresu pro službu tabulky výsledků. Tato IP adresa je místem, kde je rozhraní API tabulky výsledků veřejně hostované.

  9. Zástupný symbol v následujícím odkazu nahraďte externí IP adresou, kterou jste zkopírovali. Můžete také přidat pageSize=10 parametr dotazu, který usnadňuje zobrazení odpovědi JSON v prohlížeči. Na nové kartě prohlížeče použijte adresu URL, která je podobná následující.

    http://[IP]/api/Leaderboard?pageSize=10
    
  10. Nezpracovanou odpověď JSON můžete zobrazit z rozhraní API tabulky výsledků hostovaného v clusteru AKS. Teď máte rozhraní REST API, které můžete volat z jiných aplikací.

    Screenshot of a web browser showing the JSON response from the leaderboard service.

Andy: To se ukázalo skvěle! Myslím, že použití Kubernetes by pro nás bylo skvělým způsobem, jak přijmout širší strategii mikroslužeb.