Prefect 的 server 和 worker 和开发环境之间依赖关系说明

当你开发基于 Prefect 的 Python 代码时,代码的依赖归属 / 生效环境核心原则是:所有依赖(包括 Prefect 核心库、业务库)都需要安装在「执行代码的环境」中 —— 也就是 Worker 拉起的执行载体(进程 / 容器 / Pod)里,而非 Prefect Server/Cloud(仅负责调度,不运行代码)。
下面分「依赖类型」和「不同执行环境」拆解,让你明确 “依赖该装在哪、依赖谁提供”:

一、先明确代码的两类依赖

你的 Prefect Python 代码会涉及两类依赖,两者都需要在执行环境中存在:
依赖类型
作用
示例
 
Prefect 核心依赖
让 Flow/Task 能被 Prefect 识别、调度、运行
prefect(核心库,版本需和 Worker/Server 匹配)、prefect-kubernetes(K8s 集成插件)
 
业务逻辑依赖
代码实现功能所需的第三方库
pandas(数据处理)、requests(接口调用)、pyspark(大数据计算)
 

二、依赖的 “生效环境”:谁执行代码,依赖就装在谁那

Prefect Server/Cloud 只做 “调度决策”(比如 “什么时候跑这个 Flow”),从不运行你的代码;真正运行代码的是 Worker 拉起的「执行载体」(进程 / 容器 / Pod),因此依赖必须装在这个载体里。
按 Worker 类型分场景说明:

场景 1:本地 Process Worker(最简单,开发调试用)

  • 执行载体:Worker 所在机器的 Python 进程(和 Worker 共用同一个 Python 环境)。
  • 依赖归属:依赖需要安装在 Worker 运行的本地 Python 环境(虚拟环境 / 全局环境)中。
  • 怎么装:直接用 pip 安装到该环境即可:
# 1. 先创建/激活虚拟环境(推荐)
python -m venv prefect-env
source prefect-env/bin/activate  # Linux/Mac
# 2. 安装 Prefect 核心依赖 + 业务依赖
pip install prefect==3.6.4 pandas requests  # 版本要和 Server/Cloud 匹配
  • 依赖提供者:你自己(开发 / 运维)负责在 Worker 所在机器配置这个 Python 环境。

场景 2:Docker 镜像方式(环境隔离,生产常用)目前我部署这种模式,基于K8S。直接看这

目前我们 在k8s 部署 worker 环境。
  • 执行载体:Worker 自动拉起的 Docker 容器。

1.安装依赖

requirements.txt 列出所有依赖:
prefect==3.6.4
pandas==2.1.0
requests==2.31.0

2.写 Dockerfile 打包镜像:

# 基础镜像,引入官方的。可以叠加开发。
FROM prefecthq/prefect:3.6.4-python3.12
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制你的 Prefect 代码
COPY your_flow_code.py /app/
WORKDIR /app

3.构建镜像

docker build -t prefect-spirit-ai:v1.0.1 .

启动 Docker Worker 时指定该镜像,部署大k8s 中,使用yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prefect-worker
  namespace: flowauto
  labels:
    app: prefect-worker
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prefect-worker
  template:
    metadata:
      labels:
        app: prefect-worker
    spec:
      containers:
      - name: prefect-worker
        image: prefect-spirit-ai:v1.0.1
        command: ["prefect", "worker", "start", "--pool", "default-pool", "--work-queue", "default"]
        env:
          # 连接 Server 的 API 地址(集群内 Service 地址)
          - name: PREFECT_API_URL
            value: "http://192.168.10.107:30420/api"
          # MinIO 对象存储配置(与 Server 一致)
          - name: PREFECT_OBJECT_STORAGE_BLOCK_SERVICE__ACCESS_KEY_ID
            value: "spirit-ai"
          - name: PREFECT_OBJECT_STORAGE_BLOCK_SERVICE__SECRET_ACCESS_KEY
            value: "Spirit-ai2025"
          - name: PREFECT_OBJECT_STORAGE_BLOCK_SERVICE__BUCKET_NAME
            value: "prefect-data"
          - name: PREFECT_OBJECT_STORAGE_BLOCK_SERVICE__ENDPOINT_URL80
            value: "http://192.168.10.193:8090"
          - name: PREFECT_OBJECT_STORAGE_BLOCK_SERVICE__REGION
            value: "us-east-1"
部署
apply -f prefect-worker-deployment.yaml

查看

kubectl get pods -n autoflow
  • 依赖提供者:你通过构建 Docker 镜像提供依赖,Worker 拉取镜像后,容器内就有了所有依赖。
posted @ 2025-12-10 10:43  王竹笙  阅读(21)  评论(0)    收藏  举报