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
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Konto usługi GitHub. Utwórz bezpłatne konto usługi GitHub, jeśli jeszcze go nie masz.
- Usługa Azure Container Registryz uprawnieniami wypychania. Utwórz usługę Azure Container Registry , jeśli jeszcze jej nie masz.
- Klaster Kubernetes. Wdrażanie klastra usługi Azure Kubernetes Service (AKS).
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.
- 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
- ./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.
- deployment.yml — zawiera specyfikację
- ./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
- Przejdź do pozycji Ustawienia>projektu Połączenia usługi Potoki>w menu usługi Azure DevOps.
- Utwórz połączenie usługi rejestru platformy Docker skojarzone z rejestrem kontenerów. Nadaj jej nazwę azure-pipelines-canary-k8s.
- 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
Przejdź do obszaru Potoki>Utwórz potok i wybierz repozytorium.
Na karcie Konfigurowanie wybierz pozycję Potok startowy.
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 maexample.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.
Przejdź do obszaru Środowiska potoków>>Utwórz środowisko.
Utwórz nowe środowisko.
- Nazwa: akscanary
- Zasób: wybierz pozycję Kubernetes.
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.
Wybierz pozycję Zweryfikuj i utwórz.
Przejdź do pozycji Potoki. Wybierz utworzony potok, a następnie wybierz pozycję Edytuj.
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
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/*
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.
Przejdź do obszaru Środowiska potoków>>Nowe środowisko.
Skonfiguruj nowe środowisko.
- Nazwa: akspromote
- Zasób: wybierz pozycję Kubernetes.
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.
Wybierz pozycję Zweryfikuj i utwórz.
Wybierz nowe
akspromote
środowisko z listy środowisk.Wybierz pozycję Zatwierdzenia i sprawdź>zatwierdzenia. Następnie wybierz ikonę wielokropka (trzy kropki).
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 .
Wybierz pozycję Utwórz.
Przejdź do obszaru Potoki i wybierz utworzony potok. Wybierz pozycję Edytuj.
Dodaj kolejny etap ,
PromoteRejectCanary
na 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)'
Dodaj kolejny etap ,
RejectCanary
na 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/*'
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ę:
- W aplikacji/app.py zmień wartość
success_rate = 5
nasuccess_rate = 10
. Ta zmiana wyzwala potok, co prowadzi do kompilacji i wypychania obrazu do rejestru kontenerów. Spowoduje to również wyzwolenie etapuDeployCanary
. - Ponieważ skonfigurowano zatwierdzenie w
akspromote
środowisku, wydanie czeka przed uruchomieniem tego etapu. - 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
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
W przeglądarce otwórz następujący adres URL.
http://localhost:3000/login
Po wyświetleniu monitu o poświadczenia, chyba że
adminPassword
wartość została zastąpiona podczasprometheus-operator
instalacji pakietu Helm, możesz użyć następujących wartości:- nazwa użytkownika: administrator
- hasło: prom-operator
Z menu po lewej stronie wybierz pozycję +>Wykres pulpitu nawigacyjnego>.
Wybierz dowolne miejsce na nowo dodanym panelu i wpisz,
e
aby edytować panel.Na karcie Metryki wprowadź następujące zapytanie:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Na karcie Ogólne zmień nazwę tego panelu na Wszystkie zasobniki przykładowych aplikacji.
Na pasku przeglądu w górnej części strony zmień zakres czasu trwania na Ostatnie 5 minut lub Ostatnie 15 minut.
Aby zapisać ten panel, wybierz ikonę zapisywania na pasku przeglądu.
Powyższy panel wizualizuje metryki współczynnika powodzenia ze wszystkich wariantów. Obejmują one stabilne (z
sampleapp
wdrożenia), punkt odniesienia (zsampleapp-baseline
wdrożenia) i kanary (zsampleapp-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
W tym momencie etap wdrażania kanarowego został pomyślnie ukończony (na podstawie zmiany
success_rate
z10
na20
). Etap podwyższania/odrzucania kanarku czeka na interwencję ręczną. Teraz możesz porównać współczynnik powodzenia (określony przezcustom_status=good
) wariantów punktu odniesienia i kanargu na pulpicie nawigacyjnym narzędzia Grafana. Zawartość powinna wyglądać mniej więcej tak:Na podstawie obserwacji, że wskaźnik sukcesu jest wyższy dla kanarnika, promować kanary. Wybierz pozycję Wznów w zadaniu interwencji ręcznej.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla