Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
W tym artykule opisano używanie zasobów platformy Kubernetes w środowiskach usługi Azure Pipelines, które można kierować za pomocą wdrożeń. Możesz połączyć się z publicznymi lub prywatnymi klastrami Kubernetes w usłudze Azure Kubernetes Service (AKS) lub u innych dostawców usług w chmurze.
Widoki zasobów środowiska pokazują stan zasobu platformy Kubernetes i zapewniają możliwość śledzenia potoku i z powrotem do zatwierdzenia wyzwalającego. Możesz również utworzyć dynamiczne zasoby środowiska Kubernetes, aby ocenić pull requesty przed ich scaleniem. Aby uzyskać więcej informacji na temat zasobów środowiska, zobacz Zasoby w potokach YAML i Zabezpieczenia zasobów.
Uwaga
Prywatny klaster usługi AKS nie uwidacznia punktu końcowego serwera interfejsu API za pośrednictwem publicznego adresu IP, dlatego należy nawiązać połączenie z siecią wirtualną klastra. Można skonfigurować agenta we własnej sieci wirtualnej, który uzyskuje dostęp do sieci klastra, lub użyć Zarządzanych Pul DevOps. Aby uzyskać więcej informacji, zobacz Opcje nawiązywania połączenia z klastrem prywatnym.
Zalety zasobów środowiska Kubernetes
Zasoby środowiska i widoki zasobów platformy Kubernetes w środowiskach zapewniają następujące korzyści:
Możliwość śledzenia potoku. Zadanie wdrażania manifestu Kubernetes dodaje adnotacje, które obsługują śledzenie potoku. Możesz zobaczyć organizację, projekt oraz pipeline Azure DevOps odpowiedzialny za aktualizację obiektów w przestrzeni nazwowej.
Diagnostyka kondycji zasobów. Widok stanu obciążenia to szybki sposób debugowania błędów lub regresji wprowadzonych przez nowe wdrożenia. Na przykład informacje o statusie podu mogą pomóc w zidentyfikowaniu przyczyny problemów, takich jak nieskonfigurowane
imagePullSecrets, które powodują błędyImagePullBackOff.
Przejrzyj aplikację. Aplikacja do przeglądu wdraża każde żądanie ściągnięcia z repozytorium Git do dynamicznego zasobu Kubernetes w środowisku i publikuje komentarz GitHub łączący się z aplikacją do przeglądu. Recenzenci mogą zobaczyć, jak zmiany pull requestu wyglądają i współpracują z innymi usługami zależnymi przed ich scaleniem do gałęzi docelowej i wdrożeniem do środowiska produkcyjnego.
Zasoby AKS
Usługa AKS tworzy konto usługi w wybranym klastrze i przestrzeni nazw oraz mapuje zasoby Kubernetes w danym środowisku na określoną przestrzeń nazw. Aby uzyskać informacje na temat konfigurowania połączenia usługi Kubernetes poza środowiskiem, zobacz Połączenie usługi Kubernetes.
W przypadku klastra z włączoną kontrolą dostępu opartą na rolach (RBAC) platformy Kubernetes tworzona jest również funkcja RoleBinding , aby ograniczyć zakres konta usługi do wybranej przestrzeni nazw. W przypadku klastra z wyłączoną obsługą RBAC utworzone konto usługi ma uprawnienia dla całego klastra we wszystkich przestrzeniach nazw.
Aby dodać zasób usługi AKS do środowiska usługi Azure Pipelines:
Na stronie środowiska w obszarze Środowiska potoków> wybierz pozycję Dodaj zasób, a następnie wybierz pozycję Kubernetes.
Na następnym ekranie wybierz pozycję Azure Kubernetes Service dla dostawcy, a następnie wybierz subskrypcję platformy Azure, klaster usługi AKS i nową lub istniejącą przestrzeń nazw. W przypadku nowej przestrzeni nazw wprowadź nazwę przestrzeni nazw.
Wybierz pozycję Zweryfikuj i utwórz. Nowy zasób zostanie wyświetlony na karcie Zasoby środowiska z tekstem Nigdy nie wdrożono.
Zasoby Kubernetes spoza AKS
Aby zamapować zasób Kubernetes z klastra innego niż AKS na przestrzeń nazw, musisz mieć istniejące konto usługi dla dostawcy innego niż AKS.
Aby dodać zasób platformy Kubernetes spoza usługi AKS do środowiska usługi Azure Pipelines:
Na stronie środowiska w obszarze Środowiska potoków> wybierz pozycję Dodaj zasób, a następnie wybierz pozycję Kubernetes.
Na następnym ekranie wybierz Ogólnego dostawcę (istniejące konto serwisowe) dla dostawcy.
W obszarze Poświadczenia klastra wprowadź nazwę klastra, przestrzeń nazw, adres URL serwera i wpis tajny.
Aby uzyskać adres URL serwera, uruchom polecenie
kubectl config view --minify -o jsonpath={.clusters[0].cluster.server}w powłoce lokalnej.Aby uzyskać sekretny kod:
- Pobierz tajne nazwy konta usługi, uruchamiając polecenie
kubectl get serviceAccounts <service-account-name> -n <namespace> -o=jsonpath={.secrets[*].name}. - Uruchom polecenie
kubectl get secret <service-account-secret-name> -n <namespace> -o jsonprzy użyciu danych wyjściowych poprzedniego polecenia.
Uwaga
Jeśli nie otrzymasz żadnych wyników z polecenia
get ServiceAccounts, zobacz Ręczne tworzenie długotrwałego tokenu API dla konta usługi.- Pobierz tajne nazwy konta usługi, uruchamiając polecenie
Wybierz pozycję Zweryfikuj i utwórz.
Zasoby Kubernetes w pipelinach
Najprostszym sposobem na utworzenie potoku YAML do wdrożenia w usłudze AKS jest zaczęcie od użycia szablonu Deploy to Azure Kubernetes Services (Wdrażanie w usłudze Azure Kubernetes Services). Nie musisz pisać kodu YAML ani ręcznie tworzyć jawnych powiązań ról. Wygenerowana konfiguracja potoków ustawia i wykorzystuje zmienne oraz inne wartości na podstawie Twoich ustawień konfiguracji.
Użyj aplikacji do przeglądu
Zadanie DeployPullRequest wdraża każde żądanie ściągnięcia z repozytorium Git do dynamicznego zasobu Kubernetes w środowisku. Aby dodać to zadanie do przepływu, zaznacz pole wyboru Włącz przepływ aplikacji do przeglądu dla żądań ściągnięcia w formularzu konfiguracji Wdrażania w usłudze Azure Kubernetes Services.
Uwaga
Aby dodać to zadanie do istniejącego potoku, upewnij się, że połączenie usługi wspierające standardowy zasób środowiska Kubernetes jest ustawione na opcję Użyj poświadczeń administratora klastra. W przeciwnym razie należy utworzyć powiązania ról dla podstawowego konta usługi w namespace aplikacji testowej.
Zasoby aplikacji Review są oznaczone etykietą Review na liście Resource środowiska.
Przykładowy potok
Poniższy przykładowy potok jest oparty na szablonie Deploy to Azure Kubernetes Services. Potok najpierw kompiluje i wypycha obraz do usługi Azure Container Registry.
Następnie pierwsze zadanie wdrożeniowe jest uruchamiane dla dowolnego zatwierdzenia w gałęzi main, i wdraża na regularnym zasobie Kubernetes w środowisku.
Drugie zadanie uruchamia się, gdy zostanie utworzone lub zaktualizowane żądanie ściągnięcia do gałęzi main, i wdraża się na dynamiczny zasób aplikacji przeglądowej tworzony w klastrze na żądanie.
# Deploy to Azure Kubernetes Service
# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker
trigger:
- main
resources:
- repo: self
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: '12345' # Docker service connection identifier
imageRepository: 'name-of-image-repository' # name of image repository
containerRegistry: 'mycontainer.azurecr.io' # path to container registry
dockerfilePath: '**/Dockerfile'
tag: '$(Build.BuildId)'
imagePullSecret: 'my-app-secret' # image pull secret
# Agent VM image name
vmImageName: 'ubuntu-latest'
# Name of the new namespace being created to deploy the PR changes.
k8sNamespaceForPR: 'review-app-$(System.PullRequest.PullRequestId)'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: Build
displayName: Build
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)
- upload: manifests
artifact: manifests
- stage: Production
displayName: Deploy stage
dependsOn: Build
jobs:
- deployment: Production
condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
displayName: Production
pool:
vmImage: $(vmImageName)
environment: 'myenvironmentname.myresourcename'
strategy:
runOnce:
deploy:
steps:
- task: KubernetesManifest@1
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
manifests: |
$(Pipeline.Workspace)/manifests/deployment.yml
$(Pipeline.Workspace)/manifests/service.yml
imagePullSecrets: |
$(imagePullSecret)
containers: |
$(containerRegistry)/$(imageRepository):$(tag)
- deployment: DeployPullRequest
displayName: Deploy Pull request
condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/pull/'))
pool:
vmImage: $(vmImageName)
environment: 'myenvironmentname.$(k8sNamespaceForPR)'
strategy:
runOnce:
deploy:
steps:
- reviewApp: default
- task: Kubernetes@1
displayName: 'Create a new namespace for the pull request'
inputs:
command: apply
useConfigurationFile: true
inline: '{ "kind": "Namespace", "apiVersion": "v1", "metadata": { "name": "$(k8sNamespaceForPR)" }}'
- task: KubernetesManifest@1
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
namespace: $(k8sNamespaceForPR)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@1
displayName: Deploy to the new namespace in the Kubernetes cluster
inputs:
action: deploy
namespace: $(k8sNamespaceForPR)
manifests: |
$(Pipeline.Workspace)/manifests/deployment.yml
$(Pipeline.Workspace)/manifests/service.yml
imagePullSecrets: |
$(imagePullSecret)
containers: |
$(containerRegistry)/$(imageRepository):$(tag)
- task: Kubernetes@1
name: get
displayName: 'Get services in the new namespace'
continueOnError: true
inputs:
command: get
namespace: $(k8sNamespaceForPR)
arguments: svc
outputFormat: jsonpath='http://{.items[0].status.loadBalancer.ingress[0].ip}:{.items[0].spec.ports[0].port}'
# Get the IP of the deployed service and writing it to a variable for posting comment
- script: |
url="$(get.KubectlOutput)"
message="Your review app has been deployed"
if [ ! -z "$url" -a "$url" != "http://:" ]
then
message="${message} and is available at $url."
fi
echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"