这是完全正确的。当您使用 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 代理始终运行