当前位置: 首页 > news >正文

Flink on Kubernetes部署详细教程

Flink on Kubernetes部署详细教程

  • 一、概念
  • 二、准备工作
  • 三、在K8s集群上搭建Flink集群
    • 3.1 准备配置文件
    • 3.2 通过配置文件在 Kubernetes 上部署 Flink 集群
    • 3.3 haproxy配置flink集群负载均衡
    • 3.4 K8s验证

一、概念

Flink on Kubernetes将Flink的流处理能力与K8s的资源管理能力深度融合,实现“按需分配、自动运维、弹性伸缩”的生产级流处理系统。Flink与K8s的核心对应关系:

Flink官方提供三种K8s部署模式,分别对应不同的业务场景。我们需要根据作业类型、资源需求、运维复杂度选择合适的模式。

  • Session Mode是共享集群模式:先启动一个长期运行的Flink集群(包含JM和一组TM),然后通过Client向集群提交多个作业。所有作业共享集群的资源(Task Slot)。
  • Job Cluster Mode是专属集群模式:为每个作业启动一个独立的Flink集群(JM + 专属TM)。作业完成后,集群自动销毁。
  • Application Mode是云原生最优模式:将应用代码与Flink集群打包成一个Docker镜像 ,直接在K8s上运行。作业的生命周期与集群一致(启动集群→运行作业→销毁集群)。
  • 对比如下:

    回到目录

二、准备工作

参考链接:从0到1搭建Flink on K8s集群

  1. 安装依赖工具
  • Kind:本地K8s集群搭建工具(替代Minikube,启动更快);
  • Docker:镜像构建与运行工具;
  • kubectl:K8s命令行工具;
  • Flink CLI:Flink命令行客户端(用于提交作业)。
  1. 搭建本地K8s集群

三、在K8s集群上搭建Flink集群

3.1 准备配置文件

1.K8s集群主节点操作

注意:必须是主节点,从节点不行

  • 在K8s集群其中一个主节点上,进入主节点,查看集群状态:kubectl version

    集群状态正常,进入下一步
  • 进入主节点目录,创建文件夹,并创建yaml配置文件:
#创建文件夹 mkdir /home/flink # 进入文件夹 cd /home/flink # 创建pv.yaml文件 touch pv.yaml # 创建flink.yaml文件 touch flink.yaml
  • pv.yaml文件说明:为Flink 集群持久化存储,创建两个Kubernetes 存储资源对象,分别为:PersistentVolume (PV)(名称为 flink-data-pv)和PersistentVolumeClaim (PVC)(名称为 flink-data-pvc)
  • flink.yaml文件说明:一个用于在 Kubernetes 上部署 Flink 集群的完整配置文件,定义了 5 个 Kubernetes 资源:
    • Deployment: flink-jobmanager (Flink JobManager 部署),负责作业调度和协调
    • Service: flink-jobmanager (JobManager 服务)
    • Deployment: flink-taskmanager (Flink TaskManager 部署),负责实际的数据处理
    • Service: flink-jobmanager-rest (JobManager REST API 服务)
    • Service: flink-taskmanager-http (TaskManager HTTP 服务)

根据实际情况修改下面2个 yaml 文件中 namespace 的值

  • 编辑pv.yaml文件,将下面内容复制到文件中:vi pv.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: flink-data-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany hostPath: path: "/mnt/data/flink-data" type: DirectoryOrCreate --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: flink-data-pvc namespace: test # 添加命名空间,根据实际命名修改 spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi volumeName: flink-data-pv

回到目录

  • 编辑flink.yaml文件,将下面内容复制到文件中:vi flink.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: flink-jobmanager namespace: test # 添加命名空间 spec: replicas: 1 selector: matchLabels: app: flink component: jobmanager template: metadata: labels: app: flink component: jobmanager spec: securityContext: runAsUser: 0 runAsGroup: 0 fsGroup: 0 containers: - name: jobmanager image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apache/flink:1.19.1-java8 args: ["jobmanager"] ports: - containerPort: 6123 name: rpc - containerPort: 6124 name: blob - containerPort: 8081 name: ui env: - name: JOB_MANAGER_RPC_ADDRESS value: flink-jobmanager - name: FLINK_PROPERTIES value: | jobmanager.memory.process.size: 1g jobmanager.memory.jvm-overhead.max: 256m state.backend: filesystem state.checkpoints.dir: file:///mnt/data/flink-data cluster.evenly-spread-out-slots: true volumeMounts: - name: flink-storage mountPath: /mnt/data/flink-data volumes: - name: flink-storage persistentVolumeClaim: claimName: flink-data-pvc --- apiVersion: v1 kind: Service metadata: name: flink-jobmanager namespace: test # 添加命名空间 spec: ports: - name: rpc port: 6123 - name: blob port: 6124 - name: ui port: 8081 selector: app: flink component: jobmanager type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: flink-taskmanager namespace: test # 添加命名空间 spec: replicas: 3 selector: matchLabels: app: flink component: taskmanager template: metadata: labels: app: flink component: taskmanager spec: securityContext: runAsUser: 0 runAsGroup: 0 fsGroup: 0 containers: - name: taskmanager image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apache/flink:1.19.1-java8 args: ["taskmanager"] ports: - containerPort: 6121 name: data - containerPort: 6122 name: rpc - containerPort: 6666 name: http1 - containerPort: 6667 name: http2 - containerPort: 6668 name: http3 - containerPort: 6669 name: http4 - containerPort: 6670 name: http5 - containerPort: 6671 name: http6 - containerPort: 6672 name: http7 env: - name: JOB_MANAGER_RPC_ADDRESS value: flink-jobmanager - name: FLINK_PROPERTIES value: | taskmanager.bind-host: 0.0.0.0 taskmanager.numberOfTaskSlots: 16 taskmanager.memory.process.size: 1024m taskmanager.memory.heap.size: 512m taskmanager.memory.off-heap.size: 256m taskmanager.memory.managed.size: 256m taskmanager.memory.jvm-metaspace.size: 128m taskmanager.memory.jvm-overhead.min: 64m taskmanager.memory.jvm-overhead.max: 128m cluster.evenly-spread-out-slots: true volumeMounts: - name: flink-storage mountPath: /mnt/data/flink-data volumes: - name: flink-storage persistentVolumeClaim: claimName: flink-data-pvc --- apiVersion: v1 kind: Service metadata: name: flink-jobmanager-rest namespace: test # 添加命名空间 spec: ports: - name: ui port: 8081 targetPort: 8081 nodePort: 30081 selector: app: flink component: jobmanager type: NodePort --- apiVersion: v1 kind: Service metadata: name: flink-taskmanager-http namespace: test # 添加命名空间 spec: type: NodePort selector: app: flink component: taskmanager ports: - name: http1 port: 6666 targetPort: 6666 nodePort: 31001 - name: http2 port: 6667 targetPort: 6667 nodePort: 31002 - name: http3 port: 6668 targetPort: 6668 nodePort: 31003 - name: http4 port: 6669 targetPort: 6669 nodePort: 31004 - name: http5 port: 6670 targetPort: 6670 nodePort: 31005 - name: http6 port: 6671 targetPort: 6671 nodePort: 31006 - name: http7 port: 6672 targetPort: 6672 nodePort: 31007

回到目录

3.2 通过配置文件在 Kubernetes 上部署 Flink 集群

  1. 通过配置文件,创建资源,执行命令:kubectl apply -f pv.yaml
    执行后,通过下面命令,判断是否成功创建资源:
kubectl get pv -n 命名空间名称 kubectl get pvc -n 命名空间名称


2. 通过配置文件,创建应用,执行命令:kubectl apply -f flink.yaml
执行后,获取集群中核心资源的信息,执行命令:kubectl get all -n 命名空间名称

如果此时STATUS是Creating,请稍等一会,等待几分钟后重新执行,直至看到STATUS变成Running说明资源运行成功,flink集群创建成功。

回到目录

3.3 haproxy配置flink集群负载均衡

在haproxy集群的所有节点服务器中,找到 /etc/haproxy/haproxy.cfg配置文件,在文件末尾加上如下内容:vi /etc/haproxy/haproxy.cfg

