必须先安装cert-manager(v1.12.0+),因其为flink operator admission webhook提供tls证书,否则operator将因certificatesigned错误卡在crashloopbackoff,webhook无法启动导致crd创建失败。

直接上生产环境能跑通的部署路径:用 Flink Kubernetes Operator 而不是手写一堆 Deployment + Service + ConfigMap,否则后续升级、Savepoint 管理、故障恢复全得自己撸脚本。
为什么必须先装 cert-manager 才能部署 Operator
Flink Kubernetes Operator 默认启用 Admission Webhook,它依赖 TLS 证书做资源校验(比如拒绝非法镜像、超限内存配置)。没 cert-manager,Operator Pod 会卡在 CrashLoopBackOff,日志里反复报 CertificateSigned 错误。
- 必须先装
cert-manager(v1.12.0+),命令是:kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.12.0/cert-manager.yaml - 等
cert-manager的 Pod 全部Running后,再装 Operator;否则 Webhook 服务起不来,CRD 创建会失败 - 验证方式:
kubectl get validatingwebhookconfigurations,mutatingwebhookconfigurations—— 应该能看到两个非空列表
FlinkDeployment CRD 中 taskmanager.replicas 不生效的常见原因
写好 FlinkDeployment YAML 提交后,TaskManager Pod 数量始终是 1,不是你设的 3 或 5。这不是配置写错,而是资源配额或调度器拦截了。
- 检查命名空间是否绑定了
ResourceQuota:kubectl get resourcequota -n <your-ns></your-ns>,如果limits.memory或requests.cpu已耗尽,新 Pod 会卡在Pending - 确认
nodeSelector/taints是否匹配:Operator 默认不加任何调度约束,但如果你集群节点打了flink: true污点,而FlinkDeployment没配对应tolerations,TM 就调度不出去 -
taskmanager.replicas是 Operator 控制的终态,但实际 Pod 数受taskmanager.memory.process.size和节点可用资源共同限制;比如设了4Gi内存但节点只剩2Gi,最多起 1 个
JobManager Service 暴露端口后连不上 REST API
Service 类型设成 ClusterIP,本地 curl http://<svc-name>:8081</svc-name> 返回 Connection refused,或者超时。
- 先确认 JobManager Pod 是否 Ready:
kubectl get pods -l app=flink-jobmanager,状态不是Running或Ready为 0/1,说明启动失败 - 查日志:
kubectl logs -l app=flink-jobmanager --tail=50,高频错误是Could not resolve address for jobmanager.rpc.address—— 这是因为flink-conf.yaml里写了具体 host(如jobmanager.rpc.address: flink-jobmanager),但 Operator 生成的 ConfigMap 没覆盖这个值,得在FlinkDeployment.spec.flintConfiguration里显式指定 - Service 的
targetPort必须和 JobManager 容器的rest.port一致,默认是8081,但如果改过rest.port: 9091,Service 就得同步改,否则流量进不去
Session 集群下提交作业后 JobManager 突然重启
用 flink run -m <service-url> ...</service-url> 提交完作业,几秒后 JM Pod 重建,作业丢失。这不是 Operator Bug,而是配置冲突。
- Operator 默认开启高可用(HA),但没配
high-availability.storageDir—— 它会 fallback 到本地磁盘,而 Pod 重启后目录清空,JM 无法从 checkpoint 恢复,只能崩溃重启 - 必须配持久化存储:
high-availability: filesystem+high-availability.storageDir: hdfs:///flink/ha(或 S3/OSS 路径),且确保该路径可读写 - 若用本地 PV,注意
PersistentVolume的accessModes必须含ReadWriteMany,否则多个 JM 副本无法共享 HA 目录
Operator 不是“设完参数就完事”的黑盒,它的每个字段都对应 Kubernetes 原语的真实约束。最常被跳过的一步是验证 Webhook 状态和 HA 存储路径可写性——这两处出问题,集群看起来起了,但一跑作业就断。











