You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prefect Worker切换后Kubernetes Job创建权限与连接问题排查

问题排查:Prefect Worker 在 Kubernetes 中创建 Job 时的命名空间错误及路由问题

背景

自Prefect 2.11.0版本推出工作池(work pools)与Worker功能后,将原有Prefect Agent切换为Prefect Worker,通过Helm完成Server与Worker部署。

部署细节

Prefect Server 部署命令

helm upgrade \
  prefect-server \
  prefect-server \
  --install \
  --repo=https://prefecthq.github.io/prefect-helm \
  --namespace=hm-prefect \
  --create-namespace \
  --values=prefect-server-values.yaml

prefect-server-values.yaml 配置

server:
  image:
    repository: docker.io/prefecthq/prefect
    prefectTag: 2.11.0-python3.11-kubernetes
  publicApiUrl: https://prefect.mydomain.com/api

Prefect Worker 部署命令

helm upgrade \
  prefect-worker \
  prefect-worker \
  --install \
  --repo=https://prefecthq.github.io/prefect-helm \
  --namespace=hm-prefect \
  --create-namespace \
  --values=prefect-worker-values.yaml

prefect-worker-values.yaml 配置

worker:
  image:
    repository: docker.io/prefecthq/prefect
    prefectTag: 2.11.0-python3.11-kubernetes
  apiConfig: server
  config:
    workPool: hm-kubernetes-pool
  serverApiConfig:
    apiUrl: http://prefect-server.hm-prefect.svc:4200/api

部署完成后,通过helm list与kubectl get deployment确认Server和Worker均正常运行,UI中可见Worker。

遇到的问题

问题1:Worker 尝试在 default 命名空间创建 Job

执行部署命令:

prefect deployment build src/main.py:print_platform --name=print-platform --infra-block=kubernetes-job/print-platform-kubernetes-job-block --apply --pool=hm-kubernetes-pool

生成的print_platform-deployment.yaml指定了namespace: hm-prefect,但运行时出现权限错误:

jobs.batch is forbidden: User "system:serviceaccount:hm-prefect:prefect-worker" cannot create resource "jobs" in API group "batch" in the namespace "default"

问题2:路由不可达且仍访问 default 命名空间

通过prefect init生成prefect.yaml并移除已完成的build和publish部分后重新部署,出现新错误:

HTTPSConnectionPool(host='10.43.0.1', port=443): Max retries exceeded with url: /apis/batch/v1/namespaces/default/jobs (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0xffffac3a3c10>: Failed to establish a new connection: [Errno 113] No route to host'))

原因分析与解决方法

核心原因

  1. Kubernetes Job 基础设施块未指定命名空间:部署文件中的命名空间配置不生效,实际创建Job的逻辑由kubernetes-job基础设施块控制,若块中未明确设置namespace,Worker会默认使用default命名空间。
  2. Worker 服务账号权限范围限制:prefect-worker服务账号仅拥有hm-prefect命名空间的操作权限,访问default命名空间时触发权限拒绝。
  3. 网络路由限制:Worker所在的hm-prefect命名空间可能被网络策略限制,无法访问default命名空间的Kubernetes API端点。

解决步骤

  1. 修正 Kubernetes Job 基础设施块配置
    • 进入Prefect UI,找到print-platform-kubernetes-job-block
    • 添加或修改namespace字段为hm-prefect,保存更新
  2. 重新同步部署配置
    • 执行命令更新部署的基础设施块引用:
      prefect deployment update print-platform -i kubernetes-job/print-platform-kubernetes-job-block
      
    • 或者重新生成部署文件并应用:
      prefect deployment build src/main.py:print_platform --name=print-platform --infra-block=kubernetes-job/print-platform-kubernetes-job-block --apply --pool=hm-kubernetes-pool
      
  3. 验证服务账号权限(可选)
    • 确认prefect-worker服务账号在hm-prefect命名空间拥有jobs.batch资源的创建权限(Helm默认部署已配置),若需跨命名空间操作,需扩展对应的Role或ClusterRole权限。
  4. 排查网络策略
    • 检查集群中是否存在限制hm-prefect命名空间访问Kubernetes API的网络策略,若有则调整规则允许访问。
    • 验证Worker Pod的DNS解析正常,能正确访问kubernetes.default.svc(Kubernetes API默认地址)。

内容的提问来源于stack exchange,提问作者Hongbo Miao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:57:07