我认为 消息 指向您在容器中通过身份验证的用户,并且该用户没有访问 GCS 存储桶所需的权限。
“.svc.id.goog” 是您在 GKE 集群中启用 Workload Identity 时创建的 Workload Identity 命名空间。 Workload Identity 旨在将 Kubernetes 服务帐户 (KSA) 配置为 Google 服务帐户 (GSA)。为了在您的 pod 中使用 GSA 进行身份验证,您需要在指定的 K8s_namespace 和 KSA 中创建所有打算在 GCS 中执行操作的 pod您配置了工作负载身份,这将自动创建从您的 KSA 到您的容器内的 GSA 的绑定。
请确保 GSA 具有访问存储桶的正确权限,例如 Storage Admin,其中包括所有存储权限,此处为 predefined permissions 和 different bucket permissions .
正如link 提到的,您需要创建 GSA、KSA 和 k8s-namespace,这 3 个资源将创建在外部绑定身份验证为 GSA,但在内部(在您的集群内)绑定为 KSA。
如果您不记得在 Workload Identity 中配置的 k8s 命名空间、KSA 和 GSA,请尝试下一步:
- 进入您的 GKE 集群并查找不同的命名空间:
默认
kube-node-lease
kube-public
kube 系统
使用命令kubectl get ns 获取命名空间,这里是输出示例:
gilbertoa@cloudshell:~ (Project_ID)$ kubectl get ns
NAME STATUS AGE
default Active 25d
kube-node-lease Active 25d
kube-public Active 25d
kube-system Active 25d
wlins Active 25d
在这种情况下,我确实记得我在 Workload Identity 中配置的 k8s_namespace 是 wlins
- 检查已识别命名空间中的服务帐户:
使用命令kubectl get sa -n IDENTIFIED_NAMESPACE,这里是输出示例:
gilbertoa@cloudshell:~ (Project_ID)$ kubectl get sa -n wlins
NAME SECRETS AGE
default 1 25d
wlisa 1 25d
在这种情况下,我记得我在 Workload Identity 中配置的 KSA 是 wlisa
- 检查在 Workload Identity 配置期间所做的 KSA 注释:
使用命令kubectl describe sa YOUR_KSA -n IDENTIFIED_NAMESPACE,这里是输出示例:
gilbertoa@cloudshell:~ (Project_ID)$ kubectl describe sa wlisa -n wlins
Name: wlisa
Namespace: wlins
Labels: <none>
Annotations: iam.gke.io/gcp-service-account: wli-sa@Project_ID.iam.gserviceaccount.com
Image pull secrets: <none>
Mountable secrets: wlisa-token-8jpq2
Tokens: wlisa-token-8jpq2
Events: <none>
在这种情况下,我记得我在 Workload Identity 中配置的 GSA 是 wli-sa@project_ID.iam.gserviceaccount.com
- 验证...
通过运行下一个命令,即您共享的doc 的第 9 步,并替换 ksa-name 和 k8s-namespace
kubectl run -it \
--image google/cloud-sdk:slim \
--serviceaccount ksa-name \
--namespace k8s-namespace \
workload-identity-test
这是我做的测试:
gilbertoa@cloudshell:~ (Project_ID)$ **kubectl run -it \
> --image google/cloud-sdk:slim \
> --serviceaccount wlisa \
> --namespace wlins \
> workload-identity-test**
If you don't see a command prompt, try pressing enter.
这是我使用上述命令自动获得的容器界面,您可以在其中看到活动帐户是我在 Workload Identity 中配置的 GSA:
root@workload-identity-test:/#
root@workload-identity-test:/# gcloud auth list
Credentialed Accounts
ACTIVE ACCOUNT
* wli-sa@Project_ID.iam.gserviceaccount.com
To set the active account, run:
$ gcloud config set account `ACCOUNT`
root@workload-identity-test:/#
最后。如果您使用不同的 KSA 和 k8s_namespace 来创建您的 Pod/容器,那么您将不会被认证为 GSA
这是我使用的命令,我没有使用任何 KSA 而是使用不同的 k8s_namespace(默认命名空间)。当我检查活动帐户时,它会显示 Workload Identity Project_ID.svc.id.goog 命名空间,它没有任何 IAM 权限,如果我尝试更新存储桶,我将收到一条权限被拒绝消息.
gilbertoa@cloudshell:~ (Project_ID)$ kubectl run -it \
> --image google/cloud-sdk:slim \
> --namespace default \
> workload-identity-test-bad
root@workload-identity-test-bad:/# gcloud auth list
Credentialed Accounts
ACTIVE ACCOUNT
* Project_ID.svc.id.goog
To set the active account, run:
$ gcloud config set account `ACCOUNT`
root@workload-identity-test-bad:/#
我知道这是一个很长的回复,但我希望这可以帮助您以某种方式解决您的问题。