选择 Argo Workflows 执行器

如何选择 Argo Workflows 执行器

Argo 工作流执行器是符合特定接口的进程,该接口允许 Argo 执行某些操作,例如监控 pod 日志、收集 artifact、管理容器生命周期等。

Kubeflow Pipelines 运行在 Argo Workflows 工作流引擎上,因此 Kubeflow Pipelines 用户需要选择一个工作流执行器。

选择工作流执行器

  1. Emissary 执行器 自 KFP 1.8 正式发布(2022 年 2 月)以来一直是 Kubeflow Pipelines 的默认执行器。我们推荐使用 Emissary 执行器,除非您遇到已知的 Emissary 兼容性问题,在这种情况下,请在Emissary 执行器反馈 Github issue 中提交您的反馈。

  2. Docker 执行器 可作为旧版选择使用。如果您确实遇到了 Emissary 执行器的兼容性问题,并且您的集群运行在较旧的 Kubernetes 版本(<1.20)上,您可以配置使用 Docker 执行器。

请注意,Argo Workflows 支持其他工作流执行器,但 Kubeflow Pipelines 团队仅推荐在 Emissary 执行器和 Docker 执行器之间进行选择。

Emissary 执行器

Emissary 执行器是 Kubeflow Pipelines v1.8+ 的默认工作流执行器。它于 Argo Workflows v3.1(2021 年 6 月)首次发布。Kubeflow Pipelines 团队认为其架构和可移植性改进使其成为大多数人将来应该使用的默认执行器。

迁移到 Emissary 执行器

先决条件:emissary 执行器仅在 Kubeflow Pipelines 后端版本 1.7+ 中可用。要升级,请参阅升级 Kubeflow Pipelines

配置现有 Kubeflow Pipelines 集群以使用 emissary 执行器
  1. 安装 kubectl

  2. 通过 kubectl 连接到您的集群。

  3. 切换到您安装 Kubeflow Pipelines 的命名空间

    kubectl config set-context --current --namespace <your-kfp-namespace>
    

    注意,通常是 kubeflowdefault

  4. 确认当前工作流执行器

    kubectl describe configmap workflow-controller-configmap | grep -A 2 containerRuntimeExecutor
    

    使用 docker 执行器时,您会看到如下输出

    containerRuntimeExecutor:
    ----
    docker
    
  5. 将工作流执行器配置为 emissary

    kubectl patch configmap workflow-controller-configmap --patch '{"data":{"containerRuntimeExecutor":"emissary"}}'
    
  6. 确认工作流执行器已成功更改

    kubectl describe configmap workflow-controller-configmap | grep -A 2 containerRuntimeExecutor
    

    您会看到如下输出

    containerRuntimeExecutor:
    ----
    emissary
    
使用 emissary 执行器部署新的 Kubeflow Pipelines 集群

对于 AI Platform Pipelines,安装过程中请勾选“使用 emissary 执行器”复选框。

对于Kubeflow Pipelines Standalone,安装 env/platform-agnostic-emissary

kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/platform-agnostic-emissary?ref=$PIPELINE_VERSION"

如有疑问,您始终可以先部署 Kubeflow Pipelines 集群,然后按照现有集群的说明在安装后配置工作流执行器。

迁移 pipeline 组件以在 emissary 执行器上运行

某些 pipeline 组件需要手动更新才能在 emissary 执行器上运行。对于Kubeflow Pipelines 组件规范 YAML,必须指定 command 字段。

组件迁移分步教程

  1. 有一个 hello world 组件

    name: hello-world
    implementation:
      container:
        image: hello-world
    
  2. 我们可以运行不带 command/args 的容器

    $ docker run hello-world
    Hello from Docker!
    ...
    
  3. 查找镜像中的默认 ENTRYPOINT 和 CMD 是什么

    $ docker image inspect -f '{{.Config.Entrypoint}} {{.Config.Cmd}}' hello-world
    [] [/hello]
    

    因此 ENTRYPOINT 未指定,而 CMD 是 ["/hello"]。请注意,ENTRYPOINT 大致等于 command,CMD 大致等于 argumentscommandarguments 连接起来作为用户命令。

  4. 更新组件 YAML

    name: hello-world
    implementation:
      container:
        image: hello-world
        command: ["/hello"]
    
  5. 更新后的组件现在可以在 emissary 执行器上运行了。

注意:Kubeflow Pipelines SDK 编译器总是为基于 python 函数的组件 指定一个命令。因此,这些组件无需修改即可继续在 emissary 执行器上工作。

Docker 执行器

Docker 执行器在 Kubeflow Pipelines v1.8 之前是默认的工作流执行器。

  • 容器运行时:仅限 docker。然而,Kubernetes 在 v1.20 后弃用 Docker 作为容器运行时。在 Google Kubernetes Engine (GKE) 1.19+ 上,容器运行时已默认为 containerd。
  • 可靠性:经过最充分测试且最流行的 argo workflows 执行器
  • 安全性:最不安全
    • 它需要挂载宿主机的 docker.sockprivileged 访问权限。这通常会被 Open Policy Agent (OPA) 或您的 Pod 安全策略 (PSP) 拒绝。GKE Autopilot 模式也拒绝它,因为不允许特权 Pod
    • 它可以逃脱 pod 的服务账户权限。

为 Docker 执行器准备 GKE 集群

对于 GKE,节点镜像决定使用哪种容器运行时。要使用 docker 容器运行时,您需要指定一个包含 Docker 的节点镜像

您必须使用以下节点镜像之一

  • 带有 Docker 的 Container-Optimized OS (cos)
  • 带有 Docker 的 Ubuntu (ubuntu)

如果您的节点未使用 docker 作为容器运行时,运行 pipelines 时将始终收到类似如下的错误消息

此步骤处于 Error 状态,消息为:failed to save outputs: Error response from daemon: No such container: XXXXXX

参考

反馈

本页对您有帮助吗?


上次修改时间 2024 年 7 月 31 日:修复 Pipelines 中的损坏链接 (#3807) (17e27bf)