我正在尝试通过 AKS 上的 Terraform 代码进行 Helm 图表部署。
我拥有的 TF 代码将在 Datadog 中创建一个资源,我将从中获取一个输出值,该输出值将传递到我的 Helm 版本以部署在我的集群上。它只需创建两个资源,其中之一是 Helm 图表。
我遇到的问题是针对 Kubernetes 集群进行身份验证,我使用数据源从集群中获取凭据,然后将它们传递到我的
kubernetes
和 helm
提供程序中。
我的 AKS 集群的 Terraform 状态存储在 Azure 存储帐户的 Blob 内。
我尝试更新 Helm 图表版本,使用不同的方法来访问变量周围的数据,例如
${}
。
尝试从 username = data.azurerm_kubernetes_cluster.credentials.kube_config.0.username
更改为使用管理配置 username = data.azurerm_kubernetes_cluster.credentials.kube_admin_config.0.username
试过
Terraform version: 1.1.7
数据源已设置为将 AKS 集群的凭据引入
main.tf
data "azurerm_kubernetes_cluster" "credentials" {
name = var.aks_cluster_name
resource_group_name = var.aks_cluster_resource_group_name
}
这是
versions.tf
以及用于设置与 AKS 的连接的内容。
terraform {
required_providers {
datadog = {
source = "DataDog/datadog"
}
}
backend "azurerm" {
}
}
provider "azurerm" {
features {}
}
provider "helm" {
debug = true
kubernetes {
username = data.azurerm_kubernetes_cluster.credentials.kube_config.0.username
password = data.azurerm_kubernetes_cluster.credentials.kube_config.0.password
host = data.azurerm_kubernetes_cluster.credentials.kube_config.0.host
client_certificate = base64decode(data.azurerm_kubernetes_cluster.credentials.kube_config.0.client_certificate)
client_key = base64decode(data.azurerm_kubernetes_cluster.credentials.kube_config.0.client_key)
cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.credentials.kube_config.0.cluster_ca_certificate)
}
}
provider "kubernetes" {
username = data.azurerm_kubernetes_cluster.credentials.kube_config.0.username
password = data.azurerm_kubernetes_cluster.credentials.kube_config.0.password
host = data.azurerm_kubernetes_cluster.credentials.kube_config.0.host
client_certificate = base64decode(data.azurerm_kubernetes_cluster.credentials.kube_config.0.client_certificate)
client_key = base64decode(data.azurerm_kubernetes_cluster.credentials.kube_config.0.client_key)
cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.credentials.kube_config.0.cluster_ca_certificate)
}
我在运行
terraform apply
时看到的错误,它将报告它无法在集合中找到我的提供程序中指定的任何属性的元素:
╷
│ Error: Invalid index
│
│ on versions.tf line 26, in provider "helm":
│ 26: host = data.azurerm_kubernetes_cluster.credentials.kube_admin_config.0.host
│ ├────────────────
│ │ data.azurerm_kubernetes_cluster.credentials.kube_admin_config has a sensitive value
│
│ The given key does not identify an element in this collection value.
╵
[ ... ]
╷
│ Error: Invalid index
│
│ on versions.tf line 27, in provider "helm":
│ 27: username = data.azurerm_kubernetes_cluster.credentials.kube_admin_config.0.username
│ ├────────────────
│ │ data.azurerm_kubernetes_cluster.credentials.kube_admin_config has a sensitive value
│
│ The given key does not identify an element in this collection value.
鉴于上述方法没有产生任何结果,我不确定如何更改我的 Terraform 代码以使此身份验证有效。如果需要,我可以提供用于资源部署的 TF 代码。
我正在使用 kubelogin 来识别自己的身份:
data "azurerm_client_config" "current" {
}
provider "helm" {
kubernetes {
host = azurerm_kubernetes_cluster.aks.kube_config.0.host
cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.cluster_ca_certificate)
exec {
api_version = "client.authentication.k8s.io/v1beta1"
args = [
"get-token",
"--environment", "AzurePublicCloud",
"--server-id", "6dae42f8-4368-4678-94ff-3960e28e3630", # The AAD server app ID of AKS Managed AAD is always 6dae42f8-4368-4678-94ff-3960e28e3630 in any environments.
"--client-id", "${yamldecode(azurerm_kubernetes_cluster.aks.kube_config_raw).users[0].user.auth-provider.config.client-id}",
"--tenant-id", data.azurerm_client_config.current.tenant_id,
"--login", "devicecode"
]
command = "kubelogin"
}
}
}
到目前为止,这是我找到的唯一可靠的方法。
provider "helm" {
repository_config_path = "${path.module}/.helm/repository.yml"
repository_cache = "${path.module}/.helm"
Kubernetes {
host = azurerm_kubernetes_cluster.aks.kube_config.0.host
cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks.kube_config.0.cluster_ca_certificate)
exec {
api_version = yamldecode(azurerm_kubernetes_cluster.aks.kube_config_raw).users[0].user.exec.apiVersion
args = yamldecode(azurerm_kubernetes_cluster.aks.kube_config_raw).users[0].user.exec.args
command = yamldecode(azurerm_kubernetes_cluster.aks.kube_config_raw).users[0].user.exec.command
}
}
}