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 a megoldást Docker-tárolóként hozza létre, és üzembe helyezze az Azure App Service-ben. 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 a leckében megtanulhatja, hogyan:
- Frissítse a csővezetéket úgy, hogy egy elkötelezés indítson el 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 klaszterbe.
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 Pipeline-oklehetőséget, majd válassza ki a saját pipeline-ját.
A azure-pipelines.ymlszerkesztéséhez válassza a Szerkesztés lehetőséget.
Andy: Ez volt a korábbi egykonténeres megoldás építési szakasza. Tudtam, hogy nem fog megfelelően futni, ezért letiltottam. Először is újra engedélyezzük a triggerek bekapcsolását a
main
ágon lévő commitok esetében.Cserélje le a fájl tetején található 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 szerepet a ranglista-adattár nevének megadása játssza, amely a következő: ranglista. A másik az üzembe helyezés során az AKS és az ACR példányok közötti megosztáshoz használt kép letöltési titok neve.
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: A webalkalmazás Docker-tárolóként való létrehozásához már van egy feladatunk, 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)
Borravaló
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?
Mara: Említette, hogy a forrásprojektben vannak olyan jegyzékfájlok, amelyek meghatározzák az üzembe helyezést, valamint a Kubernetes által az üzembe helyezéshez szükséges szolgáltatásokat. Ezeket közzé kell tenni, mielőtt befejezzük ezt a szakaszt.
Andy: Kell nekünk? Nem lesznek továbbra is a helyi lemezen?
Mara: Az lenne a helyzet, ha az üzembe helyezési feladatokat ugyanabban a fázisban adnánk hozzá, mint a builddel. Azonban mivel az üzembe helyezési feladatok a saját üzembe helyezési szakaszukban történnek, egy új környezetben futnak, valószínűleg még egy másik végrehajtó egységen 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 manifesztfájlok a mappából át lesznek másolva az új ügynökhöz.
Mara: Erre való a PublishBuildArtifacts@1
feladat. Olyan gyakori, hogy még egy rövidítés is van rá, publish
.
Adjon hozzá egy
publish
feladatot, amely a jegyzékfájlokat mappát tárolja egy későbbi szakaszhoz, ahogyan az az alábbi kódrészletben látható. Győződjön meg arról, hogy a feladat behúzása megegyezik az előző feladat 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 olyanra, amely üzembehelyezési feladatot használ. A ü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és szakaszt (mindazt, ami a build szakasz után van), é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és első lépéseként letöltjük a korábban közzétett jegyzékösszetevőket a
DownloadBuildArtifacts@0
feladat használatával.Andy: Hadd találjam ki, van-e
download
rövidítés erre a feladatra?Mara: Pontosan helyes! A
current
azonosítóval jelezhetjük, hogy a pipeline aktuális futtatásából származó artefaktumot szeretnénk használni.Adja hozzá a kiemelt sorokat a Üzembe helyezés 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 letöltési titoktartási kódot, amely megosztva lesz az ACR és az AKS példányaink között. Tudja, hogy van-e olyan feladat, amit használhatunk?
Mara: Az imént néztem utána, é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 feladatleírás
A Kubernetes-jegyzékfeladat a Kuberneteshez szükséges összes általános üzembe helyezési művelet kezelésére szolgál. Több action
beállítást támogat, amelyek a titkos kódok létrehozásától a rendszerképek üzembe helyezéséig terjednek. Ebben az esetben a createSecret
műveletet használja a következő paraméterekkel együtt:
-
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. Beállítások: azureResourceManager vagy kubernetesServiceConnection. -
secretName
megadja a létrehozandó titkos kód nevét. -
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. - Az
kubernetesCluster
az AKS-fürt nevét adja meg. -
namespace
megadja, hogy a művelet mely Kubernetes-névtérre vonatkozik.
Adja hozzá a következő kódrészletet a csővezeték végére. Győződjön meg arról, hogy az erőforráscsoport és a fürt neve megegyezik a korábban létrehozott nevekkel. Győződjön meg arról, hogy ennek a feladatnak a behúzása megegyezik a letöltési feladat 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ürtön való telepítésének indítá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 esetben adeploy
-t az AKS-fürtön való üzembe helyezésre használjuk. -
connectionType
a használni kívánt szolgáltatáskapcsolat típusát adja meg. Beállítások: azureResourceManager vagy kubernetesServiceConnection. -
azureSubscriptionConnection
az ARM Services-kapcsolat nevét adja meg. -
azureResourceGroup
az erőforráscsoport nevét adja meg. -
kubernetesCluster
az általad megadott AKS-fürt nevét jelöli. -
namespace
megadja, hogy a művelet mely Kubernetes-névtérre vonatkozik. -
imagePullSecrets
megadja a tárolóregisztrációs adatbázisból való lekéréshez szükséges titkos kulcsok listáját. -
containers
az üzembe helyezendő tárolólemezképek listáját adja meg.
-
Adja hozzá a következő kódrészletet a folyamatlánc végéhez. Győződjön meg arról, hogy az erőforráscsoport és a fürt neve megegyezik a korábban létrehozottakkal. Győződjön meg arról, hogy a feladat behúzása megegyezik az előző feladat 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 mentése lehetőséget a lap jobb felső sarkában. Válassza a Mentés lehetőséget a véglegesítési üzenet megerősítéséhez.
Válassza a Futtatáslehető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 ki a Csővezetékeklehetőséget, majd a csővezetékét a naplók futás közbeni megtekintéséhez.
A folyamatfuttatás befejezése után válassza Környezetek lehetőséget a bal oldali panelen, 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 webes és ranglista szolgáltatások külső IP-címét.
Lépjen az Azure Portalra, válassza ki az AKS-fürtöt, majd válassza a Szolgáltatások és belépési pontoklehetőséget.
Válassza ki a webes szolgáltatáshoz tartozó külső IP- a webhely AKS-en való megtekintéséhez.
Lépjen vissza az Azure Portal ablakába, ahol abbahagyta, majd másolja a ranglista szolgáltatáshoz tartozó külső IP-. Ez az IP-cím az, ahol a ranglista API nyilvánosan üzemel.
Cserélje le a következő hivatkozásban található helyőrzőt a másolt külső IP-címre. Hozzáadhat egy
pageSize=10
lekérdezési paramétert is, amely megkönnyíti a JSON-válasz megtekintését 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 nagyszerű volt! Azt hiszem, a Kubernetes használata nagyszerű módszer lenne arra, hogy szélesebb körű mikroszolgáltatási stratégiát fogadjunk el.