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
Projekt usługi Azure DevOps z co najmniej uprawnieniami użytkownika .
Konto Azure. Utwórz konto bezpłatnie.
Wystąpienie usługi Azure Container Registry z uprawnieniami wypychania.
Wdrożony klaster usługi Azure Kubernetes Service (AKS). Klaster usługi AKS można dołączyć do klastra usługi Azure Container Registry podczas wdrażania klastra usługi AKS lub później.
Konto usługi GitHub. Utwórz bezpłatne konto usługi GitHub.
Rozwidlenie https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s repozytorium GitHub.
Ważne
Podczas poniższych procedur może zostać wyświetlony monit o utworzenie połączenia usługi GitHub lub przekierowanie do usługi GitHub w celu zalogowania się, zainstalowania usługi Azure Pipelines lub autoryzowania usługi Azure Pipelines. Postępuj zgodnie z instrukcjami wyświetlanymi na ekranie, aby ukończyć proces. Aby uzyskać więcej informacji, zobacz Access to GitHub repozytoria.
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
- W projekcie usługi Azure DevOps przejdź do pozycji Project settings Pipelines Service connections (Ustawienia>projektu) Połączenia usługi Pipelines>Service.
- Utwórz połączenie usługi Docker Registry o nazwie azure-pipelines-canary-acr skojarzone z wystąpieniem usługi Azure Container Registry.
- 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
W projekcie usługi Azure DevOps przejdź do pozycji Potoki>Utwórz potok lub Nowy potok.
Wybierz pozycję GitHub dla swojej lokalizacji kodu i wybierz rozwidlenie repozytorium azure-pipelines-canary-k8s .
Na karcie Konfigurowanie wybierz pozycję Potok startowy.
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 naexample.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
wartość .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.
- W projekcie usługi Azure DevOps przejdź do pozycji Środowiska potoków>, a następnie wybierz pozycję Utwórz środowisko lub Nowe środowisko.
- 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.
- 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.
- Wybierz pozycję Zweryfikuj i utwórz.
Dodawanie etapu kanarowego
Przejdź do obszaru Potoki, wybierz utworzony potok, a następnie wybierz pozycję Edytuj.
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
Dodaj kolejny etap na końcu pliku YAML, aby wdrożyć wersję kanarową. Zastąp wartości
my-resource-group
imy-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/*'
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.
- Utwórz nowe środowisko Kubernetes o nazwie akspromote.
- Otwórz nowe środowisko akspromote z listy środowisk, a następnie wybierz pozycję Zatwierdzenia na karcie Zatwierdzenia i kontrole.
- Na ekranie Zatwierdzenia dodaj własne konto użytkownika w obszarze Osoby zatwierdzające.
- Rozwiń pozycję Zaawansowane i upewnij się, że wybrano opcję Zezwalaj osób zatwierdzających na zatwierdzanie własnych przebiegów .
- Wybierz pozycję Utwórz.
Dodawanie etapów podwyższania poziomu i odrzucania do potoku
Przejdź do obszaru Potoki, wybierz utworzony potok, a następnie wybierz pozycję Edytuj.
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' ```
Dodaj następujący
RejectCanary
etap 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/*' ```
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.
- W aplikacji/app.py zmień wartość
success_rate = 50
nasuccess_rate = 100
. Ta zmiana wyzwala potok, kompilowanie i wypychanie obrazu do rejestru kontenerówDeployCanary
, a także wyzwala etap. - 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.
- W aplikacji/app.py zmień wartość
success_rate = 50
nasuccess_rate = 100
. Ta zmiana wyzwala potok, kompilowanie i wypychanie obrazu do rejestru kontenerówDeployCanary
, a także wyzwala etap. - 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ę 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.