Udostępnij za pośrednictwem


Samouczek: używanie strategii wdrażania kanargu dla wdrożeń platformy Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Strategia wdrażania kanarowego oznacza wdrażanie nowych wersji aplikacji obok stabilnych wersji produkcyjnych. Następnie możesz zobaczyć, jak wersja kanary jest porównywana z punktem odniesienia przed podwyższeniem lub odrzuceniem wdrożenia.

W tym przewodniku krok po kroku opisano, jak używać strategii kanarku zadania manifestu Kubernetes. W szczególności dowiesz się, jak skonfigurować wdrożenia kanary dla platformy Kubernetes oraz skojarzony przepływ pracy w celu oceny kodu. Następnie użyjesz tego kodu do porównania wdrożeń aplikacji bazowych i kanarowych, aby zdecydować, czy podwyższyć poziom lub odrzucić wdrożenie kanary.

Jeśli używasz usługi Azure Kubernetes Service, typ połączenia usługi Azure Resource Manager jest najlepszym sposobem nawiązywania połączenia z klastrem prywatnym lub klastrem z wyłączonymi kontami lokalnymi.

Wymagania wstępne

Przykładowy kod

Rozwidlenie następującego repozytorium w usłudze GitHub.

https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s

Poniżej przedstawiono krótkie omówienie plików w repozytorium, które są używane w tym przewodniku:

  • ./app:
    • app.py — prosty serwer internetowy oparty na platformie Flask, który jest instrumentowany przy użyciu biblioteki instrumentacji Prometheus dla aplikacji języka Python. Niestandardowy licznik jest konfigurowany dla liczby dobrych i nieprawidłowych odpowiedzi podanych na podstawie wartości zmiennej success_rate .
    • Dockerfile — służy do kompilowania obrazu z każdą zmianą wprowadzoną w app.py. Po każdej zmianie potok kompilacji zostanie wyzwolony, a obraz zostanie skompilowany i wypchnięty do rejestru kontenerów.
  • ./manifesty:
    • deployment.yml — zawiera specyfikację sampleapp obciążenia wdrożenia odpowiadającego opublikowanemu wcześniej obrazowi. Ten plik manifestu jest używany nie tylko dla stabilnej wersji obiektu wdrożenia, ale także do wyprowadzania wariantów punktu odniesienia i kanargu obciążeń.
    • service.yml — tworzy usługęsampleapp. Ta usługa kieruje żądania do zasobników spun up przez wdrożenia (stabilne, bazowe i kanary) wymienione wcześniej.
  • ./Różne
    • service-monitor.yml — służy do konfigurowania obiektu ServiceMonitor. Ten obiekt konfiguruje złomowanie metryk Prometheus.
    • fortio-deploy.yml — służy do konfigurowania wdrożenia fortio. To wdrożenie jest później używane jako narzędzie do testowania obciążenia w celu wysyłania strumienia żądań do wdrożonej sampleapp wcześniej usługi. Strumień wysyłanych żądań sampleapp jest kierowany do zasobników we wszystkich trzech wdrożeniach (stabilnych, bazowych i kanarowych).

Uwaga

W tym przewodniku użyjesz rozwiązania Prometheus do instrumentacji i monitorowania kodu. Dowolne równoważne rozwiązanie, takie jak aplikacja systemu Azure Insights, może służyć jako alternatywa.

Instalowanie operatora prometheus

Aby zainstalować rozwiązanie Prometheus w klastrze, użyj następującego polecenia na komputerze deweloperskim. Musisz mieć zainstalowane narzędzie kubectl i Helm, a kontekst należy ustawić na klaster, dla którego chcesz wdrożyć. Narzędzie Grafana, którego używasz później do wizualizacji metryk punktu odniesienia i kanargu na pulpitach nawigacyjnych, jest instalowane jako część tego wykresu programu Helm.

Najpierw dodasz repozytorium Pakietów Helm Rozwiązania Prometheus Community Kubernetes do instalacji programu Helm. Następnie zainstalujesz stos kube-prometheus, kolekcję manifestów Kubernetes, pulpitów nawigacyjnych Grafana i reguł Prometheus.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update # update local cache
helm install --name sampleapp  prometheus-community/kube-prometheus-stack

