繁体   English   中英

无需凭据/身份验证即可从 GKE Pod 进行 GCS 读写访问

[英]GCS read write access from the GKE Pod without credentials/auth

我们使用公共端点创建了 GKE 集群。 GKE集群节点池服务帐号具有以下角色。

"roles/compute.admin",
"roles/compute.viewer",
"roles/compute.securityAdmin",
"roles/iam.serviceAccountUser",
"roles/iam.serviceAccountAdmin",
"roles/resourcemanager.projectIamAdmin",
"roles/container.admin",
"roles/artifactregistry.admin",
"roles/storage.admin"

GKE集群的节点池有以下OAuth范围

"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/devstorage.read_write",

私有GCS 存储桶与主体具有相同的服务帐户,具有存储管理员角色。

当我们尝试从 GKE POD 读取/写入此存储桶时,我们收到以下错误。

# Read
AccessDeniedException: 403 Caller does not have storage.objects.list access to the Google Cloud Storage bucket

# Write
AccessDeniedException: 403 Caller does not have storage.objects.create access to the Google Cloud Storage object

我们还检查了这个线程,但该解决方案是面向凭证的,无法帮助我们。 我们希望在不维护 SA 身份验证密钥或任何类型的凭据的情况下进行读/写

请指导这里缺少的内容。


更新:根据@boredabdel 的建议,我们检查并发现 GKE 集群和 NodePool 上已经启用了workload identity 我们正在使用这个模块来创建我们的集群,默认情况下它已经启用。 尽管如此,我们仍面临着连接问题。

集群安全:

在此处输入图像描述

节点池安全性:

在此处输入图像描述

这适用于所有正在寻找通过 terraform 实施此解决方案的答案的人。 请参考以下:

创建带有注释的 Kubernetes 服务帐户
resource "kubernetes_manifest" "service_account" {
  manifest = {
    "apiVersion" = "v1"
    "kind"       = "ServiceAccount"
    "metadata" = {
      "name"      = "KSA_NAME"
      "namespace" = "NAME"
      "annotations" = {
        "iam.gke.io/gcp-service-account" = "GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com"
      }
    }
    "automountServiceAccountToken" = true
  }
}
创建 IAM 策略绑定以允许 Kubernetes 服务账户充当 IAM 服务账户。
resource "google_service_account_iam_binding" "service-account-iam" {
  service_account_id = "projects/PROJECT_ID/serviceAccounts/GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com"
  role               = "roles/iam.workloadIdentityUser"
  members            = [
    "serviceAccount:${var.project_id}.svc.id.goog[NAMESPACE/KSA-NAME]",
  ]
}
像这样将服务帐户添加到部署/状态集清单
spec:
  serviceAccount: KSA-NAME
  containers:

注意

  1. 如果您对所有对象使用相同的项目,则 GSA_PROJECT 和 PROJECT_ID 是相同的。
  2. K8s 服务帐户是通过resource "kubernetes_manifest"方法创建的,因为它通过resource "kubernetes_service_account"方法创建存在一个未解决的问题,它会抛出错误声明。 Waiting for default secret of "NAMESPACE/KSA_NAME" to appear

似乎您正在尝试使用节点服务帐户向 GCS 进行身份验证。 您需要将服务帐户密钥传递给您正在调用 API 的应用程序,如本文档中所述

如果您想要无密钥身份验证,我的建议是使用工作负载身份

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM