Miljö – Kubernetes-resurs
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Kubernetes-resursvyn visar status för objekt i namnområdet som mappas till resursen. Resursvyn överlagrar även pipelinespårningsbarheten så att du kan spåra tillbaka från ett Kubernetes-objekt till pipelinen och sedan tillbaka till incheckningen.
Använd Kubernetes-resurser för att rikta in sig på Kubernetes-kluster i en miljö för distribution. Använd pipelines för att distribuera till Azure Kubernetes Service (AKS) och kluster från andra molnleverantörer.
Du kan använda Kubernetes-resurser med offentliga eller privata kluster. Mer information om hur resurser fungerar finns i resurser i YAML och säkerhet med resurser.
Kommentar
Om du använder ett privat AKS-kluster kontrollerar du att du är ansluten till klustrets virtuella nätverk eftersom API-serverslutpunkten inte exponeras via en offentlig IP-adress.
Azure Pipelines rekommenderar att du konfigurerar en lokalt installerad agent i ett virtuellt nätverk som har åtkomst till klustrets virtuella nätverk. Mer information finns i Alternativ för att ansluta till det privata klustret .
Översikt
Se följande fördelar med att använda Kubernetes-resursvyer i miljöer:
Pipelinespårning – Kubernetes-manifestaktiviteten, som används för distributioner, lägger till fler anteckningar för att visa pipelinespårning i resursvyer. Pipelinespårning hjälper till att identifiera den ursprungliga Azure DevOps-organisationen, projektet och pipelinen som ansvarar för uppdateringar av ett objekt i namnområdet.
Diagnostisera resurshälsa – Arbetsbelastningsstatus kan vara användbar för att snabbt felsöka misstag eller regressioner som introducerades av en ny distribution. För okonfigurerade imagePullSecrets som resulterar i ImagePullBackOff-fel kan information om poddstatus till exempel hjälpa dig att identifiera rotorsaken till problemet.
Granska app – Granska appen fungerar genom att distribuera varje pull-begäran från din Git-lagringsplats till en dynamisk Kubernetes-resurs under miljön. Granskare kan se hur dessa ändringar ser ut och fungerar med andra beroende tjänster innan de sammanfogas till målgrenen och distribueras till produktion.
Använda Azure Kubernetes Service
Ett ServiceAccount skapas i det valda klustret och namnområdet när du använder Azure Kubernetes Service (AKS). För ett Kubernetes RBAC-aktiverat kluster skapas Även RoleBinding för att begränsa omfattningen för det skapade tjänstkontot till det valda namnområdet. För ett Kubernetes RBAC-inaktiverat kluster har servicekontot som skapats klusteromfattande behörigheter (över namnområden).
Lägga till en AKS Kubernetes-resurs
På sidan miljöinformation väljer du Lägg till resurs och väljer Kubernetes.
Välj Azure Kubernetes Service i listrutan Provider.
Välj Azure-prenumerationen, klustret och namnområdet (ny/befintlig).
Välj Verifiera och skapa för att skapa Kubernetes-resursen.
Kontrollera att du ser ett kluster för din miljö. Du ser texten "Aldrig distribuerad" om du ännu inte har distribuerat kod till klustret.
Använda ett befintligt tjänstkonto
Azure Kubernetes Service mappar en Kubernetes-resurs i din miljö till ett namnområde.
Mer information om hur du konfigurerar en Kubernetes-tjänstanslutning utanför en miljö finns i avsnittet Kubernetes-tjänstanslutning i Tjänstanslutningar.
Dricks
Använd den allmänna providern (befintligt tjänstkonto) för att mappa en Kubernetes-resurs till ett namnområde från ett icke-AKS-kluster.
Lägga till en Kubernetes-resurs som inte är AKS
På sidan miljöinformation väljer du Lägg till resurs och väljer Kubernetes.
Välj Allmän provider (befintligt tjänstkonto) för din leverantör.
Lägg till klusternamn och namnområdesvärden.
Lägg till server-URL:en. Du kan hämta URL:en med följande kommando:
kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
För att hämta det hemliga objektet.
Kubernetes 1.22+
Ersätt
service-account-name
med ditt kontonamn.kubectl get secret -n <namespace> -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name==\"service-account-name\")]}'
Om du inte får något kan du läsa Skapa en API-token manuellt för ett ServiceAccount.
Kubernetes 1.22 och lägre:
- Hitta namnet på tjänstkontots hemlighet
kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
- ersätt
<service-account-secret-name>
med värdet i föregående kommando i det här kommandot
kubectl get secret <service-account-secret-name> -n <namespace> -o json
Hämta det hemliga objektet med hjälp av utdata från föregående steg.
kubectl get secret <service-account-secret-name> -n <namespace> -o json
Kopiera och klistra in det hemlighetsobjekt som hämtats i JSON-formulär i fältet Hemlighet.
Välj Verifiera och skapa för att skapa Kubernetes-resursen.
Referera till dina Kubernetes-resurser i en pipeline
Om du använder Azure Kubernetes Service och skapar en YAML-pipeline är det enklaste sättet att konfigurera din pipeline att använda en mall. Anslut till lagringsplatsen och välj något av följande två Kubernetes Service-alternativ:
- Distribuera till Azure Kubernetes Services-mall
- Distribuera till Kubernetes – Granska appen med Azure DevSpaces
Med mallarna kan du konfigurera Granska app utan att behöva skriva YAML-kod från grunden eller manuellt skapa explicita rollbindningar.
Konfigurera granskningsapp
I följande exempel körs det första distributionsjobbet för icke-PR-grenar och distributioner mot en vanlig Kubernetes-resurs under miljöer. Det andra jobbet körs endast för PR-grenar och distribueras mot Granska appresurser (namnområden i Kubernetes-klustret) som genereras på begäran. Resurser får etiketten "Granska" i resurslistningsvyn för miljön. Definiera variabler som ska användas i pipelinen. Om du använder mallen Distribuera till Azure Kubernetes Services definieras dessa variabler åt dig.
# 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"
Om du vill använda det här jobbet i en befintlig pipeline måste tjänstanslutningen som stöder den vanliga Kubernetes-miljöresursen ändras till "Använd autentiseringsuppgifter för klusteradministratör". Annars måste rollbindningar skapas för det underliggande tjänstkontot till granskningsappens namnområde.