在阅读kubernetes代理文档时,我对下面的感到困惑
">将流运行配置为作为Kubernetes作业运行";
这是否意味着负责提交流和与api服务器通信的进程将作为kubernetes作业运行?
另一方面,我试图解决的用例是
- 设置后端服务器
- 执行由2个任务组成的流程
- 如果k8s infra可用,则任务应作为kubernetes作业执行
- 如果Dockeronlyinfra可用,那么任务应该作为docker容器执行
有人能建议我,如何在defect.io中解决上述场景吗?
没错。当您使用KubernetsAgent时,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中没有一流的方法来处理此问题。
一个破解方法是:你构建一个检查基础设施资源的父流,根据结果,它会使用DockerRun或KubernetsRun运行配置来加速你的流运行。
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
)
但请注意,这需要有两个代理:Kubernetes代理和Docker代理始终运行