Flink Native Kubernetes实战
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
回顾Flink Kubernetes
<font color="blue">Flink Kubernetes</font>与<font color="blue">Flink Native Kubernetes</font>是不同的概览,先回顾一下Flink Kubernetes:
- 如下图,从1.2版本到目前最新的1.10,Flink官方都给出了Kubernetes上部署和运行Flink的方案:
- 在kubernetes上有两种方式运行flink:<font color="blue">session cluster</font>和<font color="blue">job cluster</font>,其中session cluster是一套服务可以提交多个任务,而job cluster则是一套服务只对应一个任务;
- 下图是典型的session cluster部署操作,可见关键是准备好service、deployment等资源的yaml文件,再用kubectl命令创建:
关于Flink Native Kubernetes
- 先对比官方的1.9和1.10版本文档,如下图和红框和蓝框所示,可见<font color="blue">Flink Native Kubernetes</font>是1.10版本才有的新功能:
- 看看Native Kubernetes是如何运行的,如下图,创建session cluster的命令来自Flink安装包:
- 更有趣的是,提交任务的命令也来自Flink安装包,就是我们平时提交任务用到<font color="blue">flink run</font>命令,如下图:
- 结合官方给出的提交和部署流程图就更清晰了:kubernetes上部署了Flink Master,由Flink Client来提交session cluster和job的请求:
Flink Kubernetes和Flink Native Kubernetes的区别
至此,可以小结Flink Kubernetes和Flink Native Kubernetes的区别:
- <font color="blue">Flink Kubernetes</font>自1.2版本首次出现,<font color="red">Flink Native Kubernetes</font>自1.10版本首次出现;
- <font color="blue">Flink Kubernetes</font>是把JobManager和TaskManager等进程放入容器,在kubernetes管理和运行,这和我们把java应用做成docker镜像再在kubernetes运行是一个道理,都是用kubectl在kubernetes上操作;
- <font color="red">Flink Native Kubernetes</font>是在Flink安装包中有个工具,此工具可以向kubernetes的Api Server发送请求,例如创建Flink Master,并且可以和Flink Master通讯,用于提交任务,我们只要用好Flink安装包中的工具即可,无需在kubernetes上执行kubectl操作;
Flink Native Kubernetes在Flink-1.10版本中的不足之处
- Flink Native Kubernetes只是Beta版,属于实验性质(官方原话:still experimental),<font color="red">请勿用于生产环境!</font>
- 只支持session cluster模式(一个常驻session执行多个任务),还不支持Job clusters模式(一个任务对应一个session)
尽管还没有进入Release阶段,但这种操作模式对不熟悉kubernetes的开发者来说还是很友好的,接下来通过实战来体验吧;
官方要求
为了体验Native Kubernetes,flink官方提出了下列前提条件:
- kubernetes版本不低于<font color="blue">1.9</font>
- kubernetes环境的DNS是正常的
- KubeConfig文件,并且这个文件是有权对pod和service资源做增删改查的(kubectl命令有权对pod和service做操作,也是因为它使用了对应的KubeConfig文件),这个文件一般在kubernetes环境上,全路径:<font color="blue">~/.kube/config</font>
- 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的;
实战
- 在CetnOS7电脑上操作时使用的是root账号;
- 在kubernetes的节点上,确保有权执行kubectl命令对pod和service进行增删改查,将文件<font color="blue">~/.kube/config</font>复制到CentOS7电脑的<font color="blue">~/.kube/</font>目录下;
- 在kubernetes的节点上,执行以下命令创建名为<font color="blue">flink-session-cluster</font>的namespace:
kubectl create namespace flink-session-cluster
- 执行以下命令创建名为<font color="blue">flink</font>的serviceaccount:
kubectl create serviceaccount flink -n flink-session-cluster
- 执行以下命令做serviceaccount和角色的绑定:
kubectl create clusterrolebinding flink-role-binding-flink \ --clusterrole=edit \ --serviceaccount=flink-session-cluster:flink
- SSH登录部署了flink的CentOS7电脑,在flink目录下执行以下命令,即可创建名为<font color="blue">session001</font>的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
- 如下图,控制台提示创建成功,并且红框中提示了flink web UI的访问地址是<font color="blue">http://192.168.50.135:31753</font>:
- 下载镜像和启动容器需要一定的时间,可以用<font color="blue">kubectl get</font>和<font color="blue">kubectl describe</font>命令观察对应的deployment和pod的状态:
9. pod启动成功后访问flink web,如下图,此时还没有创建TaskManager,因此Slot为零:
10. 回到CentOS7电脑,在flink目录下执行以下命令,将官方自带的<font color="blue">WindowJoin</font>任务提交到session cluster:
./bin/flink run -d \ -e kubernetes-session \ -Dkubernetes.namespace=flink-session-cluster \ -Dkubernetes.cluster-id=session001 \ examples/streaming/WindowJoin.jar
- 控制台提示提交任务成功:
- 页面上也会同步显示增加了一个TaskManager,对应6个slot,已经用掉了一个:
- 再连续提交5次相同的任务,将此TaskManager的slot用光:
- 这时候再提交一次任务,按理来说应该增加一个TaskManager,可是页面如下图所示,TaskManager数量还是1,并没有增加,并且红框中显示新增的任务并没有正常运行起来:
15. 在kubernetes环境查看pod情况,如下图红框所示,有个新建的pod状态是Pending,看来这就是第七个任务不能执行就是因为这个新建的pod无法正常工作导致的:
16. 再看看这个namespace的事件通知,如下图红框所示,名为session001-taskmanager-1-2的pod有一条通知信息:<font color="blue">由于CPU资源不足导致pod创建失败</font>:
17. 穷到没钱配置kubernetes环境,连一核CPU都凑不齐:
18. 一时半会儿也找不出多余的CPU资源,唯一能做的就是降低TaskManager的CPU要求,刚才配置的是一个TaskManager使用一核CPU,我打算降低一半,即<font color="red">0.5核</font>,这样就够两个TaskManager用了; 19. 您可能会疑惑:怎么会有0.5个CPU这样的配置?这个和kubernetes的资源限制有关,kubernetes对pod的CPU限制粒度是千分之一个CPU,也是就是在kubernetes中,配置1000单位的CPU表示使用1核,我们配置0.5核,不过是配置了500单位而已(所以我还可以更穷....) 20. 接下来的操作是先停掉当前的session cluster,再重新创建一个,创建的时候参数<font color="blue">-Dkubernetes.taskmanager.cpu</font>的值从1改为<font color="red">0.5</font> 21. 在CentOS7电脑上执行以下命令,将session cluster停掉,释放所有资源:
echo 'stop' | \ ./bin/kubernetes-session.sh \ -Dkubernetes.namespace=flink-session-cluster \ -Dkubernetes.cluster-id=session001 \ -Dexecution.attached=true
- 控制台提示操作成功:
- 稍等一分钟左右,再去查看pod,发现已经全部不见了:
- 在CentOS7电脑的flink目录下,执行以下命令,和之前相比,唯一变化就是<font color="blue">-Dkubernetes.taskmanager.cpu</font>参数的值:
./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
- 从控制台提示得到新的flink web UI端口值,再访问网页,发现启动成功了:
- 像之前那样提交任务,连续提交7个,这一次很顺利,在提交了第七个任务后,新的TaskManager创建成功,7个任务都成功执行了:
- 用<font color="blue">kubectl describe pod</font>命令查看TaskManager的pod,如下图红框所示,可见该pod的CPU用量是<font color="red">500单位</font>,符合之前的推测:
这里再提醒一下,降低CPU用量,意味着该pod中的进程获取的CPU执行时间被降低,会导致任务执行变慢,所以这种方法不可取,正确的思路是确保硬件资源能满足业务需求(像我这样穷到一核CPU都凑不齐的情况还是不多的....)
清理资源
如果已完成Flink Native Kubernetes体验,想彻底清理掉前面的所有资源,请按照以下步骤操作:
- 在web页面点击Cancel Job停止正在运行的任务,如下图红框:
- 在CentOS7电脑上停止session cluster:
echo 'stop' | \ ./bin/kubernetes-session.sh \ -Dkubernetes.namespace=flink-session-cluster \ -Dkubernetes.cluster-id=session001 \ -Dexecution.attached=true
- 在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
- 所有cluster session相关的ConfigMap、Service、Deployment、Pod等资源,都通过kubernetes的<font color="blue">ownerReferences</font>配置与service关联,因此一旦service被删除,其他资源被被自动清理掉,无需处理;
至此,Flink Native Kubernetes相关的实战就完成了,如果您也在关注这个技术,希望本文能给您一些参考
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界... https://github.com/zq2599/blog_demos

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深度揭秘垃圾回收底层,这次让你彻底弄懂她
大家好,我是 yes。 我们知道手动管理内存意味着自由、精细化地掌控,但是却极度依赖于开发人员的水平和细心程度。 如果使用完了忘记释放内存空间就会发生内存泄露,再如释放错了内存空间或者使用了悬垂指针则会发生无法预知的问题。 这时候 Java 带着 GC 来了(GC,Garbage Collection 垃圾收集,早于 Java 提出),将内存的管理交给 GC 来做,减轻了程序员编程的负担,提升了开发效率。 所以并不是用 Java 就不需要内存管理了,只是因为 GC 在替我们负重前行。 但是 GC 并不是那么万能的,不同场景适用不同的 GC 算法,需要设置不同的参数,所以我们不能就这样撒手不管了,只有深入地理解它才能用好它。 关于 GC 内容相信很多人都有所了解。我最早得知有关 GC 的知识是来自《深入理解Java虚拟机》,但是有关 GC 的内容单看这本书是不够的。 当时我以为我懂很多了,后来经过了一番教育之后才知道啥叫无知者无畏。 而且过了一段时间很多有关 GC 的内容都说不上来了,其实也有很多同学反映有些知识学了就忘,有些内容当时是理解的,过一段时间啥都不记得了。 大部分情况是因为这...
- 下一篇
go-zero框架之rest初探
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务创建 go-zero中创建http服务非常简单,官方推荐使用goctl工具来生成。为了方便演示,这里通过手动创建服务,代码如下 package main import ( "log" "net/http" "github.com/tal-tech/go-zero/core/logx" "github.com/tal-tech/go-zero/core/service" "github.com/tal-tech/go-zero/rest" "github.com/tal-tech/go-zero/rest/httpx" ) func main() { srv, err := rest.NewServer(rest.RestConf{ Port: 9090, // 侦听端口 ServiceConf: service.ServiceConf{ Log: logx.LogConf{Path: "....
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群