0

在阅读kubernetes 代理文档时,我对以下行感到困惑

"配置 flow-run 以作为 Kubernetes 作业运行。 "

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

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

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

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

4

1 回答 1

1

这是完全正确的。当您使用 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 中没有一流的方法来处理这个问题。

一种技巧是:您构建一个父流程来检查您的基础设施资源,并根据结果,使用 DockerRun 或 KubernetesRun 运行配置启动您的流程运行。

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 代理始终运行

于 2022-02-03T16:12:39.130 回答