Flink on k8s的使用方式哪些?
Flink on Kubernetes (K8s) 的使用方式可以从两个核心维度来划分:部署架构模式(底层资源交互方式) 和 作业生命周期模式(集群与作业的关系)。
在实际生产中,通常是将这两个维度的某种组合付诸实践。以下是详细分类和介绍:
维度一:按部署架构划分(底层如何与 K8s 交互)
这是区分度最明显的方式,主要有以下三种:
1. Flink Kubernetes Operator 模式(当前官方推荐,云原生标准)
这是目前最推荐、最符合云原生(GitOps)理念的方式。
- 原理:在 K8s 中部署 Flink 官方的 Operator(控制器),通过自定义资源(CRD,如
FlinkDeployment)来声明式地管理 Flink 集群和作业。 - 特点:
- 声明式管理:只需编写 YAML 文件,即可完成作业的提交、停止、更新。
- 自动化运维:支持自动保存 Savepoint、平滑升级版本、自动故障恢复。
- 高级特性:原生支持 Autoscaler(根据流量自动伸缩 TaskManager 并结合 Savepoint 重启)。
- 适用场景:现代化生产环境、CI/CD 与 GitOps 流程。
2. Native Kubernetes 模式(原生集成模式)
Flink 自身具备直接与 K8s API 交互的能力。
- 原理:用户通过 Flink 客户端(CLI)提交命令,Flink 客户端调用 K8s API 创建 JobManager Pod;JobManager 根据作业资源需求,动态向 K8s 申请并创建 TaskManager Pod。
- 特点:
- 动态资源分配:按需拉起 TaskManager,作业结束后自动销毁,节省资源。
- 无需额外安装 Operator,只需配置好 K8s RBAC(角色权限)。
- 适用场景:不想安装 Operator,但希望获得动态资源管理能力的场景。
3. Standalone on K8s 模式(传统容器化模式)
将 K8s 仅仅作为一个普通的容器运行时,Flink 完全感知不到 K8s 的存在。
- 原理:运维人员手动编写 K8s 原生的
Deployment、Service、ConfigMap等资源文件,分别启动固定数量的 JobManager 和 TaskManager。 - 特点:
- 完全静态:资源无法动态伸缩,必须预先规划好 TaskManager 的副本数。
- 配置繁琐,升级和维护成本高。
- 适用场景:受限于 K8s权限(无法给 Flink 授予 K8s API 访问权限时)的旧系统或过渡方案。
维度二:按作业生命周期划分(作业与集群的关系)
在上述的每种部署架构下,又可以细分为以下两种运行形态(传统的 Per-Job 模式在 Flink 1.15+ 已被废弃):
1. Application 模式(生产环境首选)
- 运行机制:为单个作业启动一个专属的 Flink 集群。应用的
main()方法在 K8s 上的 JobManager Pod 中执行,下载依赖并在集群端解析 JobGraph。 - 优点:
- 强隔离性:不同作业之间 CPU、内存、网络完全隔离,互不影响。
- 减轻客户端压力:客户端只负责发请求,不再需要消耗大量带宽去下载依赖和生成 JobGraph。
- 缺点:每次运行小作业都会拉起一套 Pod,有轻微的启动延迟。
- 适用场景:生产环境中的长期运行任务(Streaming 任务)。
2. Session 模式(会话模式)
- 运行机制:预先在 K8s 上拉起一个长期运行的共享 Flink 集群(常驻 JobManager 和若干 TaskManager),多个作业共享这个集群的资源。
- 优点:
- 启动速度极快:无需等待 Pod 创建即可提交作业。
- 缺点:
- 资源隔离差:一个作业崩溃(如 OOM)可能导致整个 TaskManager 甚至 JobManager 崩溃,进而影响其他作业。
- 可能会有类加载冲突。
- 适用场景:开发测试环境、Ad-hoc 交互式查询(如配合 Apache Zeppelin、Flink SQL Gateway)、运行时间极短的批处理小任务。
总结与选型建议
在实际选型中,主流的最佳实践组合如下:
| 使用方式 | 自动化程度 | 隔离性 | 复杂度 | 推荐使用场景 |
|---|---|---|---|---|
| Operator + Application 模式 | 最高 | 高 | 中等(需装Operator) | 绝大多数生产环境的最佳选择,适合流处理。 |
| Operator + Session 模式 | 高 | 低 | 中等 | 测试环境、交互式 Flink SQL 平台。 |
| Native + Application 模式 | 中 | 高 | 低 | 无法安装 Operator 时的生产替代方案。 |
| Standalone 模式 | 低 | 视情况 | 低(仅需基本K8s知识) | 极少数受权限严格限制的遗留系统。 |
当前业界的绝对主流演进趋势是:直接采用 Flink Kubernetes Operator,并在该框架下根据业务是流作业还是交互式作业,分别使用 Application CR 或 Session CR。