如何在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
相关产品推荐
相关产品推荐

