在使用Terraform启动GKE集群时如何引导RBAC特权

mt1*_*165 6 google-compute-engine kubernetes google-kubernetes-engine terraform

我将Terraform与GKE集群结合使用,效果很好。然后,我希望Terraform在群集上执行一些Kubernetes级别的操作(使用k8s提供程序)-规模不大,只需安装几个Deployments等。

我遇到的问题是权限。我希望使用一种整洁,整洁,声明式的方法来创建集群,并拥有一组凭据,以便我可以使用短期凭据对其进行“管理”操作,包括引导其他用户。我知道如何使运行TF的google用户成为群集的管理员(这个问题经常出现),但这似乎不是很好。尤其重要的是,k8s TF提供程序不支持clusterolebinding(Issue部分PR),因此您必须先使用配置程序“淘汰” ,然后再local-exec运行。gcloud container clusters get-credentialskubectl create clusterrolebinding ...

同样,我不想设置主密码,因为我不想在HTTP基本身份验证上运行。最好的选项似乎是TF GKE资源返回的密钥/证书对,但是其CN为“ client”,并且该用户没有权限。因此,再次使用它的唯一方法是将其封装到kubectl中,将其传递给gcloud服务帐户凭据,并为其添加一个用于“客户端”的clusterrolebinding,这时我也可以像服务帐户一样做所有事情像上面一样。

相比之下,在EKS上,创建集群的(AWS IAM)用户具有开箱即用的cluster-admin(我假设AWS authn提供程序声称该用户位于“ system:masters”中)。

我在这里的实际问题是:Terraform中是否有一种整洁的,完全声明性的方式来建立集群并提供(最好作为输出使用)一组有效的凭据,然后使用它们删除?(是的,我知道他们会留在tfstate中)

我的选择似乎是:

  • “掏空”以提供TF的Google ID(理想情况下是服务帐户)cluster-admin(这是特权升级,但由于gcloud authz插件而有效)
  • 启用HTTP基本身份验证并为管理员帐户提供密码,然后让别名为k8s的供应商使用该服务以最小程度地引导另一个服务帐户。
  • 启用ABAC,以使“客户端”(输出密钥/证书的CN)具有无限的力量-这是我目前正在使用的功能,请不要判断我!

而且我不喜欢任何一个!

小智 5

我遇到了类似的问题,自从最近的 Kubernetes 问题意外禁用了默认情况下的基本身份验证以来,该问题变得特别令人讨厌,一旦我尝试从相同的配置构建新集群,这就会破坏我以前运行的 Terraform 配置。

最后在这个 SO answer 中找到了一个答案,它推荐了一种使用 Terraform 的 Google IAM 凭证连接到集群而无需“shell out”的方法。请注意,此方法允许在 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
}
Run Code Online (Sandbox Code Playgroud)