【问题标题】:terraform keeps overwriting token for kubernetes providerterraform 不断覆盖 kubernetes 提供者的令牌
【发布时间】:2020-03-14 09:17:20
【问题描述】:

我们正在尝试使用 terraform 文件中的以下 kubernetes 提供程序设置运行 terraform apply

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 请求中也将保持不变。

我们发现在 auth 标头中发送的令牌位于 /run/secrets/kubernetes.io/serviceaccount/token 的 terraform 容器中。

terraform 是否有任何理由会用 kubernetes 生成的令牌覆盖此令牌?我们可以尝试其他设置吗?

【问题讨论】:

    标签: terraform terraform-provider-kubernetes


    【解决方案1】:

    这是 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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 2020-08-15
      • 2021-07-17
      • 2020-09-09
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多