Gyakorlat – Többtárolós megoldás üzembe helyezése Kubernetes-fürtön

Befejeződött

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

  1. Jelentkezzen be az Azure DevOps-szervezetbe, és lépjen a projekthez.

  2. Válassza a Folyamatok lehetőséget, majd válassza ki a folyamatot.

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

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

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

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

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

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

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

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

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

  3. Válassza a Folyamatok lehetőséget, majd válassza ki a folyamatot a naplók folyamatfuttatásként való megtekintéséhez.

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

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

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

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

  7. Válassza ki a webszolgáltatás külső IP-címéta webhely AKS-en való megtekintéséhez.

    Screenshot of the Space Game web site.

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

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

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

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.