作为连续部署的一部分,我试图在kubeflow集群上运行Google构建的Kubeflow管道。
我已经创建了一个服务帐户,并允许访问GCS桶。
在Kubeflow管道中,我将服务帐户的用户-gcp应用于所有管道步骤。管道的第一步是在kubeflow命名空间中启动katib实验。然而,实验失败的理由如下。
流程如下:云构建触发一个python文件,该文件创建一个KFP客户端,然后使用客户机上传管道并运行一个实验。
第一个管道步骤启动一个katib实验,并等待它完成。实验成功启动,并创建了运行试验的吊舱,但由于以下原因而失败,实验总体上失败。
消息:“主目录:/命名空间/.svc.id.goog具有附加声明,没有storage.objects.get访问Google”。
如果我允许allUsers访问GCS桶,那么这个实验就能正常工作。
我还按照下面的链接进行故障排除- https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
我对此几乎没有什么疑问-
任何故障排除步骤都会有帮助。
发布于 2020-07-28 21:24:22
我认为消息指向的是您在容器中通过身份验证的用户,并且该用户没有访问GCS桶所需的权限。
".svc.id.goog"是在GKE集群中启用工作负载标识时创建的工作负载标识命名空间。工作负载标识的目的是将Kubernetes服务帐户(KSA)配置为充当谷歌服务帐户(GSA)。为了在您的豆荚中使用GSA进行身份验证,您需要创建所有用于在指定的K8s_namespace中在GCS中执行操作的荚,以及使用您配置的带有工作负载标识的KSA,这将自动创建从您的KSA到您的容器中的GSA的绑定。
请确保GSA具有访问存储桶的正确权限,例如存储管理,其中包含所有存储权限,这里是预定义权限和不同的桶权限。
正如这个链接所提到的,您需要创建一个GSA、KSA和,这3个资源将为auth外部创建绑定,作为GSA,但在内部(在集群中)作为KSA创建绑定。
如果您不记得在工作负载标识中配置的k8s-命名空间、KSA和GSA,那么请尝试遵循:。
默认设置
库贝-节点租赁
库贝-公众
库贝系统
使用命令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在本例中,我确实记得在工作负载标识中配置的wlins是 k8s_namespace。
使用命令kubectl get sa -n IDENTIFIED_NAMESPACE,这里是输出的示例:
gilbertoa@cloudshell:~ (Project_ID)$ kubectl get sa -n wlins
NAME SECRETS AGE
default 1 25d
wlisa 1 25d在本例中,我确实记得在工作负载标识中配置的KSA是wlisa 。
使用命令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>在本例中,我确实记得在工作负载标识中配置的GSA是wli-sa@project_ID.iam.gserviceaccount.com 。
通过运行next命令(它位于您共享的文档的步骤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.下面是使用上述命令自动获得的容器接口,您可以看到活动帐户是在工作负载标识中配置的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来创建您的荚/容器,那么您将不会被认证为GSA。
下面是我使用的命令,其中不使用任何k8s_namespace KSA并使用不同的(默认名称空间)。当我检查活动帐户时,它会显示工作负载标识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:/#我知道这是一个很长的回应,但我希望这能帮助你解决你的问题。
发布于 2020-09-10 15:08:32
您可能只需要在Katib实验中的作业模板中向Pod规范添加以下内容
...
spec:
serviceAccountName: default-editor
...背景:“默认编辑器”服务帐户由Kubeflow在每个用户名称空间中显式创建,以允许通过工作负载标识访问GCP API(如Google ),但它不是所有豆荚的默认服务帐户。阿里尔·帕拉西奥斯的详细回答帮助我解决了这个问题。
https://stackoverflow.com/questions/63087745
复制相似问题