使用 Terraform 管理 GKE 及其部署
Posted
技术标签:
【中文标题】使用 Terraform 管理 GKE 及其部署【英文标题】:Managing GKE and its deployments with Terraform 【发布时间】:2019-06-19 05:50:34 【问题描述】:我可以使用terraform
在GKE
中部署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)"
默认情况下,terraform
与 Kubernetes
与用户 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 文件