Udostępnij za pośrednictwem


Samouczek: używanie strategii wdrażania kanarku dla platformy Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

W tym przewodniku krok po kroku opisano sposób używania zadania manifestu kubernetes ze strategiącanary. Strategia wdrażania kanarowego wdraża nowe wersje aplikacji obok stabilnych wersji produkcyjnych.

Skojarzony przepływ pracy służy do wdrażania kodu i porównywania wdrożeń aplikacji bazowych i kanarowych. Na podstawie oceny decydujesz, czy promować lub odrzucić wdrożenie kanary.

W tym samouczku używane są połączenia usługi Docker Registry i Azure Resource Manager w celu nawiązania połączenia z zasobami platformy Azure. W przypadku klastra prywatnego usługi Azure Kubernetes Service (AKS) lub klastra, który ma wyłączone konta lokalne, połączenie usługi Azure Resource Manager jest lepszym sposobem nawiązywania połączenia.

Wymagania wstępne

Pliki repozytorium GitHub

Repozytorium GitHub zawiera następujące pliki:

Plik opis
./app/app.py Prosty serwer internetowy oparty na platformie Flask. Plik konfiguruje niestandardowy licznik dla liczby dobrych i nieprawidłowych odpowiedzi na podstawie wartości zmiennej success_rate .
./app/Dockerfile Służy do kompilowania obrazu z każdą zmianą w celu app.py. Każda zmiana wyzwala potok kompilacji w celu skompilowania obrazu i wypchnięcia go do rejestru kontenerów.
./manifests/deployment.yml Zawiera specyfikację sampleapp obciążenia wdrożenia odpowiadającego opublikowanemu obrazowi. Ten plik manifestu jest używany do stabilnej wersji obiektu wdrożenia oraz do wyprowadzania wariantów punktu odniesienia i kanargu obciążeń.
./manifests/service.yml Tworzy usługę sampleapp . Ta usługa kieruje żądania do zasobników spun up przez stabilne, bazowe i kanary wdrożenia.
./misc/fortio.yml Konfiguruje wdrożenie fortio. To wdrożenie to narzędzie do testowania obciążenia, które wysyła strumień żądań do wdrożonej sampleapp usługi. Strumień żądań kieruje do zasobników w ramach trzech wdrożeń: stabilne, bazowe i kanary.

Tworzenie połączeń usług

  1. W projekcie usługi Azure DevOps przejdź do pozycji Project settings Pipelines Service connections (Ustawienia>projektu) Połączenia usługi Pipelines>Service.
  2. Utwórz połączenie usługi Docker Registry o nazwie azure-pipelines-canary-acr skojarzone z wystąpieniem usługi Azure Container Registry.
  3. Utwórz połączenie usługi Azure Resource Manager z tożsamością obciążenia o nazwie azure-pipelines-canary-k8s dla grupy zasobów.

Dodawanie etapu kompilacji

  1. W projekcie usługi Azure DevOps przejdź do pozycji Potoki>Utwórz potok lub Nowy potok.

  2. Wybierz pozycję GitHub dla swojej lokalizacji kodu i wybierz rozwidlenie repozytorium azure-pipelines-canary-k8s .

  3. Na karcie Konfigurowanie wybierz pozycję Potok startowy.

  4. Na karcie Przegląd zastąp potok YAML następującym kodem.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s # name of ACR image
      dockerRegistryServiceConnection: azure-pipelines-canary-acr # name of ACR service connection
      imageRepository: 'azure-pipelines-canary-k8s' # name of image repository
      containerRegistry: example.azurecr.io # name of Azure container registry
      tag: '$(Build.BuildId)'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: ubuntu-latest
        steps:
        - task: Docker@2
          displayName: Build and push image
          inputs:
            containerRegistry: $(dockerRegistryServiceConnection)
            repository: $(imageName)
            command: buildAndPush
            Dockerfile: app/Dockerfile
            tags: |
              $(tag)
    

    Jeśli utworzone połączenie usługi rejestru platformy Docker jest skojarzone z rejestrem kontenerów o nazwie example.azurecr.io, obraz jest ustawiony na example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)wartość .

  5. Wybierz pozycję Zapisz i uruchom i upewnij się, że zadanie zostało pomyślnie uruchomione.

Edytowanie pliku manifestu

W rozwidlu repozytorium zmodyfikuj manifesty/deployment.yml , aby zastąpić <foobar> ciąg adresem URL rejestru kontenerów, na przykład example.azurecr.io/azure-pipelines-canary-k8s.

Konfigurowanie ciągłego wdrażania

Teraz skonfiguruj ciągłe wdrażanie, wdróż etap kanarowy i podwyższ poziom lub odrzucić kanarnik za pomocą ręcznego zatwierdzania.

Utwórz środowisko

