Kompilowanie i wdrażanie w usłudze Azure Kubernetes Service za pomocą usługi Azure Pipelines

Usługa Azure DevOps Services

Użyj usługi Azure Pipelines do automatycznego wdrażania w usłudze Azure Kubernetes Service (AKS). Usługa Azure Pipelines umożliwia tworzenie, testowanie i wdrażanie za pomocą ciągłej integracji (CI) i ciągłego dostarczania (CD) przy użyciu usługi Azure DevOps.

W tym artykule dowiesz się, jak utworzyć potok, który stale kompiluje i wdraża aplikację. Za każdym razem, gdy zmieniasz kod w repozytorium zawierającym plik Dockerfile, obrazy są wypychane do Azure Container Registry, a manifesty są następnie wdrażane w klastrze usługi AKS.

Wymagania wstępne

Uzyskiwanie kodu

Rozwidlenie następującego repozytorium zawierającego przykładową aplikację i plik Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Tworzenie zasobów platformy Azure

Zaloguj się do Azure Portal, a następnie wybierz przycisk Cloud Shell w prawym górnym rogu.

Tworzenie rejestru kontenerów

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Logowanie się do usługi Azure Pipelines

Zaloguj się do usługi Azure Pipelines. Po zalogowaniu przeglądarka przejdzie do https://dev.azure.com/my-organization-name pulpitu nawigacyjnego usługi Azure DevOps i wyświetli go.

W wybranej organizacji utwórz projekt. Jeśli w organizacji nie masz żadnych projektów, zobaczysz ekran Tworzenie projektu, aby rozpocząć pracę . W przeciwnym razie wybierz przycisk Utwórz projekt w prawym górnym rogu pulpitu nawigacyjnego.

Tworzenie potoku

Połącz i wybierz repozytorium

  1. Zaloguj się do organizacji usługi Azure DevOps i przejdź do projektu.

  2. Przejdź do pozycji Potoki, a następnie wybierz pozycję Nowy potok.

  3. Wykonaj kroki kreatora, wybierając najpierw usługę GitHub jako lokalizację kodu źródłowego.

  4. Być może nastąpi przekierowanie do usługi GitHub w celu zalogowania się. Jeśli tak, wprowadź poświadczenia usługi GitHub.

  5. Po wyświetleniu listy repozytoriów wybierz repozytorium.

  6. Być może nastąpi przekierowanie do usługi GitHub w celu zainstalowania aplikacji usługi Azure Pipelines. Jeśli tak, wybierz pozycję Zatwierdź instalację&.

  7. Wybierz pozycję Wdróż, aby Azure Kubernetes Service.

  8. Jeśli zostanie wyświetlony monit, wybierz subskrypcję, w której utworzono rejestr i klaster.

  9. myapp Wybierz klaster.

  10. W obszarze Przestrzeń nazw wybierz pozycję Istniejąca, a następnie wybierz pozycję domyślną.

  11. Wybierz nazwę rejestru kontenerów.

  12. Możesz pozostawić nazwę obrazu ustawioną na wartość domyślną.

  13. Ustaw port usługi na 8080.

  14. Ustaw pole wyboru Włącz przeglądanie aplikacji dla żądań ściągnięcia, aby przejrzeć konfigurację aplikacji, która ma zostać uwzględniona w potoku, automatycznie wygenerowana w kolejnych krokach.

  15. Wybierz pozycję Weryfikuj i skonfiguruj.

    Podczas tworzenia potoku przez usługę Azure Pipelines proces będzie następujący:

    • Utwórz połączenie usługi rejestru platformy Docker , aby umożliwić potokowi wypychanie obrazów do rejestru kontenerów.

    • Utwórz środowisko i zasób Kubernetes w środowisku. W przypadku klastra z obsługą kontroli dostępu opartej na rolach utworzony zasób Kubernetes niejawnie tworzy obiekty ServiceAccount i RoleBinding w klastrze, aby utworzony obiekt ServiceAccount nie mógł wykonywać operacji poza wybraną przestrzenią nazw.

    • Wygeneruj plik azure-pipelines.yml , który definiuje potok.

    • Generowanie plików manifestu platformy Kubernetes. Te pliki są generowane przez nawodnienie szablonów deployment.yml i service.yml na podstawie wybranych opcji. Gdy wszystko będzie gotowe, wybierz pozycję Zapisz i uruchom.

  16. Wybierz polecenie Zapisz i uruchom.

  17. Możesz zmienić komunikat Zatwierdzenia na coś takiego jak Dodawanie potoku do naszego repozytorium. Gdy wszystko będzie gotowe, wybierz pozycję Zapisz i uruchom , aby zatwierdzić nowy potok w repozytorium, a następnie rozpocznij pierwszy przebieg nowego potoku.

