如何通过Terraform正确配置azurerm_kubernetes_flux_configuration的Git凭据
配置azurerm_kubernetes_flux_configuration的安全凭据方案
方案一:Azure AD联邦身份(推荐,无密钥管理负担)
这是Azure生态下最安全的方式,无需存储或维护PAT,直接依托AKS托管身份完成Azure DevOps Git仓库的访问授权。
- 为AKS集群启用OIDC Issuer并配置系统托管身份
resource "azurerm_kubernetes_cluster" "aks" { name = "my-aks-cluster" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name node_count = 3 identity { type = "SystemAssigned" } oidc_issuer_enabled = true }
- 在Azure DevOps中为AKS系统身份授权
- 进入项目设置 → 权限 → 服务主体
- 搜索AKS集群的系统身份名称,授予Git仓库读取权限(可选择项目贡献者或更细粒度的Git权限)
- 配置Flux资源使用托管身份认证
resource "azurerm_kubernetes_flux_configuration" "flux" { name = "flux-config" kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id namespace = "flux-system" git_repository { url = "https://dev.azure.com/your-org/your-project/_git/your-repo" branch = "main" } authentication { type = "ManagedIdentity" managed_identity { client_id = azurerm_kubernetes_cluster.aks.identity[0].principal_id } } sync_interval = "1m" }
方案二:AKS KeyVault CSI驱动挂载PAT
若必须使用PAT,通过CSI驱动直接从KeyVault挂载凭据到Flux控制器,彻底避免明文传递风险。
- 启用AKS的KeyVault Secrets Provider插件
resource "azurerm_kubernetes_cluster" "aks" { # 其他基础配置... addon_profile { keyvault_secrets_provider { enabled = true } } }
在KeyVault中存储PAT,并授予AKS系统身份对该密钥的读取权限
创建SecretProviderClass定义密钥挂载规则
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: flux-git-pat namespace: flux-system spec: provider: azure parameters: usePodIdentity: "false" useVMManagedIdentity: "true" userAssignedIdentityID: "<AKS系统身份ID>" keyvaultName: "<你的KeyVault名称>" objects: | array: - | objectName: "flux-git-pat" objectType: secret tenantId: "<你的Azure租户ID>"
- 在Flux配置中引用CSI挂载的密钥
resource "azurerm_kubernetes_flux_configuration" "flux" { name = "flux-config" kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id namespace = "flux-system" git_repository { url = "https://dev.azure.com/your-org/your-project/_git/your-repo" branch = "main" } authentication { type = "Secret" secret { name = "flux-git-pat" namespace = "flux-system" key = "flux-git-pat" } } sync_interval = "1m" }
方案三:CSI挂载密钥后通过Helm部署Flux
若偏好用Helm管理Flux生命周期,可先完成CSI密钥挂载,再在Helm配置中引用该密钥。
完成方案二中的SecretProviderClass配置,确保密钥已挂载到
flux-system命名空间用Terraform Helm Provider部署Flux并引用密钥
resource "helm_release" "flux" { name = "flux" repository = "https://fluxcd-community.github.io/helm-charts" chart = "flux2" namespace = "flux-system" create_namespace = true set { name = "git.url" value = "https://dev.azure.com/your-org/your-project/_git/your-repo" } set { name = "git.secretName" value = "flux-git-pat" } }
关键注意事项
- 联邦身份方案完全消除了PAT的管理成本,是Azure环境下的最优选择,优先推荐
- 所有权限配置遵循最小权限原则:AKS身份仅需Git仓库的读取权限,无需更高权限
- 禁止在Terraform代码、Pipeline变量中明文存储PAT,所有凭据必须通过KeyVault或托管身份管控
内容的提问来源于stack exchange,提问作者AleksP
相关产品推荐
相关产品推荐

