对象存储配置
在Kubeflow Pipelines (KFP)中,有两个组件使用对象存储:
- KFP API 服务器
- KFP启动器(也称为KFP执行器)
作为Kubeflow平台一部分提供的默认对象存储是Minio。然而,您可以在KFP部署中配置不同的对象存储提供者。
下图提供了对象存储如何被使用和配置的简化概述:

前提条件
- 对KFP Kubernetes命名空间的管理员级别访问
- 支持的提供商的对象存储凭据(见下文)
注意: 在本文档中,“KFP 命名空间”是指 KFP 部署所在的命名空间。如果 KFP 是作为 Kubeflow 平台部署的一部分进行部署,则这是
kubeflow命名空间。
KFP API 服务器
KFP API服务器使用对象存储来存储管道中间表示(IR)。
下面的列表描述了当前为 API Server 支持的对象存储配置类型。这里的静态凭证是指对象存储提供者提供的长期凭证。
对于 AWS 静态凭证 和其他符合 S3 的对象存储,这包括一个嵌入到运行时环境中的访问密钥 ID 和秘密访问密钥 ID,或作为安全参数传递给某些 API。在 Google Cloud Storage 中,这指的是包含 GCS 应用凭证 的 JSON。
API 服务器支持的提供者
| 供应商 | 支持的 |
|---|---|
| 使用静态凭据的Minio | 是 |
| AWS S3与静态凭证 | 是 |
| AWS S3与IRSA | 是 |
| 具有静态凭证的S3兼容存储 | 是 |
| 使用静态凭据的 Google Cloud Storage | 否 |
| 使用应用凭据的 Google Cloud Storage | 否 |
API 服务器对象存储配置
要配置KFP API服务器使用的对象存储,该配置取决于您是使用静态凭证,还是使用具有服务账户的IAM角色的AWS S3(IRSA)。
静态凭证
要使用静态凭证配置AWS S3存储桶,您需要将以下环境变量添加到您的KFP API服务器部署中:
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 角色)
要利用 AWS IRSA 为 KFP API 服务器服务,您需要在部署中省略任何静态凭证配置,即 OBJECTSTORECONFIG_ACCESSKEY 和 OBJECTSTORECONFIG_SECRETACCESSKEY,因为这些配置具有优先权。 如果留下这些配置,API 服务器将忽略任何 IRSA 配置。
接下来,确保与KFP命名空间中的Kubernetes服务账户 ml-pipeline 相关的适当IAM角色。这在很大程度上取决于您的平台提供商,例如对于EKS,请参见 IRSA docs。
KFP 启动器
KFP 启动器使用对象存储来存储 KFP 输入和输出工件。
下面的列表描述了今天为API服务器支持的对象存储配置类型。
有关静态凭证的更多信息,请参阅API服务器配置部分这里。
KFP 启动器支持的提供者
| 供应商 | 支持的 |
|---|---|
| 使用静态凭证的Minio | 是 |
| AWS S3与静态凭证 | 是 |
| AWS S3与IRSA | 是 |
| 符合S3标准的存储与静态凭证 | 是 |
| 使用静态凭据的 Google Cloud Storage | 是 |
| 使用应用凭据的Google Cloud Storage | 是 |
KFP 启动器对象存储配置
要配置 KFP 启动器使用的对象存储,您需要编辑 kfp-launcher Kubernetes ConfigMap。
在默认的KFP部署中,这通常看起来像:
apiVersion: v1
kind: ConfigMap
metadata:
name: kfp-launcher
namespace: user-namespace
data:
defaultPipelineRoot: ""
注意: 如果未提供此配置映射,您需要在执行管道的Kubernetes命名空间中部署此内容。这不一定与Kubeflow Pipeline自身部署的命名空间相同。
defaultPipelineRoot 是对象存储桶内的路径,用于存储给定管道中的工件输入/输出。请注意,此字段也可以通过 KFP SDK 配置,参见 SDK PipelineRoot Docs。在创建运行时,它也可以通过 KFP UI 进行配置。
默认情况下 defaultPipelineRoot 是 minio://mlpipeline/v2/artifacts,工件存储在默认的 Minio 部署中。路径 mlpipeline 中的第一个值指的是桶名称。
如果您想将工件存储在桶中的不同路径,而不是 /v2/artifacts,您可以简单地更改 defaultPipelineRoot。例如,要将工件存储在默认 Minio 安装中的 /some/other/path,请使用以下 KFP Launcher 配置映射:
apiVersion: v1
kind: ConfigMap
metadata:
name: kfp-launcher
namespace: user-namespace
data:
defaultPipelineRoot: "minio://mlpipeline/some/other/path"
注意: 使用KFP Launcher configmap 时,它需要部署在将创建管道的相同命名空间。在单独的 KFP 部署中,这是 KFP 命名空间。在 Kubeflow 平台部署中,这将是用户的 Kubeflow 配置文件命名空间。
配置其他提供者
要完全使用不同的对象存储提供者,您需要在KFP启动器配置映射中添加一个新字段 providers。如何配置该字段取决于您的对象存储提供者。请参见下面的详细信息。
注意,提供者是由PipelineRoot值决定的。如果 PipelineRoot=s3://mlpipeline ,则匹配 s3 提供者。如果 PipelineRoot=g3://mlpipeline ,则匹配 gs 提供者(GCS),等等。
S3和兼容S3的提供者
要使用静态凭证配置AWS S3存储桶,请将您的KFP Launcher配置映射更新为以下内容:
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,则使用此配置作为默认值(阅读关于 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
确保用于运行您的管道的服务帐户已配置为 IRSA(查看 IRSA docs)。
您还可以在您的管道中通过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'})
...
谷歌云存储 (GCS) 提供者
要使用静态凭证配置GCS提供者,您只需通过Kubernetes Secret提供对应用凭证文件的引用:
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
您还可以通过在管道中直接使用 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 凭证(例如通过 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 启动器覆盖
KFP Launcher 覆盖允许用户为给定的 PipelineRoot 中的不同路径指定不同的 Provider 源。
以下示例展示了如何为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
keyPrefix与PipelineRoot中规定的路径相匹配。例如,如果PipelineRoot是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
如果未提供字段,则使用默认配置。