能否通过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
相关产品推荐
相关产品推荐

