在 Terraform 中从 Kubernetes 服务帐户检索令牌数据

Ell*_*val 6 kubernetes terraform

我正在使用 terraform 创建一个 Kubernetes 服务帐户,并尝试从它创建的 Kubernetes Secret 中输出令牌。

resource "kubernetes_service_account" "ci" {
  metadata {
    name = "ci"
  }
}

data "kubernetes_secret" "ci" {
  metadata {
    name = "${kubernetes_service_account.ci.default_secret_name}"
  }
}

output "ci_token" {
  value = "${data.kubernetes_secret.ci.data.token}"
}
Run Code Online (Sandbox Code Playgroud)

根据文档,由于 的计算值,这应该使数据块推迟获取其值直到“应用”阶段default_secret_name,但是当我运行terraform apply它时,它给了我这个错误:

Error: Error running plan: 1 error(s) occurred:

* output.ci_token: Resource 'data.kubernetes_secret.ci' does not have attribute 'data.token' for variable 'data.kubernetes_secret.ci.data.token'
Run Code Online (Sandbox Code Playgroud)

添加depends_onkubernetes_secret数据块没有任何区别。

如果我注释掉该output块,它会很好地创建资源,然后我可以取消注释它,再次应用,一切都正常运行,因为 Kubernetes Secret 已经存在。

我也在这里发了一个 Github 问题。

更新

接受的答案确实解决了这个问题,但我省略了另一个输出来简化问题,这不适用于此解决方案:

output "ci_crt" {
  value = "${data.kubernetes_secret.ci.data.ca.crt}"
}
Run Code Online (Sandbox Code Playgroud)
* output.ci_ca: lookup: lookup failed to find 'ca.crt' in:

${lookup(data.kubernetes_secret.ci.data, "ca.crt")}
Run Code Online (Sandbox Code Playgroud)

由于Terraform 中的一个错误,这里报告了这个特殊问题,该错误已在 0.12 版中修复。

Pat*_*cat 13

这有效:

resource "kubernetes_service_account" "ci" {
  metadata {
    name = "ci"
  }
}

data "kubernetes_secret" "ci" {
  metadata {
    name = "${kubernetes_service_account.ci.default_secret_name}"
  }
}

output "ci_token" {
  value = "${lookup(data.kubernetes_secret.ci.data, "token")}"
}
Run Code Online (Sandbox Code Playgroud)

  • default_secret_name 已于 2022 年弃用 (2认同)