Wyświetlanie wdrożenia aplikacji

Po uruchomieniu potoku watch jako etap kompilacji, a następnie etap wdrożenia, przejdź od niebieskiego (uruchomionego) do zielonego (ukończono). Możesz wybrać etapy i zadania, aby watch potoku w akcji.

Uwaga

Jeśli używasz agenta hostowanego przez firmę Microsoft, musisz dodać zakres adresów IP agenta hostowanego przez firmę Microsoft do zapory. Pobierz cotygodniową listę zakresów adresów IP z cotygodniowego pliku JSON, który jest publikowany w każdą środę. Nowe zakresy adresów IP zaczynają obowiązywać w najbliższy poniedziałek. Aby uzyskać więcej informacji, zobacz Agenci hostowani przez firmę Microsoft. Aby znaleźć zakresy adresów IP wymagane dla organizacji usługi Azure DevOps, dowiedz się, jak identyfikować możliwe zakresy adresów IP dla agentów hostowanych przez firmę Microsoft.

Po zakończeniu przebiegu potoku sprawdź, co się stało, a następnie zobacz wdrożona aplikacja. Z podsumowania potoku:

  1. Wybierz kartę Środowiska .

  2. Wybierz pozycję Wyświetl środowisko.

  3. Wybierz wystąpienie aplikacji dla wdrożonej przestrzeni nazw. Jeśli użyto wartości domyślnych, jest to aplikacja myapp w domyślnej przestrzeni nazw.

  4. Wybierz kartę Usługi .

  5. Wybierz i skopiuj zewnętrzny adres IP do schowka.

  6. Otwórz nową kartę lub okno przeglądarki i wprowadź <adres> IP:8080.

Jeśli tworzysz naszą przykładową aplikację, w przeglądarce pojawi się komunikat Hello World .

Jak kompiluje się potok

Po zakończeniu wybierania opcji, a następnie przejdź do weryfikacji i skonfigurowania potoku usługi Azure Pipelines utworzonego potoku przy użyciu szablonu Wdrażanie do Azure Kubernetes Service.

Etap kompilacji używa zadania platformy Docker do kompilowania i wypychania obrazu do Azure Container Registry.

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

Zadanie wdrażania używa zadania manifestu Kubernetes do utworzenia imagePullSecret wymaganych przez węzły klastra Kubernetes do pobrania z zasobu Azure Container Registry. Pliki manifestu są następnie używane przez zadanie manifestu Kubernetes do wdrożenia w klastrze Kubernetes. Pliki service.yml manifestu i deployment.yml, zostały wygenerowane podczas korzystania z szablonu Wdrażanie do Azure Kubernetes Service.

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Czyszczenie zasobów

Za każdym razem, gdy skończysz z utworzonymi zasobami, możesz użyć następującego polecenia, aby je usunąć:

az group delete --name myapp-rg

Wprowadź po y wyświetleniu monitu.

Azure DevOps Services | Azure DevOps Server 2020 r. | Azure DevOps Server 2019 r.

Użyj usługi Azure Pipelines do automatycznego wdrażania w usłudze Azure Kubernetes Service (AKS). Usługa Azure Pipelines umożliwia tworzenie, testowanie i wdrażanie za pomocą ciągłej integracji (CI) i ciągłego dostarczania (CD) przy użyciu usługi Azure DevOps.

W tym artykule dowiesz się, jak utworzyć potok, który stale kompiluje i wdraża aplikację. Za każdym razem, gdy zmieniasz kod w repozytorium zawierającym plik Dockerfile, obrazy są wypychane do Azure Container Registry, a manifesty są następnie wdrażane w klastrze usługi AKS.

Wymagania wstępne

Uzyskiwanie kodu

Rozwidlenie następującego repozytorium zawierającego przykładową aplikację i plik Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Tworzenie zasobów platformy Azure

Zaloguj się do Azure Portal, a następnie wybierz przycisk Cloud Shell w prawym górnym rogu.

Tworzenie rejestru kontenerów

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name myContainerRegistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

Konfigurowanie uwierzytelniania

W przypadku używania Azure Container Registry (ACR) z usługą Azure Kubernetes Service (AKS) należy ustanowić mechanizm uwierzytelniania. Można to osiągnąć na dwa sposoby:

  1. Udzielanie usłudze AKS dostępu do usługi ACR. Zobacz Uwierzytelnianie przy użyciu Azure Container Registry z Azure Kubernetes Service.

  2. Użyj wpisu tajnego ściągania obrazu Kubernetes. Wpis tajny ściągania obrazu można utworzyć przy użyciu zadania wdrażania platformy Kubernetes.

