環境 - Kubernetes 資源
Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
Kubernetes 資源檢視提供對應至資源之命名空間內物件狀態的一目了然。 此檢視也會重迭管線可追蹤性,讓您可以將 Kubernetes 物件追蹤回管線,然後再回到認可。
使用 Kubernetes 資源,在 環境中 以 Kubernetes 叢集為目標進行部署。 使用管線部署至任何其他雲端提供者Azure Kubernetes Service (AKS) 和叢集。
您可以搭配公用或私人叢集使用 Kubernetes 資源。 若要深入瞭解資源的運作方式,請參閱 YAML 中的資源 與 資源的安全性。
概觀
請參閱在環境中使用 Kubernetes 資源檢視的下列優點:
管線可追蹤性 - 用於部署的 Kubernetes 資訊清單工作會新增更多批註,以顯示資源檢視中的管線可追蹤性。 管線可追蹤性有助於識別原始的 Azure DevOps 組織、專案和管線,負責更新命名空間內的物件。
診斷資源健康情況 - 工作負載狀態有助於快速偵錯新部署可能引進的錯誤或回歸。 例如,針對導致 ImagePullBackOff 錯誤的未設定 imagePullSecrets ,Pod 狀態資訊可協助您找出問題的根本原因。
檢閱應用程式 - 檢 閱應用程式的運作方式是將 Git 存放庫中的每個提取要求部署到環境中的動態 Kubernetes 資源。 檢閱者可以在合併到目標分支並部署到生產環境之前,先查看這些變更的外觀,並與其他相依服務搭配使用。
使用 Azure Kubernetes Service
當您使用 AKS Azure Kubernetes Service () 時,會在您選擇的叢集和命名空間中建立ServiceAccount。 針對已啟用 Kubernetes RBAC的叢集, RoleBinding 也會建立,以將已建立的服務帳戶範圍限制為所選的命名空間。 針對 Kubernetes RBAC 停用的叢集,建立的 ServiceAccount 具有跨命名空間) 的全叢集許可權 (。
新增 AKS Kubernetes 資源
在 [環境詳細資料] 頁面中,選取 [ 新增資源 ],然後選擇 [Kubernetes]。
在 [提供者] 下拉式清單中選取 [Azure Kubernetes Service]。
選擇 azure 訂用帳戶、叢集和命名空間 (新的/現有) 。
選取 [驗證並建立 ] 以建立 Kubernetes 資源。
確認您看到您環境的叢集。 如果您尚未將程式碼部署至叢集,您會看到「永不部署」文字。
使用現有的服務帳戶
Azure Kubernetes Service會將環境內的 Kubernetes 資源對應至命名空間。
如需在環境外部設定 Kubernetes 服務連線的詳細資訊,請參閱服務連線中的Kubernetes 服務連線一節。
提示
使用泛型提供者 (現有的服務帳戶) ,將 Kubernetes 資源對應至非 AKS 叢集的命名空間。
新增非 AKS Kubernetes 資源
在 [環境詳細資料] 頁面中,選取 [ 新增資源 ],然後選擇 [Kubernetes]。
選取 [一般提供者 (您提供者的現有服務帳戶) 。
新增叢集名稱和命名空間值。
新增伺服器 URL。 您可以使用下列命令來取得 URL:
kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
若要取得秘密物件。
Kubernetes 1.22+
以您的帳戶名稱取代
service-account-name
。kubectl get secret -n <namespace> -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name==\"service-account-name\")]}'
如果您未取得任何專案,請參閱 手動建立 ServiceAccount 的長期 API 權杖。
Kubernetes 1.22 和以下版本:
- 尋找服務帳戶秘密名稱
kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
- 將 取代
<service-account-secret-name>
為此命令中上一個命令中的值
kubectl get secret <service-account-secret-name> -n <namespace> -o json
使用上一個步驟的輸出取得秘密物件。
kubectl get secret <service-account-secret-name> -n <namespace> -o json
將 JSON 格式擷取的 Secret 物件複製並貼到 [秘密] 欄位中。
選取 [驗證並建立 ] 以建立 Kubernetes 資源。
參考管線中的 Kubernetes 資源
如果您使用Azure Kubernetes Service並建置 YAML 管線,設定管線最簡單的方式就是使用範本。 連線到您的存放庫,然後選取下列兩個 Kubernetes Service 選項之一:
- 部署至 Azure Kubernetes Services 範本
- 部署至 Kubernetes - 使用 Azure DevSpaces 檢閱應用程式
範本可讓您設定審核應用程式,而不需要從頭開始撰寫 YAML 程式碼,或手動建立明確的角色系結。
設定檢閱應用程式
在下列範例中,會針對非 PR 分支執行第一個部署作業,並在環境中針對一般 Kubernetes 資源執行部署。 第二個作業只會針對 PR 分支執行,並針對 Kubernetes 叢集內的檢閱應用程式資源 (命名空間部署,) 視需要產生。 資源會在環境的資源清單檢視中加上「檢閱」標籤。 定義管線中使用的變數。 如果您使用 部署至 Azure Kubernetes Services 範本,這些變數會為您定義。
# 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: $(envName).$(resourceName)
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: $(envName).$(resourceName)
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"
若要在 現有的 管線中使用此作業,必須修改備份一般 Kubernetes 環境資源的服務連線,以「使用叢集管理員認證」。 否則,必須針對基礎服務帳戶建立角色系結至檢閱應用程式命名空間。