#------- FLink服务 ------- listen Flink bind *:30081 #映射端口 mode tcp #均衡模式 balance roundrobin #均衡算法 option httpclose # 此选项表在客户端和服务器端完成次连接请求后,haproxy将主动关闭此TCP连接 option abortonclose # 在服务器负载很⾼的情况下,⾃动结束掉当前队列中处理时间⽐较长的链接 server k8smaster01 10.30.2.52:30081 check server k8smaster02 10.30.2.13:30081 check server k8sworker01 10.30.2.25:30081 check server k8sworker02 10.30.2.56:30081 check


保存退出,然后重启haproxy服务,执行命令:sudo systemctl restart haproxy
查看haproxy状态,确认成功运行:sudo systemctl status haproxy

注意:

  • option abortonclose 下的server 节点名称 节点IP:30081根据flink集群实际情况配置
  • 所有haproxy集群下的节点服务器都需要按照上面的步骤修改 /etc/haproxy/haproxy.cfg配置文件后,重启haproxy服务。

所有服务配置结束后,查看flink集群是否成功启动,浏览器进入Apache Flink Dashboard(Apache Flink 仪表盘),链接地址:http://10.30.2.150:30081/#/overview
这里的IP地址指的是haproxy配置的对外前端地址。

出现如下画面,说明flink集群负载均衡配置成功。

回到目录

3.4 K8s验证

打开K8s的仪表板(Dashboard)访问界面,查看flink集群服务是否正常启动:

回到目录

http://www.jsqmd.com/news/576738/

相关文章:

  • Python 如何驯服 Premiere Pro:Pymiere 实战指南
  • Win11下CUDA 12.x安装后nvcc命令无效?别慌,手把手教你手动配置环境变量(附排查流程)
  • 产业风向标|集成电路展会推荐,紧跟技术迭代,把握行业风口 - 品牌2026
  • 2026年靠谱的包装机源头工厂推荐:粉末食品颗粒包装机深度测评 - 深度智识库
  • 内网监控软件有哪些?强烈推荐六款内网监控软件,好用码住了
  • 无锡高端腕表抛光价格全解:38 大奢华名表焕新报价与六城服务指南 - 时光修表匠
  • 2026年备考雅思机考用什么软件好?适合长期备考的雅思机考软件推荐 - 品牌2026
  • QSpinBox数值微调框组件笔记
  • Cowabunga Lite:iOS 15+设备免越狱个性化解决方案
  • 将大疆无人机GPS数据接入ROS:一份从PSDK C++示例到sensor_msgs/NavSatFix话题的完整改造指南
  • 霞鹜文楷屏幕阅读版:告别屏幕阅读疲劳的神奇字体解决方案
  • 解锁开源字体高效排版:Inter字体的12个实用技术特性
  • 2026年上一年级选择苏州哪家国际学校更合适 - 品牌排行榜
  • 昇腾910B分布式微调避坑指南:从SSH免密到权重合并的5个常见问题
  • 2026年深圳离婚难题来袭,口碑好的离婚律师团队究竟该选哪家?
  • TPAMI 2025 | 形变感知配准 + 特征交互融合,遥感目标检测精度效率双提升
  • 【云途出海】为什么FB广告账户的时区设置,是投放成败的关键?
  • 从‘山峰’与‘山谷’的比喻理解拉普拉斯锐化:一个MATLAB小白的图像处理笔记
  • U盘泄密怎么办?分享六种防止U盘泄密的方法,有效防止U盘泄密
  • 全新瑞祥黑金卡回收多少,2026年市场行情 - 淘淘收小程序
  • C语言:构造类型
  • 用Python为你的QQ空间记忆打造专属数字档案馆
  • IdentityServer4 中 Invalid redirect_uri 错误的排查与修复指南
  • 客服机器人系统会不会发生宕机?Agent开放平台保障有哪些,数据安全不过关能赔?
  • 炸锅!Claude Code 完整源码意外泄露,51 万行核心代码直接开源!
  • 探讨2026襄阳能降推广成本的营销公司,哪家性价比高 - 工业品网
  • 多语言项目管理软件平台 含搭建教程 操作说明
  • 电商数据采集防封全攻略:从反爬机制拆解到技术落地
  • 别再死记硬背了!用‘热力学黑箱’思维理解Abaqus UMATHT子程序
  • nginx的docker镜像封禁地区IP