[英]GKE pod not able to access private GCS Bucket (401 unauthorized error)
[英]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 实施此解决方案的答案的人。 请参考以下:
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
}
}
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:
注意:
resource "kubernetes_manifest"
方法创建的,因为它通过resource "kubernetes_service_account"
方法创建存在一个未解决的问题,它会抛出错误声明。 Waiting for default secret of "NAMESPACE/KSA_NAME" to appear
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.