You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure ADO中批量将变量传入PV、PVC等K8s资源文件?

实现AKS批量挂载Azure Blob容器的Azure DevOps Pipeline方案

核心思路

通过Azure DevOps Pipeline的多组变量集合结合参数化YAML模板,循环遍历变量集动态替换模板占位符,最终批量执行kubectl命令完成PV、PVC、ConfigMap及Deployment的创建,彻底替代手动编写数十份YAML的重复工作。

具体实现步骤

1. 准备参数化YAML模板

将各类K8s资源的YAML文件改为带占位符的模板,占位符直接使用Azure DevOps的变量格式$(变量名),方便后续Pipeline自动替换。

PV模板示例(pv-template.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: $(volume_name)
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: blob.csi.azure.com
    readOnly: false
    volumeHandle: $(storage_account_name)/$(container_name)
    nodeStageSecretRef:
      name: azure-secret
      namespace: default
    volumeAttributes:
      storageAccount: $(storage_account_name)

PVC模板示例(pvc-template.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: $(pvc_name)
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  volumeName: $(volume_name)
  storageClassName: ""

ConfigMap模板示例(cm-template.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-blob-$(volume_name)
data:
  container_name: $(container_name)
  storage_account: $(storage_account_name)

Deployment模板挂载片段示例

volumes:
- name: blob-volume-$(volume_name)
  persistentVolumeClaim:
    claimName: $(pvc_name)
containers:
- name: my-app
  volumeMounts:
  - name: blob-volume-$(volume_name)
    mountPath: /mnt/blob-storage/$(volume_name)

2. 在ADO Pipeline中配置多组变量

两种配置方式可选,根据变量数量灵活选择:

  • 变量组方式:提前在Azure DevOps中创建变量组,将每组volume_name、pvc_name、storage_account_name、container_name定义为变量组内的变量(需注意变量组无法直接循环,需配合脚本遍历)。
  • 矩阵变量方式:适合变量组数量较少的场景,直接在Pipeline中定义矩阵:
variables:
  azureSubscription: '你的Azure订阅连接'
  aksResourceGroup: 'AKS资源组名'
  aksClusterName: 'AKS集群名'

strategy:
  matrix:
    Volume_01:
      volume_name: pv-blob-01
      pvc_name: pvc-blob-01
      storage_account_name: sa-prod-01
      container_name: blob-container-01
    Volume_02:
      volume_name: pv-blob-02
      pvc_name: pvc-blob-02
      storage_account_name: sa-prod-02
      container_name: blob-container-02
    # 继续添加剩余20+组变量

3. 编写Pipeline任务批量创建资源

方案一:使用ADO内置File Transform任务替换变量

适合Windows/Linux代理通用场景:

steps:
# 替换PV模板变量并创建PV
- task: FileTransform@2
  inputs:
    folderPath: '$(System.DefaultWorkingDirectory)/yamls'
    fileType: 'yaml'
    targetFiles: 'pv-template.yaml'
  displayName: '替换PV模板变量'

- task: Kubernetes@1
  inputs:
    connectionType: 'Azure Resource Manager'
    azureSubscriptionEndpoint: '$(azureSubscription)'
    azureResourceGroup: '$(aksResourceGroup)'
    kubernetesCluster: '$(aksClusterName)'
    command: 'apply'
    useConfigurationFile: true
    configuration: '$(System.DefaultWorkingDirectory)/yamls/pv-template.yaml'
  displayName: '创建PersistentVolume: $(volume_name)'

# 替换PVC模板变量并创建PVC
- task: FileTransform@2
  inputs:
    folderPath: '$(System.DefaultWorkingDirectory)/yamls'
    fileType: 'yaml'
    targetFiles: 'pvc-template.yaml'
  displayName: '替换PVC模板变量'

- task: Kubernetes@1
  inputs:
    connectionType: 'Azure Resource Manager'
    azureSubscriptionEndpoint: '$(azureSubscription)'
    azureResourceGroup: '$(aksResourceGroup)'
    kubernetesCluster: '$(aksClusterName)'
    command: 'apply'
    useConfigurationFile: true
    configuration: '$(System.DefaultWorkingDirectory)/yamls/pvc-template.yaml'
  displayName: '创建PersistentVolumeClaim: $(pvc_name)'

# 重复上述逻辑,完成ConfigMap和Deployment的批量创建

方案二:使用envsubst命令直接替换(Linux代理适用)

更简洁的命令行方式,适合Linux自托管代理:

steps:
- script: |
    # 替换模板变量生成实际YAML文件
    envsubst < $(System.DefaultWorkingDirectory)/yamls/pv-template.yaml > pv-$(volume_name).yaml
    envsubst < $(System.DefaultWorkingDirectory)/yamls/pvc-template.yaml > pvc-$(pvc_name).yaml
    envsubst < $(System.DefaultWorkingDirectory)/yamls/cm-template.yaml > cm-$(volume_name).yaml
    
    # 批量应用资源
    kubectl apply -f pv-$(volume_name).yaml
    kubectl apply -f pvc-$(pvc_name).yaml
    kubectl apply -f cm-$(volume_name).yaml
    kubectl apply -f deployment-template.yaml # 若Deployment模板也做了参数化替换
  env:
    volume_name: $(volume_name)
    pvc_name: $(pvc_name)
    storage_account_name: $(storage_account_name)
    container_name: $(container_name)
  displayName: '批量创建Blob相关K8s资源'

4. 前置准备事项

  • 确保AKS集群已安装Azure Blob CSI驱动(默认AKS集群已预装,未安装则需手动部署)。
  • 提前在AKS集群中创建存储账户访问密钥的Secret(示例中名为azure-secret),供CSI驱动认证使用:
kubectl create secret generic azure-secret --from-literal=azurestorageaccountname=<存储账户名> --from-literal=azurestorageaccountkey=<存储账户密钥>

内容的提问来源于stack exchange,提问作者yasin mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:43:28