Tworzenie potoku wydania

Potok kompilacji używany do konfigurowania ciągłej integracji już skompilował obraz platformy Docker i wypchnął go do Azure Container Registry. Został on również spakowany i opublikowany jako artefakt programu Helm. W potoku wydania wdrożymy obraz kontenera jako aplikację Helm w klastrze usługi AKS.

  1. W usłudze Azure Pipelines otwórz podsumowanie kompilacji.

  2. W podsumowaniu kompilacji wybierz ikonę Wydanie , aby uruchomić nowy potok wydania.

    Jeśli wcześniej utworzono potok wydania, który używa tych artefaktów kompilacji, zostanie wyświetlony monit o utworzenie nowej wersji. W takim przypadku przejdź do strony Wydania i uruchom stamtąd nowy potok wydania, wybierając ikonę + .

  3. Wybierz szablon Puste zadanie .

  4. Otwórz stronę Zadania i wybierz pozycję Zadanie agenta.

  5. Wybierz + dodanie nowego zadania i dodanie zadania instalatora narzędzia Helm . Gwarantuje to, że agent, na którym są uruchomione kolejne zadania, jest zainstalowany program Helm i platforma Kubectl.

  6. Wybierz + ponownie i dodaj zadanie Pakiet i wdróż pakiety Helm . Skonfiguruj ustawienia dla tego zadania w następujący sposób:

    • Typ połączenia: wybierz pozycję Azure Resource Manager, aby nawiązać połączenie z klastrem usługi AKS przy użyciu połączenia z usługą platformy Azure. Alternatywnie, jeśli chcesz nawiązać połączenie z dowolnym klastrem Kubernetes przy użyciu narzędzia kubeconfig lub konta usługi, możesz wybrać pozycję Połączenie usługi Kubernetes Service. W takim przypadku należy utworzyć i wybrać połączenie usługi Kubernetes zamiast subskrypcji platformy Azure dla następującego ustawienia.

    • Subskrypcja platformy Azure: wybierz połączenie z listy w obszarze Dostępne połączenia usługi platformy Azure lub utwórz bardziej ograniczone połączenie uprawnień z subskrypcją platformy Azure. Jeśli obok danych wejściowych zostanie wyświetlony przycisk Autoryzuj , użyj go do autoryzowania połączenia z subskrypcją platformy Azure. Jeśli nie widzisz wymaganej subskrypcji platformy Azure na liście subskrypcji, zobacz Tworzenie połączenia usługi platformy Azure w celu ręcznego skonfigurowania połączenia.

    • Grupa zasobów: wprowadź lub wybierz grupę zasobów zawierającą klaster usługi AKS.

    • Klaster Kubernetes: wprowadź lub wybierz utworzony klaster usługi AKS.

    • Polecenie: wybierz init jako polecenie Helm. Spowoduje to zainstalowanie narzędzia Tiller w uruchomionym klastrze Kubernetes. Ponadto skonfiguruje ona dowolną wymaganą konfigurację lokalną. Tick Użyj wersji obrazu kanarowego , aby zainstalować najnowszą wersję wstępną tillera. Możesz również zdecydować się na uaktualnienie Tiller, jeśli jest on wstępnie zainstalowany, zaznaczając opcję Uaktualnij Tiller. Jeśli te opcje są włączone, zadanie zostanie uruchomione helm init --canary-image --upgrade

  7. Wybierz + w zadaniu agenta i dodaj kolejny pakiet i wdróż zadanie charts programu Helm . Skonfiguruj ustawienia dla tego zadania w następujący sposób:

    • Klaster Kubernetes: wprowadź lub wybierz utworzony klaster usługi AKS.

    • Przestrzeń nazw: wprowadź przestrzeń nazw klastra Kubernetes, w której chcesz wdrożyć aplikację. Platforma Kubernetes obsługuje wiele klastrów wirtualnych wspieranych przez ten sam klaster fizyczny. Te klastry wirtualne są nazywane przestrzeniami nazw. Przestrzenie nazw umożliwiają tworzenie różnych środowisk, takich jak tworzenie, testowanie i przemieszczanie w tym samym klastrze.

    • Polecenie: wybierz pozycję uaktualnij jako polecenie helm. Możesz uruchomić dowolne polecenie programu Helm przy użyciu tego zadania i przekazać opcje poleceń jako argumenty. Po wybraniu uaktualnienia zadanie wyświetli kilka pól:

      • Typ wykresu: wybierz pozycję Ścieżka pliku. Alternatywnie możesz określić nazwę wykresu , jeśli chcesz określić adres URL lub nazwę wykresu. Jeśli na przykład nazwa wykresu to stable/mysql, zadanie jest wykonywane helm upgrade stable/mysql

      • Ścieżka wykresu: może to być ścieżka do spakowanego wykresu lub ścieżki do rozpakowanego katalogu wykresu. W tym przykładzie publikujesz wykres przy użyciu kompilacji ciągłej integracji, więc wybierz pakiet plików przy użyciu selektora plików lub wprowadź $(System.DefaultWorkingDirectory)/**/*.tgz

      • Nazwa wydania: wprowadź nazwę wydania; na przykład: azuredevops

      • Utwórz ponownie zasobniki: zaznacz to pole wyboru, jeśli podczas wydania nastąpiła zmiana konfiguracji i chcesz zastąpić uruchomiony zasobnik nową konfiguracją.

      • Zresetuj wartości: zaznacz to pole wyboru, jeśli chcesz, aby wartości wbudowane w wykres przesłoniły wszystkie wartości podane przez zadanie.

      • Wymuś: zaznacz to pole wyboru, jeśli, jeśli wystąpią konflikty, chcesz uaktualnić i wycofać, aby usunąć, ponownie utworzyć zasób i ponownie zainstalować pełną wersję. Jest to przydatne w scenariuszach, w których stosowanie poprawek może zakończyć się niepowodzeniem (na przykład w przypadku usług, ponieważ adres IP klastra jest niezmienny).

      • Argumenty: wprowadź argumenty poleceń programu Helm i ich wartości; dla tego przykładu--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) Zobacz tę sekcję , aby zapoznać się z opisem, dlaczego używamy tych argumentów.

      • Włącz protokół TLS: zaznacz to pole wyboru, aby włączyć silne połączenia oparte na protokole TLS między narzędziami Helm i Tiller.

      • Certyfikat urzędu certyfikacji: określ certyfikat urzędu certyfikacji, który ma zostać przekazany i używany do wystawiania certyfikatów dla klienta Tiller i Helm.

      • Certyfikat: określ certyfikat Tiller lub certyfikat klienta programu Helm

      • Klucz: określ klucz tiller lub klucz klienta programu Helm

  8. Na stronie Zmienne potoku dodaj zmienną o nazwie imageRepoName i ustaw wartość na nazwę repozytorium obrazów programu Helm. Zazwyczaj jest to format example.azurecr.io/coderepository

  9. Zapisz potok wydania.

