Cvičení – nasazení řešení s více kontejnery do clusteru Kubernetes
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ů
Přihlaste se ke své organizaci Azure DevOps a přejděte k projektu.
Vyberte Kanály a pak svůj kanál.
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.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í.
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ů.
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
.
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ší.
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.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.
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.
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
V pravém horním rohu stránky vyberte Uložit . Výběrem možnosti Uložit potvrďte potvrzení zprávy.
Vyberte Spustit, potvrďte název větve a pak vyberte Spustit , aby se aktivovalo spuštění kanálu.
Vyberte Kanály a pak vyberte kanál, abyste zobrazili protokoly při spuštění kanálu.
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í.
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ů.
Přejděte na web Azure Portal, vyberte cluster AKS a pak vyberte Služby a příchozí přenos dat.
Vyberte externí IP adresu pro vaši webovou službu a zobrazte web v AKS.
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é.
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
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í.
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.