Można wdrożyć przy użyciu języka YAML lub klasycznego.

  1. W projekcie usługi Azure DevOps przejdź do pozycji Środowiska potoków>, a następnie wybierz pozycję Utwórz środowisko lub Nowe środowisko.
  2. Na pierwszym ekranie Nowe środowisko wprowadź ciąg akscanary w obszarze Nazwa, wybierz pozycję Kubernetes w obszarze Zasób, a następnie wybierz pozycję Dalej.
  3. Wypełnij ekran zasobu Kubernetes w następujący sposób:
    • Dostawca: wybierz pozycję Azure Kubernetes Service.
    • Subskrypcja platformy Azure: wybierz subskrypcję platformy Azure.
    • Klaster: wybierz klaster usługi AKS.
    • Przestrzeń nazw: wybierz pozycję Nowy i wprowadź canarydemo.
  4. Wybierz pozycję Zweryfikuj i utwórz.

Dodawanie etapu kanarowego

  1. Przejdź do obszaru Potoki, wybierz utworzony potok, a następnie wybierz pozycję Edytuj.

  2. Zastąp cały potok YAML następującym kodem.

    Ten kod zmienia Docker@2 krok, który został wcześniej uruchomiony, aby użyć etapu, i dodaje dwa kolejne kroki w celu skopiowania manifestów i katalogów misc jako artefaktów dla kolejnych etapów do użycia.

    Kod przenosi również niektóre wartości do zmiennych w celu łatwiejszego użycia w dalszej części potoku. W zmiennej containerRegistry zastąp <example> ciąg nazwą rejestru kontenerów.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
      dockerRegistryServiceConnection: azure-pipelines-canary-acr
      imageRepository: 'azure-pipelines-canary-k8s'
      containerRegistry: <example>.azurecr.io
      tag: '$(Build.BuildId)'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: ubuntu-latest
        steps:
        - task: Docker@2
          displayName: Build and push image
          inputs:
            containerRegistry: $(dockerRegistryServiceConnection)
            repository: $(imageName)
            command: buildAndPush
            Dockerfile: app/Dockerfile
            tags: |
              $(tag)
    
        - publish: manifests
          artifact: manifests
    
        - publish: misc
          artifact: misc
    
  3. Dodaj kolejny etap na końcu pliku YAML, aby wdrożyć wersję kanarową. Zastąp wartości my-resource-group i my-aks-cluster nazwą klastra usługi Azure Kubernetes Service.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
      dockerRegistryServiceConnection: azure-pipelines-canary-acr
      imageRepository: 'azure-pipelines-canary-k8s'
      containerRegistry: yourcontainerregistry.azurecr.io #update with container registry
      tag: '$(Build.BuildId)'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: ubuntu-latest
        steps:
        - task: Docker@2
          displayName: Build and push image
          inputs:
            containerRegistry: $(dockerRegistryServiceConnection)
            repository: $(imageName)
            command: buildAndPush
            Dockerfile: app/Dockerfile
            tags: |
              $(tag)
    
        - publish: manifests
          artifact: manifests
    
        - publish: misc
          artifact: misc
    
    - stage: DeployCanary
      displayName: Deploy canary
      dependsOn: Build
      condition: succeeded()
    
      jobs:
      - deployment: Deploycanary
        displayName: Deploy canary
        pool:
          vmImage: ubuntu-latest
        environment: 'akscanary'
        strategy:
          runOnce:
            deploy:
              steps:
              - task: KubernetesManifest@1
                displayName: Create Docker Registry Secret
                inputs:
                  action: 'createSecret'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'my-resource-group'
                  kubernetesCluster: 'my-aks-cluster'
                  secretType: 'dockerRegistry'
                  secretName: 'my-acr-secret'
                  dockerRegistryEndpoint: 'azure-pipelines-canary-acr'
    
              - task: KubernetesManifest@1
                displayName: Deploy to Kubernetes cluster
                inputs:
                  action: 'deploy'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'my-resource-group'
                  kubernetesCluster: 'my-aks-cluster'
                  strategy: 'canary'
                  percentage: '25'
                  manifests: |
                    $(Pipeline.Workspace)/manifests/deployment.yml
                    $(Pipeline.Workspace)/manifests/service.yml
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: 'my-acr-secret'
    
              - task: KubernetesManifest@1
                displayName: Deploy Forbio to Kubernetes cluster
                inputs:
                  action: 'deploy'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'my-resource-group'
                  kubernetesCluster: 'my-aks-cluster'
                  manifests: '$(Pipeline.Workspace)/misc/*'
    
  4. Wybierz pozycję Zweryfikuj i zapisz i zapisz potok bezpośrednio w gałęzi głównej.

Dodawanie ręcznego zatwierdzania pod kątem promowania lub odrzucania wdrożenia kanarowego

Możesz interweniować ręcznie za pomocą kodu YAML lub klasycznego.

  1. Utwórz nowe środowisko Kubernetes o nazwie akspromote.
  2. Otwórz nowe środowisko akspromote z listy środowisk, a następnie wybierz pozycję Zatwierdzenia na karcie Zatwierdzenia i kontrole.
  3. Na ekranie Zatwierdzenia dodaj własne konto użytkownika w obszarze Osoby zatwierdzające.
  4. Rozwiń pozycję Zaawansowane i upewnij się, że wybrano opcję Zezwalaj osób zatwierdzających na zatwierdzanie własnych przebiegów .
  5. Wybierz pozycję Utwórz.

