我将 AKS 集群与 Entra 集成,并启用了具有自定义服务主体的 Azure RBAC。我正在尝试通过 terraform 准备部署 helm 图表,并为此取消硬编码一些值。 该文件是根据 az cli 生成的 kubeconfig 创建的,并且按预期工作:
provider "helm" {
kubernetes {
host = module.kubernetes.kubernetes_cluster.kube_config.0.host
cluster_ca_certificate = base64decode(module.kubernetes.kubernetes_cluster.kube_config.0.cluster_ca_certificate)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
args = ["get-token",
"--environment", "AzurePublicCloud",
"--server-id", "{cryptic-value}",
"--client-id", "{cryptic-value}",
"--tenant-id", data.azurerm_subscription.main.tenant_id,
"--login", "devicecode"
]
command = "kubelogin"
}
}
}
在这种情况下,
--server-id
和 --client-id
是什么?客户端 ID 与我为集群配置的客户端 ID 不同。我还在 az cli 输出中发现了类似的提及,但它们的值为空:
"aadProfile": {
"adminGroupObjectIDs": [
"value removed"
],
"adminUsers": null,
"clientAppId": null,
"enableAzureRbac": true,
"managed": true,
"serverAppId": null,
"serverAppSecret": null,
"tenantId": "value removed"
}
如何取消对这两个值的硬编码以及除了 kubeconfig 文件之外在哪里可以找到它们?
AKS kubeconfig 中的服务器 ID 和客户端 ID 是什么?
由于您的 AKS 集群启用了 Azure RBAC,Azure 认为 AKS 集群配置的
clientAppId
中的 serverAppId
和 null
是 aadProfile
,这表明 Azure 在幕后管理这些详细信息。对于使用 kubectl
访问 AKS 集群等操作,通常不需要手动指定这些 ID。
如何取消对这两个值的硬编码
为了避免 硬编码
clientAppId
和 serverAppId
,您可以将它们存储在 Azure Key Vault Secret 中,并使用 terraform 数据块来检索它们。
要为 clientAppId 和 serverAppId 创建密钥保管库和两个密钥,请按照以下步骤操作:
在 Azure 门户中创建
key vault
。导航到秘密,然后选择 Generate/Import
选项 > 为 clientAppId
和 serverAppId
添加秘密。
注意:要从 Key Vault 访问机密,您需要拥有适当的权限。
这里是更新的 terraform 代码,用于传递应用程序 ID 和服务器 ID,无需硬编码。
data "azurerm_key_vault" "example" {
name = "mykeyvault"
resource_group_name = "<keyvault-RG-Name>"
}
data "azurerm_key_vault_secret" "client-id" {
name = "client-id"
key_vault_id = data.azurerm_key_vault.example.id
}
data "azurerm_key_vault_secret" "server-id" {
name = "server-id"
key_vault_id = data.azurerm_key_vault.example.id
}
provider "helm" {
kubernetes {
host = module.kubernetes.kubernetes_cluster.kube_config.0.host
cluster_ca_certificate = base64decode(module.kubernetes.kubernetes_cluster.kube_config.0.cluster_ca_certificate)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
args = ["get-token",
"--environment", "AzurePublicCloud",
"--server-id", data.azurerm_key_vault_secret.server-id,
"--client-id", data.azurerm_key_vault_secret.client-id,
"--client-id", data.azurerm_subscription.main.tenant_id,
"--login", "devicecode"
]
command = "kubelogin"
}
}
}
或者,您也可以使用 terraform 中的
kube_config值连接到
aks cluster
,而无需传递 client-id 和 server-id。请点击我回答的堆栈链接以获取更多详细信息。