我正在尝试在Kubeflow集群上从Google Cloud Build运行kubeflow管道,作为持续部署的一部分。
我已经创建了一个服务帐户,并可以访问GCS存储桶。
在Kubeflow管道中,我将服务帐户的user-gcp-sa应用于所有管道步骤。管道的第一步是在kubeflow名称空间中启动katib实验。但是,由于以下原因,实验失败。
流程是这样的: 云构建会触发一个python文件,该文件会创建一个KFP客户端,然后使用该客户端上传管道并运行实验。
第一个流水线步骤将启动katib实验,并等待其完成。实验已成功启动,并创建了Pod用于运行试验,但是随后Pod因以下原因而失败,并且实验总体失败。
消息:“具有其他声明的主要:/ namespaces /
如果我授予allUsers访问GCS存储桶的权限,则该实验会正常进行。
我还点击了以下链接进行故障排除- https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
对此我有几个问题-
任何故障排除步骤都会有所帮助。
答案 0 :(得分:1)
我认为消息指向的是您在容器内通过身份验证的用户,并且该用户没有访问GCS存储桶所需的权限。
“
请确保 GSA 具有访问存储桶的正确权限,例如 Storage Admin ,其中包括所有存储权限,此处为predefined permissions和{ {3}}。
正如此different bucket permissions所提到的,您将需要创建 GSA , KSA 和 k8s-命名空间,这3个资源将在外部以 GSA 创建auth绑定,在内部(在群集内)以 KSA 创建auth绑定。
如果您不记得在Workload Identity中配置的k8s命名空间,KSA和GSA,请尝试继续执行以下操作:
默认
kube-node-lease
kube-public
库伯系统
使用命令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
使用命令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
通过运行您共享的link的第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 创建吊舱/容器,那么您将不会通过GSA认证
这是我使用的命令,其中我没有使用任何 KSA ,而是使用其他 k8s_namespace (默认名称空间)。当我检查活动帐户时,它显示工作负载身份 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:/#
我知道这是一个漫长的响应,但是我希望这可以以某种方式帮助您解决问题。
答案 1 :(得分:0)
您可能只需要在Katib实验中的Job模板中的Pod规范中添加以下内容
...
spec:
serviceAccountName: default-editor
...
背景:“默认编辑器”服务帐户由Kubeflow在每个用户命名空间中明确创建,以允许通过Workload Identity访问GCP API(例如Google Cloud Storage),但这不是所有Pod的默认服务帐户。阿里尔·帕拉西奥斯(Ariel Palacios)的详细回答帮助我弄清了这一点。