对象存储配置

在 Kubeflow Pipelines (KFP) 中,有两个组件使用对象存储

  • KFP API Server
  • KFP Launcher (又称 KFP executor)

Kubeflow 平台默认提供的对象存储是 Minio。但是,您可以在您的 KFP 部署中配置不同的对象存储提供商。

下图提供了对象存储如何使用和配置的简化概述

KFP Object Store Configuration Overview

前提条件

  • 对 KFP Kubernetes 命名空间的管理员级别访问权限
  • 支持的提供商的对象存储凭据(见下文)

注意:在本文档中,“KFP Namespace” 指的是部署 KFP 的命名空间。如果 KFP 作为 Kubeflow 平台部署的一部分进行部署,则此命名空间为 kubeflow

KFP API Server

KFP API Server 使用对象存储来存储 Pipeline 中间表示 (IR)。

下面的列表描述了目前 API Server 支持的对象存储配置类型。这里的静态凭据指的是对象存储提供商提供的长期凭据。

有关静态凭据的更多信息,请参阅 此处 的 API Server 配置部分。对于 AWS 静态凭据 和其他 S3 兼容的对象存储,这包括嵌入到运行时环境或作为安全参数传递给某些 API 的 Access Key ID 和 Secret Access Key ID。在 Google Cloud Storage 中,这指的是包含 GCS APP Credentials 的 JSON。

API Server 支持的提供商

提供商支持
使用静态凭据的 Minio
使用静态凭据的 AWS S3
使用 IRSA 的 AWS S3
使用静态凭据的 S3 兼容存储
使用静态凭据的 Google Cloud Storage
使用 App 凭据的 Google Cloud Storage

API Server 对象存储配置

要配置 KFP API Server 使用的对象存储,配置方式取决于您是使用静态凭据,还是使用 AWS S3 和服务账户 IAM 角色 (IRSA)。

静态凭据

要使用静态凭据配置 AWS S3 存储桶,您需要在 KFP API Server 部署中添加以下环境变量

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ml-pipeline
  namespace: kubeflow
spec:
  ...
  template:
    ...
    spec:
      containers:
      - name: ml-pipeline-api-server
        serviceAccountName: "ml-pipeline"
        env:
          ...
          - name: OBJECTSTORECONFIG_HOST
            value: "your-bucket" # e.g. s3.amazonaws.com
          - name: OBJECTSTORECONFIG_PORT
            value: "port" # e.g. 443   
          - name: OBJECTSTORECONFIG_REGION
            value: "region" # e.g. us-east-1
            # true if object store is on a secure connection 
          - name: OBJECTSTORECONFIG_SECURE
            value: "true"        
            # These env vars reference the values from a Kubernetes secret
            # this requires deploying the secret ahead of time, and filling out the
            # following values accordingly.
          - name: OBJECTSTORECONFIG_ACCESSKEY
            valueFrom:
              secretKeyRef:
                key: "some-key-1"
                name: "secret-name"
          - name: OBJECTSTORECONFIG_SECRETACCESSKEY
            valueFrom:
              secretKeyRef:
                key: "some-key-2"
                name: "secret-name"

AWS IRSA (服务账户 IAM 角色)

要为 KFP API Server 使用 AWS IRSA,您需要从部署中省略任何静态凭据配置,即 OBJECTSTORECONFIG_ACCESSKEYOBJECTSTORECONFIG_SECRETACCESSKEY,因为这些凭据具有优先权。如果保留它们,API Server 将忽略所有 IRSA 配置。

接下来,请确保 KFP 命名空间中的 Kubernetes 服务账户 ml-pipeline 关联了相应的 IAM 角色。这高度依赖于您的平台提供商,例如对于 EKS,请参阅 IRSA 文档

KFP Launcher

KFP launcher 使用对象存储来存储 KFP 输入和输出 Artifact。

下面的列表描述了目前 API Server 支持的对象存储配置类型。

有关静态凭据的更多信息,请参阅 此处 的 API Server 配置部分。

KFP Launcher 支持的提供商

提供商支持
使用静态凭据的 Minio
使用静态凭据的 AWS S3
使用 IRSA 的 AWS S3
使用静态凭据的 S3 兼容存储
使用静态凭据的 Google Cloud Storage
使用 App 凭据的 Google Cloud Storage

KFP Launcher 对象存储配置

要配置 KFP Launcher 使用的对象存储,您需要编辑 kfp-launcher Kubernetes ConfigMap。

在默认的 KFP 部署中,这通常看起来像这样

apiVersion: v1
kind: ConfigMap
metadata:
  name: kfp-launcher
  namespace: user-namespace
data:
  defaultPipelineRoot: ""

注意如果未提供此 ConfigMap,您需要在将执行 Pipeline 的 Kubernetes 命名空间中部署它。这不一定与 Kubeflow Pipeline 本身部署的命名空间相同。

defaultPipelineRoot 是对象存储存储桶中的一个路径,用于存储给定 Pipeline 中的 Artifact 输入/输出。请注意,此字段也可以通过 KFP SDK 配置,请参阅 SDK PipelineRoot 文档。在创建 Run 时,也可以通过 KFP UI 配置此字段。

默认情况下,defaultPipelineRootminio://mlpipeline/v2/artifacts,Artifact 存储在默认的 Minio 部署中。路径 mlpipeline 中的第一个值是指存储桶名称。

如果您希望将 Artifact 存储在存储桶中不是 /v2/artifacts 的其他路径中,只需更改 defaultPipelineRoot 即可。例如,要在默认安装的 Minio 中的 /some/other/path 中存储 Artifact,请使用以下 KFP Launcher configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: kfp-launcher
  namespace: user-namespace
data:
  defaultPipelineRoot: "minio://mlpipeline/some/other/path"

注意:使用 KFP Launcher configmap 时,需要将其部署在创建 Pipeline 的相同命名空间中。在独立 KFP 部署中,这是 KFP 命名空间。在 Kubeflow 平台部署中,这将是用户 Kubeflow Profile 命名空间。

配置其他提供商

要完全使用不同的对象存储提供商,您需要在 KFP launcher configmap 中添加一个新的字段 providers。如何配置此字段取决于您的对象存储提供商。详见下文。

请注意,提供商由 PipelineRoot 值确定。如果 PipelineRoot=s3://mlpipeline,则匹配 s3 提供商。如果 PipelineRoot=g3://mlpipeline,则匹配 gs 提供商 (GCS) 等等。

S3 和 S3 兼容的提供商

要使用静态凭据配置 AWS S3 存储桶,请将您的 KFP Launcher configmap 更新为以下内容

apiVersion: v1
data:
  defaultPipelineRoot: s3://mlpipeline
  providers: |-
    s3:
      default:
        endpoint: s3.amazonaws.com
        disableSSL: false
        region: us-east-2
        credentials:
          fromEnv: false
          secretRef:
            secretName: your-k8s-secret
            accessKeyKey: some-key-1
            secretKeyKey: some-key-2    
kind: ConfigMap
metadata:
  name: kfp-launcher
  namespace: user-namespace

s3 提供商字段对任何 S3 兼容的存储都有效。default 表示如果在未提供匹配的 overrides 时将默认使用此配置(阅读有关 覆盖 的内容)。

S3 IRSA 和基于环境变量的凭据

如果您正在使用 AWS IRSA,或者您已将存储桶凭据嵌入到任务环境中(例如通过 SDK Secret Env),则可以将 fromEnv 设置为 true 并省略 secretRef。这看起来会像这样

apiVersion: v1
data:
  defaultPipelineRoot: s3://mlpipeline
  providers: |-
    s3:
      default:
        endpoint: s3.amazonaws.com
        disableSSL: false
        region: us-east-2
        credentials:
          fromEnv: true    
kind: ConfigMap
metadata:
  name: kfp-launcher
  namespace: user-namespace

请确保用于运行 Pipeline 的服务账户已配置 IRSA(参阅 IRSA 文档)。

您还可以直接在 Pipeline 中通过 AWS 环境变量配置静态凭据,例如

kubernetes.use_secret_as_env(
    your_task,
    secret_name='aws-s3-creds',
    secret_key_to_env={'AWS_SECRET_ACCESS_KEY': 'AWS_SECRET_ACCESS_KEY'})
kubernetes.use_secret_as_env(
    your_task,
    secret_name='aws-s3-creds',
    secret_key_to_env={'AWS_ACCESS_KEY_ID': 'AWS_ACCESS_KEY_ID'})
kubernetes.use_secret_as_env(
    your_task,
    secret_name='aws-s3-creds',
    secret_key_to_env={'AWS_REGION': 'AWS_REGION'})
...

Google Cloud Storage (GCS) 提供商

要使用静态凭据配置 GCS 提供商,您只需通过 Kubernetes Secret 提供对 App Credentials 文件的引用

apiVersion: v1
data:
  defaultPipelineRoot: gs://mlpipeline
  providers: |-
    gs:
      default:
        credentials:
          fromEnv: false
          secretRef:
            secretName: your-k8s-secret
            tokenKey: some-key-1    
