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'))
原因分析与解决方法
核心原因
- Kubernetes Job 基础设施块未指定命名空间:部署文件中的命名空间配置不生效,实际创建Job的逻辑由
kubernetes-job基础设施块控制,若块中未明确设置namespace,Worker会默认使用default命名空间。 - Worker 服务账号权限范围限制:
prefect-worker服务账号仅拥有hm-prefect命名空间的操作权限,访问default命名空间时触发权限拒绝。 - 网络路由限制:Worker所在的
hm-prefect命名空间可能被网络策略限制,无法访问default命名空间的Kubernetes API端点。
解决步骤
- 修正 Kubernetes Job 基础设施块配置
- 进入Prefect UI,找到
print-platform-kubernetes-job-block - 添加或修改
namespace字段为hm-prefect,保存更新
- 进入Prefect UI,找到
- 重新同步部署配置
- 执行命令更新部署的基础设施块引用:
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
- 执行命令更新部署的基础设施块引用:
- 验证服务账号权限(可选)
- 确认
prefect-worker服务账号在hm-prefect命名空间拥有jobs.batch资源的创建权限(Helm默认部署已配置),若需跨命名空间操作,需扩展对应的Role或ClusterRole权限。
- 确认
- 排查网络策略
- 检查集群中是否存在限制
hm-prefect命名空间访问Kubernetes API的网络策略,若有则调整规则允许访问。 - 验证Worker Pod的DNS解析正常,能正确访问
kubernetes.default.svc(Kubernetes API默认地址)。
- 检查集群中是否存在限制
内容的提问来源于stack exchange,提问作者Hongbo Miao
相关产品推荐
相关产品推荐

