Flink Native Kubernetes实战

Flink Native Kubernetes实战

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

Flink KubernetesFlink Native Kubernetes是不同的概览,先回顾一下Flink Kubernetes:

  1. 如下图,从1.2版本到目前最新的1.10,Flink官方都给出了Kubernetes上部署和运行Flink的方案:
    在这里插入图片描述
  2. 在kubernetes上有两种方式运行flink:session clusterjob cluster,其中session cluster是一套服务可以提交多个任务,而job cluster则是一套服务只对应一个任务;
  3. 下图是典型的session cluster部署操作,可见关键是准备好service、deployment等资源的yaml文件,再用kubectl命令创建:
    在这里插入图片描述
  1. 先对比官方的1.9和1.10版本文档,如下图和红框和蓝框所示,可见Flink Native Kubernetes是1.10版本才有的新功能:
    在这里插入图片描述
  2. 看看Native Kubernetes是如何运行的,如下图,创建session cluster的命令来自Flink安装包:
    在这里插入图片描述
  3. 更有趣的是,提交任务的命令也来自Flink安装包,就是我们平时提交任务用到flink run命令,如下图:
    在这里插入图片描述
  4. 结合官方给出的提交和部署流程图就更清晰了:kubernetes上部署了Flink Master,由Flink Client来提交session cluster和job的请求:
    在这里插入图片描述

至此,可以小结Flink Kubernetes和Flink Native Kubernetes的区别:

  1. Flink Kubernetes1.2版本首次出现,Flink Native Kubernetes1.10版本首次出现;
  2. Flink Kubernetes是把JobManager和TaskManager等进程放入容器,在kubernetes管理和运行,这和我们把java应用做成docker镜像再在kubernetes运行是一个道理,都是用kubectl在kubernetes上操作;
  3. Flink Native Kubernetes是在Flink安装包中有个工具,此工具可以向kubernetes的Api Server发送请求,例如创建Flink Master,并且可以和Flink Master通讯,用于提交任务,我们只要用好Flink安装包中的工具即可,无需在kubernetes上执行kubectl操作;
  1. Flink Native Kubernetes只是Beta版,属于实验性质(官方原话:still experimental),请勿用于生产环境!
  2. 只支持session cluster模式(一个常驻session执行多个任务),还不支持Job clusters模式(一个任务对应一个session)

尽管还没有进入Release阶段,但这种操作模式对不熟悉kubernetes的开发者来说还是很友好的,接下来通过实战来体验吧;

官方要求

为了体验Native Kubernetes,flink官方提出了下列前提条件:

  1. kubernetes版本不低于1.9
  2. kubernetes环境的DNS是正常的
  3. KubeConfig文件,并且这个文件是有权对pod和service资源做增删改查的(kubectl命令有权对pod和service做操作,也是因为它使用了对应的KubeConfig文件),这个文件一般在kubernetes环境上,全路径:~/.kube/config
  4. pod执行时候的身份是service account,这个service account已经通过RBAC赋予了pod的增加和删除权限;

前面两点需要您自己保证已达到要求,第三和第四点现在先不必关心,后面有详细的步骤来完成;

实战环境信息

本次实战的环境如下图所示,一套kubernetes环境(版本是1.15.3),另外还有一台CentOS7电脑,上面已部署了flink-1.10(这里的部署是说把安装包解压,不启动任何服务):
在这里插入图片描述
准备完毕,开始实战了~

实战内容简介

本次实战是在kubernetes环境创建一个session cluster,然后提交任务到这个sessionc cluster运行,与官方教程不同的是本次实战使用自定义namespace和service account,毕竟生产环境一般是不允许使用default作为namespace和service account的;

实战

  1. 在CetnOS7电脑上操作时使用的是root账号;
  2. 在kubernetes的节点上,确保有权执行kubectl命令对pod和service进行增删改查,将文件~/.kube/config复制到CentOS7电脑的~/.kube/目录下;
  3. 在kubernetes的节点上,执行以下命令创建名为flink-session-cluster的namespace:
kubectl create namespace flink-session-cluster
  1. 执行以下命令创建名为flink的serviceaccount:
kubectl create serviceaccount flink -n flink-session-cluster
  1. 执行以下命令做serviceaccount和角色的绑定:
kubectl create clusterrolebinding flink-role-binding-flink \
  --clusterrole=edit \
  --serviceaccount=flink-session-cluster:flink
  1. SSH登录部署了flink的CentOS7电脑,在flink目录下执行以下命令,即可创建名为session001的session cluster,其中-Dkubernetes.namespace参数指定了namespace,另外还指定了一个TaskManager实例使用一个CPU资源、4G内存、内含6个slot:
