prefect.io kubernetes 代理和任务执行

prefect.io kubernetes agent and task execution

在阅读 kubernetes agent documentation 时,我对下面的行感到困惑

"配置流-运行 运行 作为 Kubernetes 作业。"

这是否意味着负责提交流程和与 api 服务器通信的进程将 运行 作为 kubernetes 作业?

另一方面,我要解决的用例是

  1. 设置后端服务器
  2. 执行由 2 个任务组成的流程
  3. 如果 k8s 基础设施可用,则任务应作为 kubernetes 作业执行
  4. 如果 docker 只有基础设施可用,任务应作为 docker 容器执行。

有人可以建议我如何解决 prefect.io 中的上述情况吗?

完全正确。当您使用 KubernetesAgent 时,Prefect 会将您的流程 运行 部署为 Kubernetes 作业。

对于 #1 - 您可以在您的代理 YAML 文件中执行此操作,如下所示:

        env:
        - name: PREFECT__CLOUD__AGENT__AUTH_TOKEN
          value: ''
        - name: PREFECT__CLOUD__API
          value: "http://some_ip:4200/graphql" # paste your GraphQL Server endpoint here
        - name: PREFECT__BACKEND
          value: server

#2 - 写下你的流程

#3 和#4 - 这在 Prefect 中更具挑战性,因为目前没有可识别您的基础架构的负载平衡机制。您可以尝试一些 hacky 解决方案,但在 Prefect 中没有 first-class 方法来处理这个问题。

一个 hack 是:你构建一个父流来检查你的基础设施资源,并根据结果,它使用 Docker运行 或 Kubernetes 启动你的流 运行 运行 运行 配置

from prefect import Flow, task, case
from prefect.tasks.prefect import create_flow_run, wait_for_flow_run
from prefect.run_configs import DockerRun, KubernetesRun


@task
def check_the_infrastructure():
    return "kubernetes"


with Flow("parent_flow") as flow:
    infra = check_the_infrastructure()
    with case(infra, "kubernetes"):
        child_flow_run_id = create_flow_run(
            flow_name="child_flow_name", run_config=KubernetesRun()
        )
        k8_child_flowrunview = wait_for_flow_run(
            child_flow_run_id, raise_final_state=True, stream_logs=True
        )
    with case(infra, "docker"):
        child_flow_run_id = create_flow_run(
            flow_name="child_flow_name", run_config=DockerRun()
        )
        docker_child_flowrunview = wait_for_flow_run(
            child_flow_run_id, raise_final_state=True, stream_logs=True
        )

但请注意,这将需要您拥有 2 个代理:Kubernetes 代理和 Docker 代理 运行ning