使用Terraform创建AKS时如何配置Key Vault托管的RSA公钥作为节点SSH密钥
问题根因
- AKS节点
linux_profile配置的ssh_key.key_data,仅接受标准OpenSSH格式的公钥字符串(即以ssh-rsa开头的单行文本结构) - Azure Key Vault中通过
azurerm_key_vault_key资源创建的RSA密钥,采用JSON Web Key(JWK)结构化格式存储,仅暴露公指数、模数值等原始加密字段,无直接输出OpenSSH格式公钥的能力,纯HCL逻辑无法完成格式转换。 - Key Vault的机密(Secret)存储能力支持任意格式文本存储,可直接适配AKS的公钥配置要求,全程无需本地存储任何密钥文件。
可落地方案
实现流程
- 生成无本地落地的RSA密钥对
使用tls_private_key资源生成2048位RSA类型密钥,密钥全生命周期在Terraform运行时内存中完成,不会在本地磁盘留下任何密钥文件:resource "tls_private_key" "aks_linux_ssh" { algorithm = "RSA" rsa_bits = 2048 } - 将OpenSSH格式公钥存入Key Vault托管
直接引用tls_private_key资源输出的public_key_openssh字段(该字段输出值本身就是AKS要求的标准OpenSSH格式),写入Key Vault的Secret中统一托管:resource "azurerm_key_vault_secret" "aks_linux_ssh_pubkey" { name = "aks-linux-ssh-pubkey" value = tls_private_key.aks_linux_ssh.public_key_openssh key_vault_id = azurerm_key_vault.example-keyvault.id } - AKS配置直接引用托管公钥
无需文件下载、无需本地读取操作,直接将Key Vault中存储的公钥值填充到AKS的SSH配置块中:resource "azurerm_kubernetes_cluster" "k8s" { name = var.cluster_name location = azurerm_resource_group.k8s.location resource_group_name = azurerm_resource_group.k8s.name dns_prefix = var.dns_prefix linux_profile { admin_username = "ubuntu" ssh_key { key_data = azurerm_key_vault_secret.aks_linux_ssh_pubkey.value } } # 其余原有AKS配置逻辑保持不变 }
无效方案说明
- 通过Azure CLI下载Key Vault中JWK类型密钥导出的PEM格式公钥,本质是X.509编码格式,和AKS要求的OpenSSH编码格式不兼容,需要额外依赖本地工具做格式转换,违背“无本地密钥管理”的目标。
- 尝试拼接
azurerm_key_vault_key数据源输出的原始JWK字段生成公钥,需要实现base64编码、字段拼接、协议头格式化等逻辑,现有Terraform内置函数无法简洁完成,工程落地成本极高。 - azurerm Key Vault密钥数据源输出的PEM格式公钥,无法被AKS直接识别,必须经过格式转换才能使用。
内容的提问来源于stack exchange,提问作者Maximilian Jesch
相关产品推荐
相关产品推荐

