对象存储配置
在 Kubeflow Pipelines (KFP) 中,有两个组件使用对象存储
- KFP API Server
- KFP Launcher (又称 KFP executor)
Kubeflow 平台默认提供的对象存储是 Minio。但是,您可以在您的 KFP 部署中配置不同的对象存储提供商。
下图提供了对象存储如何使用和配置的简化概述
前提条件
- 对 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_ACCESSKEY
和 OBJECTSTORECONFIG_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 配置此字段。
默认情况下,defaultPipelineRoot
是 minio://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
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
如果未提供某个字段,则使用默认配置。