Tworzenie połączeń usług

  1. Przejdź do pozycji Ustawienia>projektu Połączenia usługi Potoki>w menu usługi Azure DevOps.
  2. Utwórz połączenie usługi rejestru platformy Docker skojarzone z rejestrem kontenerów. Nadaj jej nazwę azure-pipelines-canary-k8s.
  3. Utwórz połączenie usługi Kubernetes dla klastra Kubernetes i przestrzeni nazw, do której chcesz wdrożyć. Nadaj jej nazwę azure-pipelines-canary-k8s.

Uwaga

Jeśli używasz usługi Azure Kubernetes Service, typ połączenia usługi Azure Resource Manager jest najlepszym sposobem nawiązywania połączenia z klastrem prywatnym lub klastrem z wyłączonymi kontami lokalnymi.

Konfigurowanie ciągłej integracji

  1. Przejdź do obszaru Potoki>Utwórz potok i wybierz repozytorium.

  2. Na karcie Konfigurowanie wybierz pozycję Potok startowy.

  3. Na karcie Przegląd zastąp potok YAML tym kodem.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
    
    steps:
    - task: Docker@2
      displayName: Build and push image
      inputs:
        containerRegistry: azure-pipelines-canary-k8s #replace with name of your Docker registry service connection
        repository: $(imageName)
        command: buildAndPush
        Dockerfile: app/Dockerfile
        tags: |
          $(Build.BuildId)
    

    Jeśli utworzone połączenie usługi rejestru platformy Docker jest skojarzone z elementem example.azurecr.io, obraz ma example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)wartość , na podstawie poprzedniej konfiguracji.

Edytowanie pliku manifestu

W manifestach/deployment.yml zastąp ciąg <example> adresem URL rejestru kontenerów. Na przykład po zastąpieniu pole obrazu powinno wyglądać mniej więcej tak: contosodemo.azurecr.io/azure-pipelines-canary-k8s.

Konfigurowanie ciągłego wdrażania

W poniższych sekcjach opisano kroki konfigurowania ciągłego wdrażania, w tym sposobu wdrażania etapu kanarowego oraz sposobu promowania lub odrzucania kanarnika poprzez ręczną interwencję.

