Katib实验由于权限不足而无法访问GCS存储桶

时间:2020-07-25 11:24:55

标签: google-kubernetes-engine kubeflow

我正在尝试在Kubeflow集群上从Google Cloud Build运行kubeflow管道,作为持续部署的一部分。

我已经创建了一个服务帐户,并可以访问GCS存储桶。

在Kubeflow管道中,我将服务帐户的user-gcp-sa应用于所有管道步骤。管道的第一步是在kubeflow名称空间中启动katib实验。但是,由于以下原因,实验失败。

流程是这样的: 云构建会触发一个python文件,该文件会创建一个KFP客户端,然后使用该客户端上传管道并运行实验。

第一个流水线步骤将启动katib实验,并等待其完成。实验已成功启动,并创建了Pod用于运行试验,但是随后Pod因以下原因而失败,并且实验总体失败。

消息:“具有其他声明的主要:/ namespaces / .svc.id.goog没有storage.objects.get访问Google Cloud Storage对象。”

如果我授予allUsers访问GCS存储桶的权限,则该实验会正常进行。

我还点击了以下链接进行故障排除- https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity

对此我有几个问题-

  1. 从katib实验内部使用哪个服务帐户访问GCS存储桶?
  2. 如何解决上述问题?

任何故障排除步骤都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我认为消息指向的是您在容器内通过身份验证的用户,并且该用户没有访问GCS存储桶所需的权限。

.svc.id.goog” 是在GKE群集中启用Workload Identity时创建的Workload Identity命名空间。 工作负载身份旨在将Kubernetes服务帐户( KSA )配置为充当Google服务帐户( GSA )。为了通过GSA在您的Pod中进行身份验证,您需要创建所有打算在指定的 K8s_namespace KSA 中在GCS中执行操作的Pod。您配置了工作负载身份后,这将自动在容器内创建从您的 KSA 到您的 GSA 的绑定。

请确保 GSA 具有访问存储桶的正确权限,例如 Storage Admin ,其中包括所有存储权限,此处为predefined permissions和{ {3}}。

正如此different bucket permissions所提到的,您将需要创建 GSA KSA k8s-命名空间,这3个资源将在外部以 GSA 创建auth绑定,在内部(在群集内)以 KSA 创建auth绑定。

如果您不记得在Workload Identity中配置的k8s命名空间,KSA和GSA,请尝试继续执行以下操作:

  1. 进入您的GKE集群,并找到不同于以下内容的命名空间:

默认
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

  1. 在已标识的命名空间中检查服务帐户:

使用命令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

  1. 检查在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

  1. 验证...

通过运行您共享的link的第9步中的下一个命令,并替换ksa-namek8s-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)的详细回答帮助我弄清了这一点。

相关问题