Argumenty używane w zadaniu uaktualniania programu Helm

W potoku kompilacji obraz kontenera jest oznaczony tagiem $(Build.BuildId) i jest on wypychany do Azure Container Registry. Na wykresie programu Helm można sparametryzować szczegóły obrazu kontenera, takie jak nazwa i tag, ponieważ ten sam wykres może służyć do wdrażania w różnych środowiskach. Te wartości można również określić w pliku values.yaml lub przesłonić przez plik wartości dostarczonych przez użytkownika, co z kolei może zostać zastąpione przez --set parametry podczas instalacji lub uaktualniania programu Helm.

W tym przykładzie przekazujemy następujące argumenty:

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

Wartość $(imageRepoName) elementu została ustawiona na stronie Zmienne (lub w sekcji zmiennych pliku YAML). Alternatywnie możesz bezpośrednio zastąpić ją nazwą repozytorium obrazów w --set pliku arguments value lub values.yaml . Na przykład:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

Inną alternatywą jest ustawienie opcji Ustaw wartości zadania, aby określić wartości argumentów jako pary klucz-wartość rozdzielane przecinkami.

Tworzenie wydania w celu wdrożenia aplikacji

Teraz możesz utworzyć wydanie, co oznacza rozpoczęcie procesu uruchamiania potoku wydania z artefaktami utworzonymi przez określoną kompilację. Spowoduje to wdrożenie kompilacji:

  1. Wybierz pozycję + Wydanie i wybierz pozycję Utwórz wydanie.

  2. Na panelu Tworzenie nowej wersji sprawdź, czy wybrano wersję artefaktu, której chcesz użyć, i wybierz pozycję Utwórz.

  3. Wybierz link wydania w komunikacie paska informacji. Na przykład: " Release-1 has been created".

  4. W widoku potoku wybierz link stanu w etapach potoku, aby wyświetlić dzienniki i dane wyjściowe agenta.