【问题标题】:Katib experiment not able to access GCS bucket due to insufficient permissionsKatib 实验由于权限不足无法访问 GCS 存储桶
【发布时间】:2020-11-15 03:45:07
【问题描述】:

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

我创建了一个服务帐户并授予了对 GCS 存储桶的访问权限。

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

流程是这样的: Cloud build 触发一个 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. 如何解决上述问题?

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

【问题讨论】:

    标签: google-kubernetes-engine kubeflow


    【解决方案1】:

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

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

    请确保 GSA 具有访问存储桶的正确权限,例如 Storage Admin,其中包括所有存储权限,此处为 predefined permissionsdifferent bucket permissions .

    正如link 提到的,您需要创建 GSAKSAk8s-namespace,这 3 个资源将创建在外部绑定身份验证为 GSA,但在内部(在您的集群内)绑定为 KSA

    如果您不记得在 Workload Identity 中配置的 k8s 命名空间、KSA 和 GSA,请尝试下一步:

    1. 进入您的 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

    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. 验证...

    通过运行下一个命令,即您共享的doc 的第 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:/#
    

    最后。如果您使用不同的 KSAk8s_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:/#
    

    我知道这是一个很长的回复,但我希望这可以帮助您以某种方式解决您的问题。

    【讨论】:

      【解决方案2】:

      您可能只需要在 Katib Experiment 内的 Job 模板中的 Pod 规范中添加以下内容

      ...
      spec:
        serviceAccountName: default-editor
        ...
      

      背景:“default-editor”服务帐户由 Kubeflow 在每个用户命名空间中显式创建,以允许通过 Workload Identity 访问 GCP API,例如 Google Cloud Storage,但它不是所有 pod 的默认服务帐户。 Ariel Palacios 的详细回答帮助我弄清楚了这一点。

      【讨论】:

        猜你喜欢
        • 2022-08-12
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2022-12-09
        • 1970-01-01
        相关资源
        最近更新 更多