Dodawanie etapów podwyższania poziomu i odrzucania do potoku

  1. Przejdź do obszaru Potoki, wybierz utworzony potok, a następnie wybierz pozycję Edytuj.

  2. Dodaj następujący PromoteRejectCanary etap na końcu pliku YAML, który promuje zmiany.

    - stage: PromoteRejectCanary
      displayName: Promote or Reject canary
      dependsOn: DeployCanary
      condition: succeeded()
    
      jobs:
      - deployment: PromoteCanary
        displayName: Promote Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akspromote'
        strategy:
          runOnce:
            deploy:
              steps:      
              - task: KubernetesManifest@1
                displayName: Create Docker Registry Secret for akspromote
                inputs:
                  action: 'createSecret'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'my-resource-group'
                  kubernetesCluster: 'my-aks-cluster'
                  secretType: 'dockerRegistry'
                  secretName: 'my-acr-secret'
                  dockerRegistryEndpoint: 'azure-pipelines-canary-acr'
    
              - task: KubernetesManifest@1
                displayName: promote canary
                inputs:
                  action: 'promote'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'my-resource-group'
                  kubernetesCluster: 'my-aks-cluster'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: 'my-acr-secret'
        ```
    
    
  3. Dodaj następujący RejectCanaryetap na końcu pliku, który wycofa zmiany.

    - stage: RejectCanary
      displayName: Reject canary
      dependsOn: PromoteRejectCanary
      condition: failed()
    
      jobs:
      - deployment: RejectCanary
        displayName: Reject Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akscanary'
        strategy:
          runOnce:
            deploy:
              steps:        
              - task: KubernetesManifest@1
                displayName: Create Docker Registry Secret for reject canary
                inputs:
                  action: 'createSecret'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'kubernetes-testing'
                  kubernetesCluster: 'my-aks-cluster'
                  secretType: 'dockerRegistry'
                  secretName: 'my-acr-secret'
                  dockerRegistryEndpoint: 'azure-pipelines-canary-acr'    
              - task: KubernetesManifest@1
                displayName: Reject canary deployment
                inputs:
                  action: 'reject'
                  connectionType: 'azureResourceManager'
                  azureSubscriptionConnection: 'azure-pipelines-canary-sc'
                  azureResourceGroup: 'my-resource-group'
                  kubernetesCluster: 'my-aks-cluster'
                  namespace: 'default'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
        ```
    
  4. Wybierz pozycję Zweryfikuj i zapisz i zapisz potok bezpośrednio w gałęzi głównej.

Wdrażanie stabilnej wersji

W przypadku pierwszego uruchomienia potoku stabilna wersja obciążeń i ich wersje bazowe lub kanary nie istnieją w klastrze. Wdróż stabilną wersję sampleapp obciążenia w następujący sposób.

Można wdrożyć stabilną wersję przy użyciu języka YAML lub klasycznego.

  1. W aplikacji/app.py zmień wartość success_rate = 50 na success_rate = 100. Ta zmiana wyzwala potok, kompilowanie i wypychanie obrazu do rejestru kontenerów DeployCanary , a także wyzwala etap.
  2. Ponieważ skonfigurowano zatwierdzenie w akspromote środowisku, wydanie czeka przed uruchomieniem tego etapu. Na stronie podsumowania przebiegu kompilacji wybierz pozycję Przejrzyj , a następnie wybierz pozycję Zatwierdź.

Po zatwierdzeniu potok wdraża stabilną wersję sampleapp obciążenia w manifestach/deployment.yml w przestrzeni nazw.

Inicjowanie przepływu pracy kanargu i odrzucanie zatwierdzenia

Stabilna wersja sampleapp obciążenia istnieje teraz w klastrze. Następnie wprowadź następującą zmianę w aplikacji symulacji.

  1. W aplikacji/app.py zmień wartość success_rate = 50 na success_rate = 100. Ta zmiana wyzwala potok, kompilowanie i wypychanie obrazu do rejestru kontenerów DeployCanary , a także wyzwala etap.
  2. Ponieważ skonfigurowano zatwierdzenie w akspromote środowisku, wydanie czeka przed uruchomieniem tego etapu.
  3. Na stronie podsumowania przebiegu kompilacji wybierz pozycję Przejrzyj , a następnie wybierz pozycję Odrzuć w kolejnym oknie dialogowym. Spowoduje to odrzucenie wdrożenia.

Po odrzuceniu potok uniemożliwia wdrożenie kodu.

Czyszczenie

Jeśli nie zamierzasz nadal korzystać z tej aplikacji, usuń grupę zasobów w witrynie Azure Portal i projekt w usłudze Azure DevOps.