Wdrażanie etapu kanarowego

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

  1. Przejdź do obszaru Środowiska potoków>>Utwórz środowisko.

  2. Utwórz nowe środowisko.

    • Nazwa: akscanary
    • Zasób: wybierz pozycję Kubernetes.
  3. Wybierz pozycję Dalej i skonfiguruj zasób Kubernetes w następujący sposób:

    • Dostawca: Azure Kubernetes Service
    • Subskrypcja platformy Azure: wybierz subskrypcję, która zawiera klaster Kubernetes.
    • Klaster: wybierz klaster.
    • Przestrzeń nazw: utwórz nową przestrzeń nazw z nazwą canarydemo.
  4. Wybierz pozycję Zweryfikuj i utwórz.

  5. Przejdź do pozycji Potoki. Wybierz utworzony potok, a następnie wybierz pozycję Edytuj.

  6. Zmień utworzony wcześniej krok, aby teraz używać etapu. Dodaj jeszcze dwa kroki, aby skopiować manifesty i nieprawidłowe katalogi jako artefakty do użycia przez kolejne etapy. Możesz również przenieść kilka wartości do zmiennych, aby ułatwić użycie w dalszej części potoku. Kompletny kod YAML powinien teraz wyglądać następująco.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
      dockerRegistryServiceConnection: dockerRegistryServiceConnectionName #replace with name of your Docker registry service connection
      imageRepository: 'azure-pipelines-canary-k8s'
      containerRegistry: example.azurecr.io #replace with the name of your container registry, Should be in the format 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
    
  7. Dodaj etap na końcu pliku YAML, aby wdrożyć wersję kanarową.

    - stage: DeployCanary
      displayName: Deploy canary
      dependsOn: Build
      condition: succeeded()
    
      jobs:
      - deployment: Deploycanary
        displayName: Deploy canary
        pool:
          vmImage: ubuntu-latest
        environment: 'akscanary.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:
              - task: KubernetesManifest@0
                displayName: Create imagePullSecret
                inputs:
                  action: createSecret
                  secretName: azure-pipelines-canary-k8s
                  dockerRegistryEndpoint: azure-pipelines-canary-k8s
    
              - task: KubernetesManifest@0
                displayName: Deploy to Kubernetes cluster
                inputs:
                  action: 'deploy'
                  strategy: 'canary'
                  percentage: '25'
                  manifests: |
                    $(Pipeline.Workspace)/manifests/deployment.yml
                    $(Pipeline.Workspace)/manifests/service.yml
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: azure-pipelines-canary-k8s
    
              - task: KubernetesManifest@0
                displayName: Deploy Forbio and ServiceMonitor
                inputs:
                  action: 'deploy'
                  manifests: |
                    $(Pipeline.Workspace)/misc/*
    
  8. Zapisz potok, zatwierdzając bezpośrednio w gałęzi głównej. To zatwierdzenie powinno już pomyślnie uruchomić potok.

Interwencja ręczna w celu promowania lub odrzucania kanarnika

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

  1. Przejdź do obszaru Środowiska potoków>>Nowe środowisko.

  2. Skonfiguruj nowe środowisko.

    • Nazwa: akspromote
    • Zasób: wybierz pozycję Kubernetes.
  3. Wybierz pozycję Dalej i skonfiguruj zasób Kubernetes w następujący sposób:

    • Dostawca: Azure Kubernetes Service
    • Subskrypcja platformy Azure: wybierz subskrypcję, która zawiera klaster Kubernetes.
    • Klaster: wybierz klaster.
    • Przestrzeń nazw: wybierz przestrzeń nazw, canarydemo, która została utworzona wcześniej.
  4. Wybierz pozycję Zweryfikuj i utwórz.

  5. Wybierz nowe akspromote środowisko z listy środowisk.

  6. Wybierz pozycję Zatwierdzenia i sprawdź>zatwierdzenia. Następnie wybierz ikonę wielokropka (trzy kropki).

  7. Skonfiguruj zatwierdzenie w następujący sposób:

    • Osoby zatwierdzające: Dodaj własne konto użytkownika.
    • Zaawansowane: upewnij się, że jest zaznaczone pole Zezwalaj osoba zatwierdzająca na zatwierdzanie własnych przebiegów .
  8. Wybierz pozycję Utwórz.

  9. Przejdź do obszaru Potoki i wybierz utworzony potok. Wybierz pozycję Edytuj.

  10. Dodaj kolejny etap , PromoteRejectCanaryna końcu pliku YAML, aby podwyższyć poziom zmian.

    - stage: PromoteRejectCanary
      displayName: Promote or Reject canary
      dependsOn: DeployCanary
      condition: succeeded()
    
      jobs:
      - deployment: PromoteCanary
        displayName: Promote Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akspromote.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:            
              - task: KubernetesManifest@0
                displayName: promote canary
                inputs:
                  action: 'promote'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: '$(imagePullSecret)'
    
  11. Dodaj kolejny etap , RejectCanaryna końcu pliku YAML, aby wycofać zmiany.

    - stage: RejectCanary
      displayName: Reject canary
      dependsOn: PromoteRejectCanary
      condition: failed()
    
      jobs:
      - deployment: RejectCanary
        displayName: Reject Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akscanary.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:            
              - task: KubernetesManifest@0
                displayName: reject canary
                inputs:
                  action: 'reject'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
    
  12. Zapisz potok YAML, wybierając pozycję Zapisz, a następnie zatwierdzając go bezpośrednio w gałęzi głównej.

Wdrażanie stabilnej wersji

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

W pierwszym uruchomieniu potoku stabilna wersja obciążeń, a ich wersje bazowe lub kanary nie istnieją w klastrze. Aby wdrożyć stabilną wersję:

  1. W aplikacji/app.py zmień wartość success_rate = 5 na success_rate = 10. Ta zmiana wyzwala potok, co prowadzi do kompilacji i wypychania obrazu do rejestru kontenerów. Spowoduje to również wyzwolenie etapu DeployCanary .
  2. Ponieważ skonfigurowano zatwierdzenie w akspromote środowisku, wydanie czeka przed uruchomieniem tego etapu.
  3. W podsumowaniu przebiegu wybierz pozycję Przejrzyj>zatwierdź. Spowoduje to wdrożenie stabilnej wersji obciążeń ( sampleapp wdrożenie w manifestach/deployment.yml) w przestrzeni nazw.

Inicjowanie przepływu pracy kanargu

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

W aplikacji/app.py zmień wartość success_rate = 10 na success_rate = 20.

Ta zmiana wyzwala potok kompilacji, co powoduje skompilowanie i wypchnięcie obrazu do rejestru kontenerów. Ten proces z kolei wyzwala potok wydania i rozpoczyna etap Wdrażanie kanary .

Symulowanie żądań

Na komputerze deweloperskim uruchom następujące polecenia i zachowaj jego działanie, aby wysyłać stały strumień żądań w usłudze sampleapp . sampleapp kieruje żądania do zasobników spun przez stabilne sampleapp wdrożenie i do zasobników spun up przez sampleapp-baseline wdrożenia i sampleapp-canary . Selektor określony dla sampleapp programu ma zastosowanie do wszystkich tych zasobników.

FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -allow-initial-errors -t 0 http://sampleapp:8080/

Konfigurowanie pulpitu nawigacyjnego narzędzia Grafana

  1. Uruchom następujące polecenie przekierowania portów na lokalnej maszynie deweloperów, aby uzyskać dostęp do narzędzia Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. W przeglądarce otwórz następujący adres URL.

    http://localhost:3000/login
    
  3. Po wyświetleniu monitu o poświadczenia, chyba że adminPassword wartość została zastąpiona podczas prometheus-operator instalacji pakietu Helm, możesz użyć następujących wartości:

    • nazwa użytkownika: administrator
    • hasło: prom-operator
  4. Z menu po lewej stronie wybierz pozycję +>Wykres pulpitu nawigacyjnego>.

  5. Wybierz dowolne miejsce na nowo dodanym panelu i wpisz, e aby edytować panel.

  6. Na karcie Metryki wprowadź następujące zapytanie:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Na karcie Ogólne zmień nazwę tego panelu na Wszystkie zasobniki przykładowych aplikacji.

  8. Na pasku przeglądu w górnej części strony zmień zakres czasu trwania na Ostatnie 5 minut lub Ostatnie 15 minut.

  9. Aby zapisać ten panel, wybierz ikonę zapisywania na pasku przeglądu.

  10. Powyższy panel wizualizuje metryki współczynnika powodzenia ze wszystkich wariantów. Obejmują one stabilne (z sampleapp wdrożenia), punkt odniesienia (z sampleapp-baseline wdrożenia) i kanary (z sampleapp-canary wdrożenia). Możesz wizualizować tylko metryki punktu odniesienia i kanargu, dodając kolejny panel z następującą konfiguracją:

    • Na karcie Ogólne w polu Tytuł wybierz pozycję Przykładowa linia bazowa aplikacji i kanary.
    • Na karcie Metryki użyj następującego zapytania:
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Uwaga

    Panel dla metryk bazowych i kanarowych będzie miał dostępne tylko metryki do porównania w określonych warunkach. Te warunki są po pomyślnym zakończeniu etapu Wdrażania kanarku , a etap podwyższania/odrzucania kanargu czeka na interwencję ręczną.

    Napiwek

    Skonfiguruj adnotacje dla pulpitów nawigacyjnych Grafana, aby wizualnie przedstawiać zdarzenia ukończenia etapu dla kanargu Wdrażanie kanarnika i podwyższanie/odrzucanie kanarnika. Jest to przydatne, aby wiedzieć, kiedy rozpocząć porównywanie linii bazowej z kanarkiem, a po zakończeniu promocji lub odrzucenia kanary.

Porównanie planu bazowego i kanargu

  1. W tym momencie etap wdrażania kanarowego został pomyślnie ukończony (na podstawie zmiany success_rate z 10 na 20). Etap podwyższania/odrzucania kanarku czeka na interwencję ręczną. Teraz możesz porównać współczynnik powodzenia (określony przez custom_status=good) wariantów punktu odniesienia i kanargu na pulpicie nawigacyjnym narzędzia Grafana. Zawartość powinna wyglądać mniej więcej tak:

    Zrzut ekranu przedstawiający porównanie metryk punktu odniesienia i kanargu.

  2. Na podstawie obserwacji, że wskaźnik sukcesu jest wyższy dla kanarnika, promować kanary. Wybierz pozycję Wznów w zadaniu interwencji ręcznej.