./bin/kubernetes-session.sh \
  -Dkubernetes.namespace=flink-session-cluster \
  -Dkubernetes.jobmanager.service-account=flink \
  -Dkubernetes.cluster-id=session001 \
  -Dtaskmanager.memory.process.size=8192m \
  -Dkubernetes.taskmanager.cpu=1 \
  -Dtaskmanager.numberOfTaskSlots=4 \
  -Dresourcemanager.taskmanager-timeout=3600000
  1. 如下图,控制台提示创建成功,并且红框中提示了flink web UI的访问地址是http://192.168.50.135:31753
    在这里插入图片描述
  2. 下载镜像和启动容器需要一定的时间,可以用kubectl getkubectl describe命令观察对应的deployment和pod的状态:

Flink Native Kubernetes实战
9. pod启动成功后访问flink web,如下图,此时还没有创建TaskManager,因此Slot为零:
在这里插入图片描述
10. 回到CentOS7电脑,在flink目录下执行以下命令,将官方自带的WindowJoin任务提交到session cluster:

./bin/flink run -d \
  -e kubernetes-session \
  -Dkubernetes.namespace=flink-session-cluster \
  -Dkubernetes.cluster-id=session001 \
  examples/streaming/WindowJoin.jar
  1. 控制台提示提交任务成功:
    在这里插入图片描述
  2. 页面上也会同步显示增加了一个TaskManager,对应6个slot,已经用掉了一个:
    在这里插入图片描述
  3. 再连续提交5次相同的任务,将此TaskManager的slot用光:
    在这里插入图片描述
  4. 这时候再提交一次任务,按理来说应该增加一个TaskManager,可是页面如下图所示,TaskManager数量还是1,并没有增加,并且红框中显示新增的任务并没有正常运行起来:

在这里插入图片描述
15. 在kubernetes环境查看pod情况,如下图红框所示,有个新建的pod状态是Pending,看来这就是第七个任务不能执行就是因为这个新建的pod无法正常工作导致的:
在这里插入图片描述
16. 再看看这个namespace的事件通知,如下图红框所示,名为session001-taskmanager-1-2的pod有一条通知信息:由于CPU资源不足导致pod创建失败
在这里插入图片描述
17. 穷到没钱配置kubernetes环境,连一核CPU都凑不齐:

在这里插入图片描述
18. 一时半会儿也找不出多余的CPU资源,唯一能做的就是降低TaskManager的CPU要求,刚才配置的是一个TaskManager使用一核CPU,我打算降低一半,即0.5核,这样就够两个TaskManager用了;
19. 您可能会疑惑:怎么会有0.5个CPU这样的配置?这个和kubernetes的资源限制有关,kubernetes对pod的CPU限制粒度是千分之一个CPU,也是就是在kubernetes中,配置1000单位的CPU表示使用1核,我们配置0.5核,不过是配置了500单位而已(所以我还可以更穷….)
20. 接下来的操作是先停掉当前的session cluster,再重新创建一个,创建的时候参数-Dkubernetes.taskmanager.cpu的值从1改为0.5
21. 在CentOS7电脑上执行以下命令,将session cluster停掉,释放所有资源:

echo 'stop' | \
  ./bin/kubernetes-session.sh \
  -Dkubernetes.namespace=flink-session-cluster \
  -Dkubernetes.cluster-id=session001 \
  -Dexecution.attached=true
  1. 控制台提示操作成功:
    在这里插入图片描述
  2. 稍等一分钟左右,再去查看pod,发现已经全部不见了:
    在这里插入图片描述
  3. 在CentOS7电脑的flink目录下,执行以下命令,和之前相比,唯一变化就是-Dkubernetes.taskmanager.cpu参数的值:
./bin/kubernetes-session.sh \
  -Dkubernetes.namespace=flink-session-cluster \
  -Dkubernetes.jobmanager.service-account=flink \
  -Dkubernetes.cluster-id=session001 \
  -Dtaskmanager.memory.process.size=4096m \
  -Dkubernetes.taskmanager.cpu=0.5 \
  -Dtaskmanager.numberOfTaskSlots=6 \
  -Dresourcemanager.taskmanager-timeout=3600000
  1. 从控制台提示得到新的flink web UI端口值,再访问网页,发现启动成功了:
    在这里插入图片描述
  2. 像之前那样提交任务,连续提交7个,这一次很顺利,在提交了第七个任务后,新的TaskManager创建成功,7个任务都成功执行了:
    在这里插入图片描述
  3. kubectl describe pod命令查看TaskManager的pod,如下图红框所示,可见该pod的CPU用量是500单位,符合之前的推测:
    在这里插入图片描述
    这里再提醒一下,降低CPU用量,意味着该pod中的进程获取的CPU执行时间被降低,会导致任务执行变慢,所以这种方法不可取,正确的思路是确保硬件资源能满足业务需求(像我这样穷到一核CPU都凑不齐的情况还是不多的….)

清理资源

如果已完成Flink Native Kubernetes体验,想彻底清理掉前面的所有资源,请按照以下步骤操作:

  1. 在web页面点击Cancel Job停止正在运行的任务,如下图红框:
    在这里插入图片描述
  2. 在CentOS7电脑上停止session cluster:
echo 'stop' | \
  ./bin/kubernetes-session.sh \
  -Dkubernetes.namespace=flink-session-cluster \
  -Dkubernetes.cluster-id=session001 \
  -Dexecution.attached=true
  1. 在kubernetes节点清理service、clusterrolebinding、serviceaccount、namespace:
kubectl delete service session001 -n flink-session-cluster
kubectl delete clusterrolebinding flink-role-binding-flink
kubectl delete serviceaccount flink -n flink-session-cluster
kubectl delete namespace flink-session-cluster
  1. 所有cluster session相关的ConfigMap、Service、Deployment、Pod等资源,都通过kubernetes的ownerReferences配置与service关联,因此一旦service被删除,其他资源被被自动清理掉,无需处理;

至此,Flink Native Kubernetes相关的实战就完成了,如果您也在关注这个技术,希望本文能给您一些参考

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界…
https://github.com/zq2599/blog_demos

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2624.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 体验国产Linux系统,开局就翻车了…

    体验国产Linux系统,开局就翻车了…本文转载自差评,作者差评君可能你们之前在网上看到过别人对Linux操作系统的分析,也在新闻里见过有关国产Linux操作系统的报道。那么你们肯定也见过这些帖子下面的评论区里,不断有人复述着“垃圾”、“难用”。被称作“最美操作系统”的深度OS▼我相信,很多小伙伴是想尝试一下国产Linux操作系统的,但碍于现实条件往往只能作罢。所以,Linux真的难用吗;假如说从明天开始,Windows和苹果MacOS突然不能用了,Linux…

    2022年5月17日
    61
  • java 中几种常用数据结构「建议收藏」

    java 中几种常用数据结构「建议收藏」Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。一、几个常用类的区别 1.ArrayList:元素单个,效率高,多用于查询 2.Vector:元素单个,线程安全,多用于查询 3.LinkedList:元素单个,多用于插入和删除 4.H

    2022年7月8日
    22
  • 芯片开发工程师_如何成为芯片架构师

    芯片开发工程师_如何成为芯片架构师数字IC设计师/前端设计工程师/芯片架构师架构师和领域相关性较强,依赖于历史经验。网络芯片的架构师,你让他去做AI加速,可能也没办法一下子拿出成果来。芯片工程师年薪百万是极限,项目负责人和架构师可以拿到千万。IC设计又分为两个方向:数字和模拟数字方向通常包含四个岗位:前端设计,设计验证,DFT,后端。模拟可以分为两个大方向:模拟设计和模拟版图。在数字设计中,还有一个岗位是架构设计,这个职位对从业者的要求比较高,要么是博士毕业,要么是具有丰厚经验的前端设计工程师(15year

    2025年9月30日
    6
  • NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用…

    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用…

    2021年8月23日
    76
  • PHP递归算法_php递归函数详解

    PHP递归算法_php递归函数详解先设置数据在本地数据库,设置前要先了解pid字段的关系。如果做成菜单还需添加一个路由字段,自行定义。第一种方式先将数据提取出转换成数组。重点是Yarray方法里的递归方式。接下来进行解析方式。重点:一定要在进行递归之前声明一个静态数组,不然会导致数组覆盖。剩下的就是注释的内容也就是判断父节点与节点来判断等级。这步指来回方法调用本身进行处理递归。最后数据会变成其中关系为pid数值存在与id下的下级关系,level为处于第几级;我们来输出一下看看结.

    2022年8月11日
    10
  • pycharm 激活码在线[最新免费获取]

    (pycharm 激活码在线)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号