将 Kubernetes 资源作为流水线的一部分进行操作
旧版本
此页面介绍的是 Kubeflow Pipelines V1,请参阅V2 文档获取最新信息。
注意,虽然 V2 后端能够运行 V1 SDK 提交的流水线,但我们强烈建议迁移到 V2 SDK。作为参考,V1 SDK 的最终发布版本是 kfp==1.8.22
,其参考文档在此处可用。
此页面描述了如何在流水线过程中通过 Kubeflow Pipelines 的单个组件操作 Kubernetes 资源。用户可以处理任何 Kubernetes 资源,同时创建Persistent Volume Claims和Volume Snapshots在常见情况下变得容易。
Kubernetes 资源
ResourceOp
此类代表流水线中操作 Kubernetes 资源的一个步骤。它实现了Argo 的 resource template。
此功能允许用户对 Kubernetes 资源执行某些操作(get
、create
、apply
、delete
、replace
、patch
)。用户可以设置条件来指示执行该操作的步骤是否成功或失败。
链接到相应的 Python 库。
参数
本节仅介绍最主要的参数。有关更多信息,请参阅上述库的链接。
k8s_resource
: Kubernetes 资源的定义。(必需)action
: 要执行的操作(默认为create
)。merge_strategy
: 操作为patch
时的合并策略。(可选)success_condition
: 当为 true 时表示步骤成功的条件。(可选)failure_condition
: 当为 true 时表示步骤失败的条件。(可选)attribute_outputs
: 类似于kfp.dsl.ContainerOp
的file_outputs
。将输出参数名称映射到 Kubernetes 对象中的 JSON 路径。更多详情请参见下一节。(可选)
输出
ResourceOps 可以生成输出参数。它们可以输出正在操作的资源的字段值。例如
job = kubernetes_client.V1Job(...)
rop = kfp.dsl.ResourceOp(
name="create-job",
k8s_resource=job,
action="create",
attribute_outputs={"name": "{.metadata.name}"}
)
默认情况下,ResourceOps 输出资源的名称以及整个资源规范。
示例
为了更好地理解,请参阅以下示例:1
持久卷声明 (PVCs)
简单快速地请求创建 PVC 实例。
VolumeOp
专门用于创建 PVC 的 ResourceOp。
链接到相应的 Python 库。
参数
以下参数是 ResourceOp
参数的扩展。如果传递了 k8s_resource
,则不应提供以下任何参数。
resource_name
: 将要创建的资源的名称。此字符串将以工作流名称作为前缀。这可能包含PipelineParam
s。(必需)size
: 请求的 PVC 大小。这可能包含PipelineParam
s。(必需)storage_class
: 要使用的存储类。这可能包含PipelineParam
s。(可选)modes
: PVC 的accessModes
(默认为RWM
)。有关更多信息,请查阅此文档。用户可能会找到以下内置模式VOLUME_MODE_RWO
:["ReadWriteOnce"]
VOLUME_MODE_RWM
:["ReadWriteMany"]
VOLUME_MODE_ROM
:["ReadOnlyMany"]
annotations
: 要在 PVC 中修补的注解(Annotations)。这些可能包含PipelineParam
s。(可选)data_source
: 用于从VolumeSnapshot
创建 PVC。它可以是string
或V1TypedLocalObjectReference
,并且可能包含PipelineParam
s。(Alpha 功能,可选)
输出
除了资源及其名称的完整规范(ResourceOp
默认值)外,VolumeOp
还输出绑定持久卷的存储大小(作为 step.outputs["size"]
)。但是,如果存储 Provisioner 具有 WaitForFirstConsumer
绑定模式,则此值可能为空。此值(如果不为空)始终大于或等于请求的大小。
有用信息
VolumeOp
步骤具有.volume
属性,该属性是引用所创建 PVC 的PipelineVolume
。更多关于 Pipeline Volumes 的信息请参见下一节。ContainerOp
在其构造函数中有一个pvolumes
参数。这是一个字典,以挂载路径作为键,以卷作为值,功能类似于file_outputs
(后者可用于op.outputs["key"]
或op.output
)。例如
vop = dsl.VolumeOp(
name="volume_creation",
resource_name="mypvc",
size="1Gi"
)
step1 = dsl.ContainerOp(
name="step1",
...
pvolumes={"/mnt": vop.volume} # Implies execution after vop
)
step2 = dsl.ContainerOp(
name="step2",
...
pvolumes={"/data": step1.pvolume, # Implies execution after step1
"/mnt": dsl.PipelineVolume(pvc="existing-pvc")}
)
step3 = dsl.ContainerOp(
name="step3",
...
pvolumes={"/common": step2.pvolumes["/mnt"]} # Implies execution after step2
)
PipelineVolume
轻松引用 Kubernetes 卷,挂载它们并通过它们表达依赖关系。
PipelineVolume
本质上是一个携带依赖关系的 Kubernetes Volume
(*),并补充了扩展其依赖关系的 .after()
方法。这些依赖关系在 pvolumes
参数或 add_pvolumes()
方法中被 ContainerOp
消费时,可以被正确解析,以扩展该步骤的依赖关系。
链接到相应的 Python 库。
(*) 继承自 Kubernetes Python 客户端的 V1Volume 类。
参数
PipelineVolume
的构造函数接受所有 V1Volume
构造函数接受的参数。但是,name
可以省略,取而代之的是为该卷生成一个伪随机名称。
额外参数
pvc
: 此PipelineVolume
要引用的现有 PVC 的名称。此值可以是PipelineParam
。volume
: 从现有的V1Volume
或其继承类型(例如PipelineVolume
)初始化一个新的PipelineVolume
实例。
示例
卷快照
简单快速地请求创建 Volume Snapshot 实例。
VolumeSnapshotOp
专门用于 Volume Snapshot 创建的 ResourceOp。
链接到相应的 Python 库。
注意:您应检查您的 Kubernetes 集群管理员是否已在您的集群中启用 Volume Snapshots。
参数
以下参数是 ResourceOp
参数的扩展。如果传递了 k8s_resource
,则不能提供以下任何参数。
resource_name
: 将要创建的资源的名称。此字符串将以工作流名称作为前缀。这可能包含PipelineParam
s。(必需)pvc
: 要创建快照的 PVC 的名称。这可能包含PipelineParam
s。(可选)snapshot_class
: 要使用的快照存储类。这可能包含PipelineParam
s。(可选)volume
:V1Volume
的实例或其继承类型(例如PipelineVolume
)。这可能包含PipelineParam
s。(可选)annotations
: 要在VolumeSnapshot
中修补的注解(Annotations)。这些可能包含PipelineParam
s。(可选)
注意:必须提供 pvc
或 volume
之一。
输出
除了资源及其名称的完整规范(ResourceOp
默认值)外,VolumeSnapshotOp
还输出绑定 VolumeSnapshot
的 restoreSize
(作为 step.outputs["size"]
)。这是该快照的 PVC 克隆的最小大小。
有用信息
VolumeSnapshotOp
步骤具有 .snapshot
属性,它是一个 V1TypedLocalObjectReference
。这可以作为 data_source
传递,以从该 VolumeSnapshot
创建一个 PVC。用户也可以使用 step.outputs["name"]
作为 data_source
。
示例
后续步骤
- 请参阅 Kubeflow Pipelines 仓库中的示例。例如,查看这些 ResourceOps、VolumeOps 和 VolumeSnapshotOps 的示例。
- 详细了解 Kubeflow Pipelines 领域特定语言 (DSL),这是一套可用于指定 ML 流水线的 Python 库。
- 为了快速迭代,请构建组件和流水线。