kind: ConfigMap
metadata:
  name: kfp-launcher
  namespace: user-namespace

您还可以直接在 Pipeline 中通过 GCS 环境变量配置静态凭据,例如

# Specify the default APP Credential path
your_task.set_env_variable(name='GOOGLE_APPLICATION_CREDENTIALS', value='/gcloud/credentials.json')
# Mount the GCS Credentials JSON
kubernetes.use_secret_as_volume(your_task, secret_name='gcs-secret', mount_path='/gcloud')

基于 GCS 环境变量的凭据

如果您已将 GCS 凭据嵌入到您的 Pipeline Task 环境中(例如通过 SDK Secret Env),则可以将 fromEnv 设置为 true 并省略 secretRef

apiVersion: v1
data:
  defaultPipelineRoot: gs://mlpipeline
  providers: |-
    gs:
      default:
        credentials:
          fromEnv: true    
kind: ConfigMap
metadata:
  name: kfp-launcher
  namespace: user-namespace

KFP Launcher 覆盖

KFP Launcher 覆盖允许用户为给定 PipelineRoot 内的不同路径指定不同的提供商源。

以下示例展示了如何为 GCS 和 S3 兼容提供商进行此操作的完整示例

gs:
  default:
    credentials:
      fromEnv: false
      secretRef:
        secretName: gs-secret-1
        tokenKey: gs-tokenKey
  overrides:
    # Matches pipeline root: gs://your-bucket/some/subfolder
    - bucketName: your-bucket
      keyPrefix: some/subfolder
      credentials:
        fromEnv: false
        secretRef:
          secretName: gcs-secret-2
          tokenKey: gs-tokenKey-2
    # Matches pipeline root: gs://your-bucket/some/othersubfolder
    - bucketName: your-bucket
      keyPrefix: some/othersubfolder
      credentials:
        fromEnv: true
s3:
  default:
    endpoint: http://some-s3-compliant-store-endpoint.com
    disableSSL: true
    region: minio
    credentials:
      fromEnv: false
      secretRef:
        secretName: your-secret
        accessKeyKey: accesskey
        secretKeyKey: secretkey
  overrides:
    # Matches pipeline root: s3://your-bucket/subfolder
    # aws-s3-creds secret is used for static credentials
    - bucketName: your-bucket
      keyPrefix: subfolder
      endpoint: s3.amazonaws.com
      region: us-east-2
      disableSSL: false
      credentials:
        fromEnv: false
        secretRef:
          secretName: aws-s3-creds
          accessKeyKey: AWS_ACCESS_KEY_ID
          secretKeyKey: AWS_SECRET_ACCESS_KEY
    # Matches pipeline root: s3://your-bucket/some/s3/path/a/b
    - bucketName: your-bucket
      keyPrefix: some/s3/path/a/b
      endpoint: s3.amazonaws.com
      region: us-east-2
      credentials:
        fromEnv: true
    # Matches pipeline root: s3://your-bucket/some/s3/path/a/c
    - bucketName: your-bucket
      keyPrefix: some/s3/path/a/c
      endpoint: s3.amazonaws.com
      region: us-east-2
      credentials:
        fromEnv: false
        secretRef:
          secretName: aws-s3-creds
          accessKeyKey: AWS_ACCESS_KEY_ID
          secretKeyKey: AWS_SECRET_ACCESS_KEY
    # Matches pipeline root: s3://your-bucket/some/s3/path/b/a
    - bucketName: your-bucket
      keyPrefix: some/s3/path/b/a
      endpoint: https://s3.amazonaws.com
      region: us-east-2
      credentials:
        fromEnv: false
        secretRef:
          secretName: aws-s3-creds
          accessKeyKey: AWS_ACCESS_KEY_ID
          secretKeyKey: AWS_SECRET_ACCESS_KEY

keyPrefixPipelineRoot 中指定的路径匹配。例如,如果 PipelineRoots3://your-bucket/some/s3/path/b/a,则使用以下提供商配置

- bucketName: your-bucket
  keyPrefix: some/s3/path/b/a
  endpoint: https://s3.amazonaws.com
  region: us-east-2
  credentials:
    fromEnv: false
    secretRef:
      secretName: aws-s3-creds
      accessKeyKey: AWS_ACCESS_KEY_ID
      secretKeyKey: AWS_SECRET_ACCESS_KEY

如果未提供某个字段,则使用默认配置。

反馈

此页面有帮助吗?


最后修改于 2025年3月29日: website: 添加深色主题 (#3981) (4f092f1)