使用 Terraform 管理 GKE 及其部署

Posted

技术标签:

【中文标题】使用 Terraform 管理 GKE 及其部署【英文标题】:Managing GKE and its deployments with Terraform 【发布时间】:2019-06-19 05:50:34 【问题描述】:

我可以使用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 部署。 【参考方案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)"

【讨论】:

您应该在答案中包含链接中的关键信息。

以上是关于使用 Terraform 管理 GKE 及其部署的主要内容,如果未能解决你的问题,请参考以下文章

在 GKE 集群上使用 Terraform 部署 Helm 工作负载

使用 Terraform 部署时 GKE Autopilot 无法调度

将现有 GKE 集群添加到 terraform stat 文件

在 terraform 中禁用时默认启用 GKE 屏蔽节点

如何使用 Terraform 将 GKE 凭证传递给 Kubernetes 提供者?

将谷歌云盔甲添加到 Terraform gke 和 kubernetes