- 背景和现状
目前行内提交flink作业采用Native kubernetes模式,提交作业时会指定并行度和taskmanager使用的内存及cpu数量。这种情况下会导致在作业运行高峰可能存在资源不足问题运行低峰又会造成资源浪费,这种粗放的使用资源的模式在实时计算业务量不多的时候还可以勉强接受,而随着实时计算业务的增多,则会造成大量的资源浪费和性能瓶颈。为了使存储和计算资源得到更加合理有效的使用,能跟据业务繁忙程度动态调整flink资源占用的处理模式显得尤为重要。 - 内容和目标
模式 限制 版本 推荐指数 描述
Standalone 静态资源申请 Standalone 部署需要手动去提前创建 ConfigMap、Service、JobManager Deployment、TaskManager Deployment
预分配资源
Reactive模式 K8s下仅支持standalone模式 1.12 增加或者减少 TaskManager 的数量。在 Kubernetes 中,
可以通过改变 Deployment 的副本数(Replica Factor) 实现。
Native kubernetes 要实现扩缩容需要自己开发一套维护作业部署/升级/错误处理/扩缩容的程序 1.11 *** 调用k8s-api分配资源
operator 官方支持推荐
需要在k8s上安装operator和安装cert-manager依赖 1.18.x ***** 相当于Adaptive Scheduler + native kubernetes,更高层次的api
目前几种方案
使用flink-k8s-operator完成作业使用集群资源的扩缩操作。
简单地说flink-kubernetes-operator 是在 Kubernetes 集群上运行 Flink 应用的工具。它简化了Flink 应用在 Kubernetes 集群上的部署、扩展和管理。 flink-kubernetes-operator 可以将 Flink 作业定义为 Kubernetes 资源,这样可以更容易地将 Flink 作业作为 Kubernetes 基础架构的一部分管理。Operator负责创建运行Flink作业所需的资源,如 pods、services和配置,此外,operator还提供了例如自动扩展、自动恢复和滚动更新的功能。总的来说,Flink Kubernetes 操作员简化了 Flink 应用的部署和管理,使得在 Kubernetes 集群上运行 Flink 作业更加容易。
- 设计
3.1.概述
3.2.架构图
1.目前采用native k8s
2.目标
通过使用flink operator实现波峰波谷资源使用的扩缩容
3.3. 核心流程
- 需要在k8s集群侧上安装operator和安装cert-manager依赖
- client测需安装helm包管理工具,用来安装flink operator
- 背景和现状
现有k8s集群没有安装operator,flink作业提交采用flink native k8s方式
描述方案后续落地的实施计划
计划: - 对现有k8s集群安装operator
安装helm
helm 安装operator
安装cert-manager依赖
kubectl create -f https://github.com/jetstack/cert-manager/releases/download/v1.8.2/cert-manager.yaml
helm 安装operator , 包含 deploy1 、cm1、crd*2 以及 rbac sa webhook
helm repo add flink-operator-repo https://downloads.apache.org/flink/flink-kubernetes-operator-1.7.0/
helm install flink-kubernetes-operator flink-operator-repo/flink-kubernetes-operator
2.对扩缩容特性进行回归测试
3.逐步迁移现有作业到flink operator模式
- 结论:
- Flink-operator k8s扩缩容强依赖flink1.17及以上版本,从flink1.18开始autoscaler在不执行完整作业升级周期的情况下就地缩放顶点(调整算子并行度)。
- Flink native k8s官方不支持自动/手动扩缩容
- Flink standalone 模式1.18.0开启自适应调度模式(jobmanager.scheduler:adaptive)后支持自动和手动扩缩容
UI 上调整
Rest API
Flink operator介绍:
- operator 是否可以限制在namespace空间里
可以,可以指定在某个命名空间运行:
Operator 安装:
helm install -f values.yaml flink-kubernetes-operator . --namespace flink --create-namespace
作业运行:
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
name: autoscaling-example
namespace: flink # 指定在flink命名空间下运行
spec:
image: autoscaling-example
flinkVersion: v1_18
…
- operator扩缩容需要什么样的权限
flink k8s native模式 提交:
/opt/…/flink run-application –target Kubernetes-application
Operator 模式提交:
kubectl apply -f your-deployment.yaml
参考:
https://blog.51cto.com/u_16099165/7836298