【问题标题】:Managing GKE and its deployments with Terraform使用 Terraform 管理 GKE 及其部署
【发布时间】:2021-11-14 15:30:41
【问题描述】:

我可以使用terraformGKE 中部署Kubernetes 集群。

然后我为Kubernetes设置了provider,如下:

provider "kubernetes" {
  host                    = "${data.google_container_cluster.primary.endpoint}"

  client_certificate      = "${base64decode(data.google_container_cluster.primary.master_auth.0.client_certificate)}"
  client_key              = "${base64decode(data.google_container_cluster.primary.master_auth.0.client_key)}"
  cluster_ca_certificate  = "${base64decode(data.google_container_cluster.primary.master_auth.0.cluster_ca_certificate)}"
}

默认情况下,terraformKubernetes 与用户 client 交互,该用户无权创建(例如)部署。因此,当我尝试使用 terraform 应用我的更改时出现此错误:

Error: Error applying plan:

1 error(s) occurred:

 * kubernetes_deployment.foo: 1 error(s) occurred:

 * kubernetes_deployment.foo: Failed to create deployment: deployments.apps is forbidden: User "client" cannot create deployments.apps in the namespace "default"

我不知道现在应该如何进行,我应该如何将此权限授予client 用户?

如果将以下字段添加到提供程序,我可以执行部署,尽管在阅读文档后似乎这些凭据用于HTTP 与集群通信,如果通过互联网完成,这是不安全的.

username              = "${data.google_container_cluster.primary.master_auth.0.username}"
password              = "${data.google_container_cluster.primary.master_auth.0.password}"

还有其他更好的方法吗?

【问题讨论】:

  • 如果您找到有关如何执行此操作的其他资源,请随时编辑您的问题。我目前遇到了完全相同的问题,似乎没有完整的端到端示例来说明如何使用较新的 RBAC 在其中部署 GKE 集群和 Kubernetes 部署。

标签: kubernetes google-kubernetes-engine terraform-provider-gcp terraform-provider-kubernetes


【解决方案1】:
  • 您可以使用运行 terraform 的服务帐户
data "google_client_config" "default" {}

provider "kubernetes" {
  host     = "${google_container_cluster.default.endpoint}"

  token = "${data.google_client_config.default.access_token}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.default.master_auth.0.cluster_ca_certificate)}"

  load_config_file = false
}

  • 授予默认“客户端”权限
  • 但是您需要在 GKE 集群提供程序上进行有效身份验证才能运行此:/ ups 循环依赖在这里
resource "kubernetes_cluster_role_binding" "default" {
  metadata {
    name = "client-certificate-cluster-admin"
  }
  role_ref {
    api_group = "rbac.authorization.k8s.io"
    kind = "ClusterRole"
    name = "cluster-admin"
  }
  subject {
    kind = "User"
    name = "client"
    api_group = "rbac.authorization.k8s.io"
  }
  subject {
    kind = "ServiceAccount"
    name = "default"
    namespace = "kube-system"
  }
  subject {
    kind = "Group"
    name = "system:masters"
    api_group = "rbac.authorization.k8s.io"
  }
}

【讨论】:

  • 谢谢!我的 terraform 使用对集群具有必要权限的 GCP 身份运行,但我不知道如何配置 Kubernetes 提供程序以使用这些凭据。您的第一个示例展示了如何使用“google_client_config”获取 OAuth 令牌,这正是我所需要的。如果有人遇到类似情况,我会补充一点,您必须确保在使用此解决方案时没有指定“client_certificate”或“client_key”值——只应提供“token”。
【解决方案2】:

您使用的用户似乎缺少创建部署所需的 RBAC 角色。确保用户对部署资源有正确的动词。你可以看看这个Role examples 来了解一下。

【讨论】:

    【解决方案3】:

    您需要同时提供两者。查看this example,了解如何将 Kubernetes 提供程序与 Google 提供程序集成。

    如何配置 Kubernetes 提供者的示例:

    provider "kubernetes" {
      host     = "${var.host}"
      username = "${var.username}"
      password = "${var.password}"
    
      client_certificate     = "${base64decode(var.client_certificate)}"
      client_key             = "${base64decode(var.client_key)}"
      cluster_ca_certificate = "${base64decode(var.cluster_ca_certificate)}"
    }
    

    【讨论】:

    • 您应该在答案中包含链接中的关键信息。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2020-09-18
    • 2019-09-04
    • 2021-12-19
    • 1970-01-01
    • 2022-01-22
    • 2020-05-04
    相关资源
    最近更新 更多