当前位置: 代码网 > it编程>编程语言>Javascript > 【梳理】k8s使用Operator搭建Flink集群(高可用可选)

【梳理】k8s使用Operator搭建Flink集群(高可用可选)

2024年07月31日 Javascript 我要评论
本文内容来源于Flink官网,进行翻译、简化、整理,供大家参考~

1. 架构图

请添加图片描述

参考:部署验证demo

2. helm 安装operator

安装cert-manager依赖
jetstack/cert-manager 是 kubernetes 生态系统中的一款开源项目,它提供了一种自动化的方式来管理 tls 证书的生命周期

kubectl create -f https://github.com/jetstack/cert-manager/releases/download/v1.8.2/cert-manager.yaml
# helm 安装 , 包含 deploy*1 、cm*1、crd*2 以及 rbac sa webhook
kubectl create -f https://github.com/jetstack/cert-manager/releases/download/v1.8.2/cert-manager.yaml
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

3. 集群知识

k8s上的两种模式:native和standalone

flink kubernetes operator 支持:原生部署native(默认)和独立部署standalone

可以使用部署规范中的 mode 字段设置部署模式。

apiversion: flink.apache.org/v1beta1
kind: flinkdeployment
...
spec:
  ...
  mode: standalone

两种cr

flinkdeployment cr 定义了 flink 应用程序和会话集群部署。

flinksessionjob cr 定义了 session 集群上的会话任务(job)

flink kubernetes operator 支持两种主要类型的部署:application集群 和 session集群 ,k8s上不支持job集群。

4. 运行集群实例

demo1:application 集群

一次性任务,只有一个job,执行器和逻辑代码打包成一个jar,直接运行,运行即结束。

# 此crd创建后,operator会创建:
# 1个deploy(即jobmanager,镜像为flink:1.17)
# 1个pod(即taskmanager,镜像也是flink:1.17,任务jar包在镜像中)
apiversion: flink.apache.org/v1beta1
kind: flinkdeployment
metadata:
  name: basic-example
spec:
  image: flink:1.17
  flinkversion: v1_17
  flinkconfiguration:
    taskmanager.numberoftaskslots: "2"
  serviceaccount: flink
  jobmanager:
    resource:
      memory: "2048m"
      cpu: 1
  taskmanager:
    resource:
      memory: "2048m"
      cpu: 1
  job:
    jaruri: local:///opt/flink/examples/streaming/statemachineexample.jar
    parallelism: 2
    upgrademode: stateless

注:k8s不支持job集群,可以看做是 flink application 集群”客户端运行“的替代方案。集群管理器为每个提交的作业启动一个集群。

demo2:session集群

多租户,多个job,每个sessionjob代表一个job,有提交jar包的功能。
session使用与application 集群类似的规范,唯一的区别是 job 未定义。

apiversion: flink.apache.org/v1beta1
kind: flinkdeployment
metadata:
  name: basic-session-deployment-example
spec:
  image: flink:1.17
  flinkversion: v1_17
  jobmanager:
    resource:
      memory: "2048m"
      cpu: 1
  taskmanager:
    resource:
      memory: "2048m"
      cpu: 1
  serviceaccount: flink
---
apiversion: flink.apache.org/v1beta1
kind: flinksessionjob
metadata:
  name: basic-session-job-example
spec:
  deploymentname: basic-session-deployment-example
  job:
    jaruri: https://repo1.maven.org/maven2/org/apache/flink/flink-examples-streaming_2.12/1.16.1/flink-examples-streaming_2.12-1.16.1-topspeedwindowing.jar
    parallelism: 4
    upgrademode: stateless

---
apiversion: flink.apache.org/v1beta1
kind: flinksessionjob
metadata:
  name: basic-session-job-example2
spec:
  deploymentname: basic-session-deployment-example
  job:
    jaruri: https://repo1.maven.org/maven2/org/apache/flink/flink-examples-streaming_2.12/1.16.1/flink-examples-streaming_2.12-1.16.1.jar
    parallelism: 2
    upgrademode: stateless
    entryclass: org.apache.flink.streaming.examples.statemachine.statemachineexample

注:为了方便访问,可以再创建ingress。svc端口默认为8081,指向svc-rest即可。

优劣

  • session集群,是常规的共享方式。
  • application集群,提供了更好的隔离,生命周期与程序逻辑有关。
  • job集群,适合长期运行、要求高稳定性的大型作业。(启动慢)

5. 高可用部署

flink 提供了两种高可用服务实现:

  • zookeeper:每个 flink 集群部署都可以使用 zookeeper ha 服务。它们需要一个运行的 zookeeper 复制组(quorum)。
  • kubernetes:kubernetes ha 服务只能运行在 kubernetes 上。
    注:flink 持久化元数据和 job 组件,直到作业执行成功、被取消或最终失败,再删除。

我在实践时,遇到两个问题:

问题1:high availability should be enabled when starting standby jobmanagers

直接增加jobmanager的副本数提示上述错误,要先做选举配置,我选择的是k8s实现,下面仅列出修改部分,注意flinkconfigurationpodtemplate两部分:

apiversion: flink.apache.org/v1beta1
kind: flinkdeployment
spec:
  flinkconfiguration:
    high-availability: org.apache.flink.kubernetes.highavailability.kuberneteshaservicesfactory
    high-availability.storagedir: file:///flink-data/ha
    web.upload.dir: /flink-data  #会自动创建flink-web-upload目录保存上传的jar包
  jobmanager:
    replicas: 2
  taskmanager:
    replicas: 2
  podtemplate:
    spec:
      containers:
        - name: flink-main-container
          volumemounts:
            - mountpath: /flink-data
              name: flink-volume
      volumes:
        - name: flink-volume
          persistentvolumeclaim:
            claimname: flink-ha

问题2:the base directory of the jobresultstore isn’t accessible

如果没有正确挂载存储卷提示上述错误。
官方demo配置的卷是宿主机的路径,如下:

      volumes:
        - name: flink-volume
          hostpath:
            path: /tmp/flink  # 如果宿主机上没有这个路径会报错
            type: director

6. 补充

  1. 拉取国外镜像比较困难,可以使用https://dockerproxy.com/
  2. 搭建多租户paas平台,可以使用session方式,新任务可以通过cr进行管理,也可以由页面添加jar包。
  3. 本文内容来源于flink官网,进行翻译、简化、整理,供大家参考~
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com