Gyakorlat – Többtárolós megoldás üzembe helyezése Kubernetes-fürtön
A projekthez biztosított kiadási folyamat úgy lett kialakítva, hogy Docker-tárolóként hozza létre a megoldást, és üzembe helyezze azt Azure-alkalmazás Szolgáltatásban. Több tároló Kubernetes-fürtön való üzembe helyezésének támogatásához módosítania kell ezt a folyamatot.
Ebben az egységben a következőket sajátíthatja el:
- Frissítse a folyamatot úgy, hogy egy véglegesítést aktiváljon a főágban.
- Definiálja a folyamaton keresztül megosztani kívánt változókat.
- Docker-rendszerképek létrehozása és közzététele.
- Kubernetes-jegyzékek közzététele.
- Adjon hozzá egy feladatot egy kép lekérési titkos kódjának létrehozásához a Kubernetes és a tárolóregisztrációs adatbázispéldányok közötti használatra.
- Frissített rendszerképek üzembe helyezése Kubernetes-fürtön.
A folyamat frissítése az eseményindítók támogatásához
Jelentkezzen be az Azure DevOps-szervezetbe, és lépjen a projekthez.
Válassza a Folyamatok lehetőséget, majd válassza ki a folyamatot.
Válassza a Szerkesztés lehetőséget a azure-pipelines.yml szerkesztéséhez.
Andy: Ez volt az előző egytárolós megoldás buildelési szakasza. Tudtam, hogy nem fog megfelelően futni, ezért letiltottam. Első lépésként újra engedélyezzük az eseményindítókat az
main
ághoz való véglegesítéseken.Cserélje le a fájl tetején lévő meglévő
trigger
sort a következő kódrészletre. Ez elindítja a folyamat futtatását minden alkalommal, amikor véglegesítés történik a főágban.trigger: - 'main'
Folyamaton keresztül elérhető változók definiálása
Andy: Két folyamatváltozót kell hozzáadnunk. Az egyik a ranglista-adattár nevének megadására, amely a ranglista. A másik az AKS és az ACR-példányok közötti megosztáshoz használt rendszerkép lekéréses titkos kódjának neve az üzembe helyezés során.
Adja hozzá a következő kiemelt kódot a
variables
szakaszhoz.variables: buildConfiguration: 'Release' leaderboardRepository: 'leaderboard' webRepository: 'web' tag: '$(Build.BuildId)' imagePullSecret: 'secret'
Docker-rendszerkép létrehozása és közzététele az Azure Container Registryben
Andy: Már van egy feladatunk a webalkalmazás Docker-tárolóként való létrehozásához, amelyet közzéteszünk a tárolóregisztrációs adatbázisunkban. Használhatunk egy második feladatot is, hogy ugyanezt tegyünk a ranglistánkon is.
Adjon hozzá egy második
Docker@2
feladatot a ranglista-tároló létrehozásához és közzétételéhez az alábbi kiemelt kódrészlet használatával. Adja hozzá ezt a feladatot közvetlenül a webtároló-tevékenység után.- 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)
Tipp.
Győződjön meg arról, hogy az itt hozzáadott tevékenység konzisztens behúzást használ az előző tevékenységhez, mivel a whitespace fontos egy YAML-fájlban.
A Kubernetes-jegyzékek közzététele
Andy: Azt hiszem, továbbléphetünk a következő fázisra. Látsz valamit, ami hiányzik?
Megemlítette, hogy a forrásprojektben vannak olyan jegyzékfájlok, amelyek meghatározzák az üzembe helyezést, valamint a Kubernetes által igényelt szolgáltatásokat az üzembe helyezés során. Ezeket közzé kell tenni, mielőtt befejezzük ezt a szakaszt.
Andy: Szükség van rá? Nem lesznek továbbra is a helyi lemezen?
Mara: Az lenne az, ha az üzembe helyezési feladatokat a buildel egy fázison belül adnánk hozzá. Mivel azonban az üzembe helyezési feladatok a saját üzembe helyezési fázisukban történnek, friss környezetben fut, valószínűleg egy másik ügynökön is. Mindenképpen közzé kell tnnünk mindent, amit ez a szakasz hoz létre, amire a másik szakasznak szüksége van.
Andy: Ez egy nagyszerű pont. Könnyű megtenni? Csak meg kell győződnünk arról, hogy a jegyzékfájl mappája át lesz másolva az új ügynökre.
Mara: Ez az, ami a PublishBuildArtifacts@1
feladat. Olyan gyakori, hogy még egy rövidke is van rá publish
.
Adjon hozzá egy
publish
feladatot, amely egy későbbi szakasz Jegyzékfájl mappáját tárolja az alábbi kódrészletben látható módon. Győződjön meg arról, hogy a tevékenység behúzása megegyezik az előző tevékenység behúzásával.- 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
Az üzembe helyezési szakasz cseréje
Mara: Lecserélem a meglévő üzembe helyezési szakaszt egy üzembehelyezési feladatot használóra. Az üzembehelyezési feladat egy speciális feladat, amely lehetővé teszi az üzembe helyezés társítását a korábban létrehozott Azure DevOps-környezettel. Ez megkönnyíti az üzembe helyezési előzmények nyomon követését, ami különösen hasznos lesz, mivel megoldásaink kifinomultabbak lesznek.
Távolítsa el a meglévő üzembe helyezési szakaszt (mindent a buildelési szakasz után), és cserélje le a következő kódrészletre. Jegyezze fel a kiemelt sort, amely a használni kívánt üzembehelyezési környezetet jelzi.
- 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: Az üzembe helyezési szakasz első lépéseként töltse le a tevékenység használatával
DownloadBuildArtifacts@0
korábban közzétett jegyzék-összetevőket.Andy: Hadd találjam ki, van egy
download
rövidke erre a feladatra?Mara: Pontosan helyes! A kijelölő használatával
current
jelezhetjük, hogy az összetevőt a folyamat aktuális futtatásából szeretnénk létrehozni.Adja hozzá a kiemelt sorokat az üzembe helyezési szakasz első lépéseként.
- 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: Most létre kell hoznunk egy kép lekéréses titkos kódjait, amelyet meg kell osztani az ACR és az AKS-példányok között. Tudja, hogy van-e olyan feladat, amit használhatunk?
Csak felnéztem, és szerencsénk van. A
KubernetesManifest@0
feladat támogatja a szükséges titkos kód létrehozásához szükséges műveletet.
Kubernetes jegyzékfájl-feladat
A Kubernetes-jegyzékfeladat célja a Kuberneteshez szükséges összes általános üzembe helyezési művelet kezelése. Több action
lehetőséget is támogat, amelyek a titkos kódok létrehozásától a rendszerképek üzembe helyezéséig terjednek. Ebben az esetben a rendszer a createSecret
következő paraméterekkel együtt használja a műveletet:
action
a futtatandó funkciót jelzi. Ebben az esetbencreateSecret
létrehozza a megosztott titkos kulcsot.connectionType
a használni kívánt szolgáltatáskapcsolat típusát adja meg. Lehetőségek: azureResourceManager vagy kubernetesService Csatlakozás ion.secretName
A létrehozandó titkos kód nevét adja meg.dockerRegistryEndpoint
az Azure Container Registry Services-kapcsolat nevét adja meg.azureSubscriptionConnection
az ARM Services-kapcsolat nevét adja meg.azureResourceGroup
az erőforráscsoport nevét adja meg.kubernetesCluster
az AKS-fürt nevét adja meg.namespace
megadja azt a Kubernetes-névteret, amelyre a művelet vonatkozik.
Adja hozzá a következő kódrészletet a folyamat végéhez. Győződjön meg arról, hogy az erőforráscsoport neve és a fürt neve megegyezik a korábban létrehozottak nevével. Győződjön meg arról, hogy a tevékenység behúzása megegyezik a letöltési tevékenység behúzásával.
- 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: Az utolsó lépés a rendszerképek Kubernetes-fürtben való üzembe helyezésének aktiválása. A dokumentáció alapján úgy tűnik, hogy ugyanazt a feladatot használhatjuk, de egy másik művelettel és paraméterekkel.
action
a futtatandó funkciót jelzi. Ebben az esetbendeploy
az AKS-fürtön való üzembe helyezéshez.connectionType
a használni kívánt szolgáltatáskapcsolat típusát adja meg. Lehetőségek: azureResourceManager vagy kubernetesService Csatlakozás ion.azureSubscriptionConnection
az ARM Services-kapcsolat nevét adja meg.azureResourceGroup
az erőforráscsoport nevét adja meg.kubernetesCluster
az AKS-fürt nevét adja meg.namespace
megadja azt a Kubernetes-névteret, amelyre a művelet vonatkozik.imagePullSecrets
A tárolóregisztrációs adatbázisból való lekéréshez szükséges titkos kulcsok listáját adja meg.containers
az üzembe helyezendő tárolólemezképek listáját adja meg.
Adja hozzá a következő kódrészletet a folyamat végéhez. Győződjön meg arról, hogy az erőforráscsoport neve és a fürt neve megegyezik a korábban létrehozottak nevével. Győződjön meg arról, hogy a tevékenység behúzása megegyezik az előző tevékenység behúzásával.
- 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)
A folyamat futtatása
Válassza a Lap jobb felső sarkában található Mentés lehetőséget. Válassza a Mentés lehetőséget a véglegesítési üzenet megerősítéséhez.
Válassza a Futtatás lehetőséget, erősítse meg az ág nevét, majd válassza a Futtatás lehetőséget a folyamatfuttatás elindításához.
Válassza a Folyamatok lehetőséget, majd válassza ki a folyamatot a naplók folyamatfuttatásként való megtekintéséhez.
A folyamatfuttatás befejezése után a bal oldali panelen válassza a Környezetek lehetőséget, majd válassza ki a Fejlesztői környezetet az üzembehelyezési feladatok megtekintéséhez.
Most nézzük meg az üzembe helyezett webalkalmazást és API-végpontot. Ehhez le kell szereznünk a külső IP-címeket mind a webes, mind a ranglista-szolgáltatásokhoz.
Lépjen az Azure Portalra, válassza ki az AKS-fürtöt, majd válassza a Szolgáltatások és bejövő forgalom lehetőséget.
Válassza ki a webszolgáltatás külső IP-címét a webhely AKS-en való megtekintéséhez.
Térjen vissza az Azure Portal ablakához, ahol abbahagyta, majd másolja a ranglista-szolgáltatás külső IP-címét. Ez az IP-cím az, ahol a ranglista API nyilvánosan üzemel.
Cserélje le a következő hivatkozás helyőrzőjének helyét a másolt külső IP-címre. Egy lekérdezési paramétert is hozzáadhat
pageSize=10
, hogy könnyebben megtekinthesse a JSON-választ a böngészőben. Új böngészőlapon használjon az alábbihoz hasonló URL-címet.http://[IP]/api/Leaderboard?pageSize=10
Az AKS-fürtben üzemeltetett ranglista API nyers JSON-válaszát megtekintheti. Most már rendelkezik egy REST API-val, amelyet más alkalmazásokból hívhat meg.
Andy: Ez kiderült, nagyszerű! Azt hiszem, a Kubernetes használata nagyszerű módszer lenne arra, hogy szélesebb körű mikroszolgáltatási stratégiát fogadjunk el.