Flink on Kubernetes部署详细教程

  • 一、概念
  • 二、准备工作
  • 三、在K8s集群上搭建Flink集群
    • [3.1 准备配置文件](#3.1 准备配置文件)
    • [3.2 通过配置文件在 Kubernetes 上部署 Flink 集群](#3.2 通过配置文件在 Kubernetes 上部署 Flink 集群)
    • [3.3 haproxy配置flink集群负载均衡](#3.3 haproxy配置flink集群负载均衡)
    • [3.4 K8s验证](#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

回到目录

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

    kubectl get pv -n 命名空间名称
    kubectl get pvc -n 命名空间名称

  1. 通过配置文件,创建应用,执行命令: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集群服务是否正常启动:

回到目录

相关推荐
面向Google编程2 分钟前
从零学习Kafka:生产者分区机制
大数据·kafka
盘古信息IMS30 分钟前
全域场景重构,激活智造新未来!盘古信息机加行业数智化解决方案深度解析
大数据·人工智能
跨境卫士-小汪32 分钟前
多国站点利润分化加剧跨境卖家如何重新排优先级
大数据·人工智能·产品运营·跨境电商·跨境
精益数智工坊38 分钟前
物料管理是什么?物料管理的具体工作有哪些?
大数据·前端·数据库·人工智能·精益工程
xixixi7777742 分钟前
全模态原生大脑降临:GPT-5.5(Spud)发布,推理/编码提升30%,百万上下文+原生电脑控制,开启Agent新纪元
大数据·网络·人工智能·gpt·安全·电脑·量子计算
MoonBit月兔1 小时前
MoonBit 大型软件合成挑战赛决赛暨 Meetup 0.9 版本专场回顾
大数据·开发语言·人工智能·moonbit
互联网推荐官1 小时前
大模型应用开发的上下文工程与推理链路深度拆解
大数据·运维·人工智能
BIGmustang1 小时前
基于rancher-rke部署 k8s集群
容器·kubernetes·rancher
Cat_Rocky2 小时前
通过k8s实现单pod部署
java·容器·kubernetes
运维全栈笔记2 小时前
K8S部署WordPress+MySQL:模块化YAML配置详解
服务器·mysql·docker·云原生·容器·kubernetes·服务发现