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

能否通过Terraform利用Azure Key Vault创建Kubernetes TLS Secret?

解决方案:通过Azure Key Vault + Terraform 创建K8s TLS Secret

前提条件

  • 已配置Terraform的Azure Provider,且有权限访问目标Key Vault
  • Key Vault已配置对应访问策略,允许Terraform服务主体读取机密/证书
  • 证书和私钥为PEM格式,若为PFX需先转换

方案一:将证书/私钥作为Key Vault机密存储

1. 上传证书和私钥到Key Vault

将PEM格式的证书(tls.crt)和私钥(tls.key)分别作为机密上传到Key Vault,无需提前Base64编码。

2. Terraform配置示例

# 配置Azure Provider
provider "azurerm" {
  features {}
}

# 读取Key Vault中的证书机密
data "azurerm_key_vault_secret" "tls_cert" {
  name         = "my-tls-cert" # Key Vault中证书机密的名称
  key_vault_id = "/subscriptions/<订阅ID>/resourceGroups/<资源组>/providers/Microsoft.KeyVault/vaults/<Key Vault名称>"
}

# 读取Key Vault中的私钥机密
data "azurerm_key_vault_secret" "tls_key" {
  name         = "my-tls-key" # Key Vault中私钥机密的名称
  key_vault_id = data.azurerm_key_vault_secret.tls_cert.key_vault_id
}

# 创建K8s TLS Secret
resource "kubernetes_secret" "tls_secret" {
  metadata {
    name      = "my-ingress-tls"
    namespace = "default"
  }

  type = "kubernetes.io/tls"

  data = {
    "tls.crt" = data.azurerm_key_vault_secret.tls_cert.value
    "tls.key" = data.azurerm_key_vault_secret.tls_key.value
  }
}

关键注意点

  • 上传的证书和私钥必须是原始PEM格式,Terraform的Kubernetes Provider会自动为data字段内容做Base64编码,无需手动处理。
  • 若使用PFX格式证书,需提前转换为PEM:
    # 提取证书PEM
    openssl pkcs12 -in cert.pfx -clcerts -nokeys -out tls.crt
    # 提取私钥PEM(需输入PFX密码)
    openssl pkcs12 -in cert.pfx -nocerts -out tls.key
    

方案二:使用Azure Key Vault证书资源

1. 将证书导入Key Vault作为证书资源

通过Azure门户或CLI导入证书(支持PFX/PEM),必须勾选允许导出私钥,否则无法获取私钥内容。

2. Terraform配置示例

# 读取Key Vault证书
data "azurerm_key_vault_certificate" "tls_cert" {
  name         = "my-keyvault-cert" # Key Vault中证书的名称
  key_vault_id = "/subscriptions/<订阅ID>/resourceGroups/<资源组>/providers/Microsoft.KeyVault/vaults/<Key Vault名称>"
}

# 创建K8s TLS Secret
resource "kubernetes_secret" "tls_secret" {
  metadata {
    name      = "my-ingress-tls"
    namespace = "default"
  }

  type = "kubernetes.io/tls"

  data = {
    "tls.crt" = data.azurerm_key_vault_certificate.tls_cert.certificate_pem
    "tls.key" = data.azurerm_key_vault_certificate.tls_cert.private_key_pem
  }
}

关键注意点

  • 导入证书时必须开启允许导出私钥,否则private_key_pem字段为空,Secret会失效。
  • certificate_pem字段返回完整证书链(若存在),完全符合K8s TLS Secret的要求。

排查之前失败的常见原因

  • 编码错误:提前对证书/私钥做Base64编码,存入Key Vault后又在Terraform中解码,导致内容格式错乱。K8s Secret的data字段只需原始内容,Terraform会自动处理编码。
  • 私钥权限不足:使用Key Vault证书时未开启允许导出私钥,导致无法获取私钥。
  • 证书格式不符:上传的证书不是PEM格式,或证书链不完整。
  • Ingress配置错误:确认Ingress资源中引用的Secret名称和Namespace与Terraform创建的一致,tls块配置示例:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      tls:
      - hosts:
        - example.com
        secretName: my-ingress-tls # 与Terraform创建的Secret名称一致
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:02:59