Środowisko — Zasób platformy Kubernetes
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Widok zasobów Platformy Kubernetes przedstawia stan obiektów w przestrzeni nazw, które są mapowane na zasób. Widok zasobów nakłada również możliwość śledzenia potoku, dzięki czemu można śledzić z powrotem z obiektu Kubernetes do potoku, a następnie z powrotem do zatwierdzenia.
Użyj zasobów Kubernetes, aby kierować klastry Kubernetes do wdrożenia w środowisku . Użyj potoków do wdrożenia w usłudze Azure Kubernetes Service (AKS) i klastrach z dowolnego innego dostawcy usług w chmurze.
Zasoby platformy Kubernetes można używać z klastrami publicznymi lub prywatnymi. Aby uzyskać więcej informacji na temat sposobu działania zasobów, zobacz zasoby w języku YAML i zabezpieczenia z zasobami.
Uwaga
Jeśli używasz prywatnego klastra usługi AKS, upewnij się, że masz połączenie z siecią wirtualną klastra, ponieważ punkt końcowy serwera interfejsu API nie jest uwidoczniony za pośrednictwem publicznego adresu IP.
Usługa Azure Pipelines zaleca skonfigurowanie własnego agenta w sieci wirtualnej, która ma dostęp do sieci wirtualnej klastra. Aby uzyskać szczegółowe informacje, zobacz Opcje nawiązywania połączenia z klastrem prywatnym.
Omówienie
Zapoznaj się z następującymi zaletami korzystania z widoków zasobów platformy Kubernetes w środowiskach:
Śledzenie potoku — zadanie manifestu Kubernetes używane do wdrożeń dodaje więcej adnotacji w celu pokazania możliwości śledzenia potoku w widokach zasobów. Możliwość śledzenia potoku pomaga zidentyfikować źródłową organizację, projekt i potok usługi Azure DevOps odpowiedzialny za aktualizacje wprowadzone do obiektu w przestrzeni nazw.
Diagnozowanie kondycji zasobów — stan obciążenia może być przydatny w przypadku szybkiego debugowania błędów lub regresji, które zostały wprowadzone przez nowe wdrożenie. Na przykład w przypadku nieskonfigurowanych obrazówPullSecrets powodujących błędy ImagePullBackOff informacje o stanie zasobnika mogą pomóc w zidentyfikowaniu głównej przyczyny problemu.
Przejrzyj aplikację — przejrzyj działanie aplikacji , wdrażając każde żądanie ściągnięcia z repozytorium Git do dynamicznego zasobu Kubernetes w środowisku. Recenzenci mogą zobaczyć, jak te zmiany wyglądają i współpracują z innymi usługami zależnymi przed scaleniem ich z gałęzią docelową i wdrożoną w środowisku produkcyjnym.
Korzystanie z usługi Azure Kubernetes Service
Konto usługi jest tworzone w wybranym klastrze i przestrzeni nazw podczas korzystania z usługi Azure Kubernetes Service (AKS). W przypadku klastra z obsługą kontroli dostępu opartej na rolach platformy Kubernetes tworzona jest również funkcja RoleBinding, aby ograniczyć zakres utworzonego konta usługi do wybranej przestrzeni nazw. W przypadku klastra z wyłączoną kontrolą dostępu opartą na rolach platformy Kubernetes utworzona usługa ServiceAccount ma uprawnienia dla całego klastra (między przestrzeniami nazw).
Dodawanie zasobu AKS Kubernetes
Na stronie szczegółów środowiska wybierz pozycję Dodaj zasób i wybierz pozycję Kubernetes.
Wybierz pozycję Azure Kubernetes Service z listy rozwijanej Dostawca.
Wybierz subskrypcję platformy Azure, klaster i przestrzeń nazw (nowa/istniejąca).
Wybierz pozycję Weryfikuj i utwórz , aby utworzyć zasób Kubernetes.
Sprawdź, czy widzisz klaster dla danego środowiska. Jeśli kod nie został jeszcze wdrożony w klastrze, zobaczysz tekst "Nigdy nie wdrożono".
Użyj istniejącego konta usługi
Usługa Azure Kubernetes Service mapuje zasób Kubernetes w danym środowisku na przestrzeń nazw.
Aby uzyskać więcej informacji na temat konfigurowania połączenia usługi Kubernetes poza środowiskiem, zobacz sekcję Połączenie usługi Kubernetes w temacie Połączenia z usługą.
Napiwek
Użyj dostawcy ogólnego (istniejącego konta usługi), aby zamapować zasób Kubernetes na przestrzeń nazw z klastra innego niż AKS.
Dodawanie zasobu platformy Kubernetes innej niż AKS
Na stronie szczegółów środowiska wybierz pozycję Dodaj zasób i wybierz pozycję Kubernetes.
Wybierz dostawcę ogólnego (istniejące konto usługi) dla dostawcy.
Dodaj wartości nazwy klastra i przestrzeni nazw.
Dodaj adres URL serwera. Adres URL można uzyskać za pomocą następującego polecenia:
kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
Aby uzyskać obiekt wpisu tajnego.
Kubernetes 1.22+
Zastąp
service-account-name
ciąg nazwą swojego konta.kubectl get secret -n <namespace> -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name==\"service-account-name\")]}'
Jeśli nic nie uzyskasz, zobacz Ręczne tworzenie długotrwałego tokenu interfejsu API dla konta usługi.
Kubernetes 1.22 i poniżej:
- Znajdowanie nazwy wpisu tajnego konta usługi
kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
- zastąp
<service-account-secret-name>
ciąg wartością w poprzednim poleceniu w tym poleceniu
kubectl get secret <service-account-secret-name> -n <namespace> -o json
Pobierz obiekt wpisu tajnego przy użyciu danych wyjściowych poprzedniego kroku.
kubectl get secret <service-account-secret-name> -n <namespace> -o json
Skopiuj i wklej obiekt Secret pobrany w formularzu JSON do pola Wpis tajny.
Wybierz pozycję Weryfikuj i utwórz , aby utworzyć zasób Kubernetes.
Odwołuj się do zasobów platformy Kubernetes w potoku
Jeśli używasz usługi Azure Kubernetes Service i tworzysz potok YAML, najprostszym sposobem skonfigurowania potoku jest użycie szablonu. Połącz się z repozytorium i wybierz jedną z następujących dwóch opcji usługi Kubernetes Service:
- Wdrażanie w szablonie usługi Azure Kubernetes Services
- Wdrażanie na platformie Kubernetes — przeglądanie aplikacji za pomocą usługi Azure DevSpaces
Szablony umożliwiają skonfigurowanie funkcji Przeglądanie aplikacji bez konieczności pisania kodu YAML od podstaw lub ręcznego tworzenia jawnych powiązań ról.
Konfigurowanie aplikacji do przeglądania
W poniższym przykładzie pierwsze zadanie wdrożenia jest uruchamiane dla gałęzi innych niż żądanie ściągnięcia i wykonuje wdrożenia względem zwykłego zasobu Kubernetes w środowiskach. Drugie zadanie jest uruchamiane tylko dla gałęzi żądania ściągnięcia i jest wdrażane względem zasobów aplikacji (przestrzeni nazw w klastrze Kubernetes) wygenerowanych na żądanie. Zasoby są oznaczone etykietą "Przegląd" w widoku listy zasobów środowiska. Zdefiniuj zmienne do użycia w potoku. Jeśli używasz szablonu Deploy to Azure Kubernetes Services (Wdrażanie w usłudze Azure Kubernetes Services), te zmienne zostaną zdefiniowane dla Ciebie.
# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
trigger:
- main
resources:
- repo: self
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: '12345' # Docker service connection identifier
envName: 'myEnv' # name of your environment
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:
name: $(envName).$(resourceName)
resourceType: Kubernetes
strategy:
runOnce:
deploy:
steps:
- task: KubernetesManifest@0
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@0
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:
name: $(envName).$(resourceName)
resourceType: Kubernetes
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@0
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
namespace: $(k8sNamespaceForPR)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@0
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}'
# Getting 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.<br><br>[Learn More](https://aka.ms/testwithreviewapps) about how to test and provide feedback for the app."
fi
echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"
Aby można było używać tego zadania w istniejącym potoku, należy zmodyfikować połączenie usługi, które wspiera zwykły zasób środowiska Kubernetes, w celu ustawienia "Użyj poświadczeń administratora klastra". W przeciwnym razie należy utworzyć powiązania ról dla bazowego konta usługi w przestrzeni nazw Przeglądanie aplikacji.