【问题标题】:terraform (0.11 and 0.12) apply works on 1 machine, but not on the otherterraform(0.11 和 0.12)适用于一台机器,但不适用于另一台机器
【发布时间】:2019-10-22 08:48:23
【问题描述】:

在 2 台不同的 Windows 10 机器上工作,其中“terraform apply”在一台机器上工作,但在另一台机器上不工作。在移动到第二台电脑之前,我完全删除了 gcp 上的基础设施,并确保我只复制了 tf 文件 + 基本的 json。 (没有状态文件等)自从为管道做准备以来,我希望有一个干净的环境开始

codesnippit(完整的脚本在最后,在下面):

provider "kubernetes" {
  host     = "https://${google_container_cluster.primary.endpoint}"
  username = "${var.username}"
  password = "${var.password}"
  client_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].client_certificate)}"
  client_key = "${base64decode(google_container_cluster.primary.master_auth[0].client_key)}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].cluster_ca_certificate)}"
  version = "~> 1.7"
}

# Namespace
resource "kubernetes_namespace" "testspace" {
  metadata {
    annotations = {
      name = "testspace"
    }
    name = "testspace"
  }
}

根据我看到的所有示例,这应该可以工作,并且在我的笔记本电脑上确实可以,但在我的第二台机器上我收到以下错误:

Error: Failed to configure: username/password or bearer token may be set, but not both

  on Deploy_Test.tf line 1, in provider "kubernetes":
   1: provider "kubernetes" {

如果我删除用户名和密码,错误就会消失,但我无法创建命名空间,因为我没有授权?错误状态:

Error: namespaces is forbidden: User "client" cannot create namespaces at the cluster scope

现在我有点迷失了:这段代码在一台电脑上运行良好,但在另一台电脑上运行良好,我不知道为什么。在从新的干净 terraform 文件夹中开始后,再次从 pc 重新部署时 希望有人知道在哪里看?

到目前为止尝试了以下方法:
更新到 0.12.1 - 没有区别。
降级到 0.11 - 没有区别。
尝试了使用证书或用户名/密码组合的所有不同组合


provider "google" {
  credentials = file("account.json")
  project     = var.project
  region      = var.region
  version =  "~> 2.7"
}

resource "google_container_cluster" "primary" {
  name               = "${var.name}-cluster"
  location           = var.region
  initial_node_count = 1
  master_auth {
    username = var.username
    password = var.password
    /*
    client_certificate_config {
      issue_client_certificate = true
    }
    */
  }
  node_version       = "1.11.10-gke.4"
  min_master_version = "1.11.10-gke.4"
  node_config {
    preemptible  = true
    machine_type = "n1-standard-1"

    metadata = {
      disable-legacy-endpoints = "true"
    }

    oauth_scopes = [
      "https://www.googleapis.com/auth/compute",
      "https://www.googleapis.com/auth/devstorage.read_only",
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
  }
}
provider "kubernetes" {
  host     = "https://${google_container_cluster.primary.endpoint}"
  username = "${var.username}"
  password = "${var.password}"
  client_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].client_certificate)}"
  client_key = "${base64decode(google_container_cluster.primary.master_auth[0].client_key)}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].cluster_ca_certificate)}"
  version = "~> 1.7"
}

# Namespace
resource "kubernetes_namespace" "testspace" {
  metadata {
    annotations = {
      name = "testspace"
    }
    name = "testspace"
  }
}

【问题讨论】:

    标签: google-cloud-platform terraform google-kubernetes-engine


    【解决方案1】:

    这里有两个问题,首先:

    错误:配置失败:可以设置用户名/密码或不记名令牌,但不能同时设置

    告诉您,您可以使用用户名和密码进行身份验证,也可以使用不记名令牌进行身份验证。首先,您的错误似乎来自这里:

    provider "kubernetes" {
      host     = "https://${google_container_cluster.primary.endpoint}"
      username = "${var.username}"
      password = "${var.password}"
      client_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].client_certificate)}"
      client_key = "${base64decode(google_container_cluster.primary.master_auth[0].client_key)}"
      cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].cluster_ca_certificate)}"
      version = "~> 1.7"
    }
    

    基本上,您指向的是三个 .pem 文件,并且您正在尝试使用用户/密码进行身份验证。选择一个或另一个。有关该特定错误的详细信息,请参阅this page 关于 kubernetes 提供程序(特别是“静态定义的凭据”)。

    也就是说:

    错误:命名空间被禁止:用户“客户端”无法在集群范围内创建命名空间

    是在告诉你,你没有权限去做你想做的事情。一旦您可以确定它正在尝试进行身份验证的内容,您就可以确定什么是错误的。看起来是您的 client_certificate、client_key 和/或 cluster_ca_certificate 在第二台计算机上已过期,但不是第一台计算机。如果您的gcloud config set container/use_client_certificate 为真,我认为应该是cluster_ca_certificate 已过时。 This answer 有更多相关信息。

    如果不是这样,我们将不得不进一步调查。

    【讨论】:

    • 感谢 J. Olsson 的快速回复,我看不出 google 提供者凭据与 kubernetes 提供者的身份验证有何关系,错误说明:Error: Failed to configure: username/password or bearer token may be set, but not both on Deploy_Test.tf line 1, in provider "kubernetes":but will tr​​y as You建议。但是,我发布这个问题的原因是:为什么它在一台机器(笔记本电脑)上工作,而不是在另一台机器上工作。从我的 Win10 笔记本电脑运行时,发布的脚本没有给我任何错误,但使用另一台 win10 机器它显示这些错误
    • 哦,抱歉。我在很困的时候回答,肯定只是抓住了第一个“提供者”块并回答了错误的问题。该问题与statically defined credentials 或应该相关。我的感觉是您在第二台计算机上的 .pem 文件已过期,而在第一台计算机上它们是正确的。
    • 在一点更新中,我在不工作的电脑上启动了一个 linux Vm,我也可以在那里运行代码。这让我相信这不是代码问题,而是 terraform vs PC 问题。顺便说一句,使用相同的凭据(file.json)对 GCP 进行身份验证,所以剩下的唯一问题是:为什么我会在这台电脑上收到错误消息 Error: Failed to configure: username/password or bearer token may be set, but not both
    • 我只记得,我之前安装了 Docker Desktop,使用后卸载了它。刚刚验证了这一点,没有 docker,或者 kubectl 离开了。但它可能会留下相同的痕迹,比如默认的 kubectl 配置上下文,会尝试找到一些遗留的注册表垃圾
    • 是的,这非常……有趣……作为一个问题。应该是只设置了两者中的一个(密钥或用户/密码),但由于它在您的另一台计算机上都可以使用,所以它应该在这里工作。我不会撒谎——我有点难过,尽管我的回答听起来很有信心。我会继续考虑的。
    【解决方案2】:

    找到原因: 以前我已经安装了 Docker Desktop。删除后,它留下了一些垃圾,在这种情况下,在 c:\users\%username% 上有一个 .kube 文件夹,其中包含一个 kube 配置文件,其中包含使用的证书。
    我压缩了文件夹内容,并删除了文件夹。之后,terraform 的工作方式与其他机器上的类似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多