terraform 不断覆盖 kubernetes 提供者的令牌
terraform keeps overwriting token for kubernetes provider
我们正在尝试 运行 terraform apply
在我们的 terraform 文件中使用以下 kubernetes 提供程序设置:
data "google_client_config" "current" {
}
data "google_container_cluster" "onboarding_cluster" {
name = var.cluster_name
location = var.cluster_location
}
provider "kubernetes" {
load_config_file = false
host = data.google_container_cluster.onboarding_cluster.endpoint
cluster_ca_certificate = base64decode(data.google_container_cluster.onboarding_cluster.master_auth[0].cluster_ca_certificate)
token = data.google_client_config.current.access_token
}
resource "kubernetes_service_account" "service_account" {
metadata {
name = var.kubernetes_service_account_name
namespace = var.kubernetes_service_account_namespace
}
}
但是我们收到以下错误:
Error: Unauthorized
on main.tf line 85, in resource "kubernetes_service_account" "service_account":
85: resource "kubernetes_service_account" "service_account" {
将 TF_LOG
设置为 DEBUG
后,我们看到创建 kubernetes 服务帐户的请求如下:
---[ REQUEST ]---------------------------------------
POST /api/v1/namespaces/default/serviceaccounts HTTP/1.1
...
Authorization: Bearer <SOME_KUBERNETES_JWT>
即使我们在提供商中对令牌进行硬编码,身份验证不记名令牌也会被覆盖!例如:
provider "kubernetes" {
load_config_file = false
host = data.google_container_cluster.onboarding_cluster.endpoint
cluster_ca_certificate = base64decode(data.google_container_cluster.onboarding_cluster.master_auth[0].cluster_ca_certificate)
token = "some.hardcoded.token"
}
即使采用上述方式,令牌在 HTTP 请求中仍将保持不变。
我们发现在 header 中发送的令牌位于 /run/secrets/kubernetes.io/serviceaccount/token
的 terraform 容器中。
terraform 是否有任何理由用 kubernetes 生成的令牌覆盖此令牌?我们可以尝试其他设置吗?
这是 kubernetes 提供程序的问题。 Github 问题在这里:https://github.com/terraform-providers/terraform-provider-kubernetes/issues/679
要修复,请将您的提供商版本设置为 1.9,如下所示:
provider "kubernetes" {
version = "1.9"
cluster_ca_certificate = base64decode(
data.google_container_cluster.this.master_auth[0].cluster_ca_certificate,
)
host = data.google_container_cluster.this.endpoint
token = data.external.get_token.result["token"]
load_config_file = false
}
我们正在尝试 运行 terraform apply
在我们的 terraform 文件中使用以下 kubernetes 提供程序设置:
data "google_client_config" "current" {
}
data "google_container_cluster" "onboarding_cluster" {
name = var.cluster_name
location = var.cluster_location
}
provider "kubernetes" {
load_config_file = false
host = data.google_container_cluster.onboarding_cluster.endpoint
cluster_ca_certificate = base64decode(data.google_container_cluster.onboarding_cluster.master_auth[0].cluster_ca_certificate)
token = data.google_client_config.current.access_token
}
resource "kubernetes_service_account" "service_account" {
metadata {
name = var.kubernetes_service_account_name
namespace = var.kubernetes_service_account_namespace
}
}
但是我们收到以下错误:
Error: Unauthorized
on main.tf line 85, in resource "kubernetes_service_account" "service_account":
85: resource "kubernetes_service_account" "service_account" {
将 TF_LOG
设置为 DEBUG
后,我们看到创建 kubernetes 服务帐户的请求如下:
---[ REQUEST ]---------------------------------------
POST /api/v1/namespaces/default/serviceaccounts HTTP/1.1
...
Authorization: Bearer <SOME_KUBERNETES_JWT>
即使我们在提供商中对令牌进行硬编码,身份验证不记名令牌也会被覆盖!例如:
provider "kubernetes" {
load_config_file = false
host = data.google_container_cluster.onboarding_cluster.endpoint
cluster_ca_certificate = base64decode(data.google_container_cluster.onboarding_cluster.master_auth[0].cluster_ca_certificate)
token = "some.hardcoded.token"
}
即使采用上述方式,令牌在 HTTP 请求中仍将保持不变。
我们发现在 header 中发送的令牌位于 /run/secrets/kubernetes.io/serviceaccount/token
的 terraform 容器中。
terraform 是否有任何理由用 kubernetes 生成的令牌覆盖此令牌?我们可以尝试其他设置吗?
这是 kubernetes 提供程序的问题。 Github 问题在这里:https://github.com/terraform-providers/terraform-provider-kubernetes/issues/679
要修复,请将您的提供商版本设置为 1.9,如下所示:
provider "kubernetes" {
version = "1.9"
cluster_ca_certificate = base64decode(
data.google_container_cluster.this.master_auth[0].cluster_ca_certificate,
)
host = data.google_container_cluster.this.endpoint
token = data.external.get_token.result["token"]
load_config_file = false
}