flink的k8s之路

发布 : 2019-04-29 分类 : 运维 浏览 :

flink的k8s之路

前言

Apache Flink(以下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注。由于helm没有出官方的chart包,那么只能是自己动手、丰衣足食了。

考虑点

一个java中间件要上paas平台(k8s)从头到尾需这么几步: source—–>二进制包(编译) —–>docker镜像(Dockerfile)——>chart包(helm执行).那么们可以锊锊有哪些?哪些要从0开始?哪些跟据已有资源进行修改而得。

  1. source—–>二进制包(编译) :这一步显然没有必要,使用官网已编译的二进制包即可。
  2. 二进制包(编译) —–>docker镜像(Dockerfile):这个官网已出镜像https://hub.docker.com/_/flink,这个不错,但有没有定制的需求?比如日志?配置中心?自定义的算子?还有就是JVM里内存在k8s管理缺陷?时区?小版本修复后要等官网封完image才能用?综上考虑,我们选择了基于官网的flink的Dockfile自定义自己专用的image镜像
  3. docker镜像(Dockerfile)——>chart包(helm执行):这个helm并没有提供官方的chart包,但有热心人提供了一个chart镜像https://github.com/docker-flink/examples,这个chart还被flink的官方推荐:,但上去一看,文件修改时间最短的也是1年前,能用吗?进去一看,是挺简陋的,做个demo可以,但用于生产还是有很多地方考虑不周的。所以,我们选择基于此版本加固。

    docker镜像封装

    基础镜像选择

    官网镜像1.8版本提供了scala_2.11-alpine、scala_2.11-debian、scala_2.12-alpine、scala_2.12-debian四个版本,我们是新上flink没有历史包袱,选新不选旧原则,选择scala_2.12版本,至于操作系统我选 alpine,什么原因?无它,手熟尔。alpine是中间件的docker镜像的常客,基乎所有中间件的官方镜像都有它的身影。下面我抄了段来说明:

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件

理解基础镜像

基础版本的Dockfile选好了:scala_2.12-alpine ,打开这个Dockerfile文件,只有2个文件:docker-entrypoint.sh和Dockerfile,先理解一下,先设置了一堆环境变量,然后去官网上下载flink-1.8.0-bin-scala_2.12.tgz包和它的检验文件.asc。然后是一解压、清理、赋权限、交给入口文件docker-entrypoint.sh去执行。docker-entrypoint.sh又做了些什么呢?一堆的配置无非是检查配置文件的必填项,如果有相关环境变量就去覆盖它。我又不想改它,可以不理,但需要注意的是:它实现了使用flink用户(非root)来启动flink进程,这点很重要,在docker里使用root用户来启动项目是危险的。2018年阿里云就因这此出现过大问题。总的看来,与ES的docker镜像如出一辙,有兴趣的同学可以去github下es的Dockerfile来看看。

需要加强和定制点

看完基础版本的Dockfile,我能大概列出我需要对它加强的功能:

  1. k8s的limit内存坑:在非k8s上,docker以主机的内存为最大内存,这样跑并没有什么问题,那么在k8s上呢?在k8s上pod的内存有limit参数限制,但jvm并不知道在pod中,以为在主机中,所以它会一直增长,到了超过limit限制时,k8s会把这个JVM干掉,整个pod被重启。可以参考:https://my.oschina.net/shisuyun/blog/871514
  2. jre改为jdk 。jdk有很多问题定位工具,为了以后查问题方便。牺牲点存储是值得的。
  3. 安装curl,telnet等小工具。一切为了查问题啊。
  4. 时区设置:默认是美国时区,我们需要改为默认中国时区,当然需要做成可配置的形式了。
  5. checkpoint持久化目录:地jobmanager里需要存放checkpoint、savepoint、用户上传的可执行包等,在Dockerfile里并没有为它们独立开目录,我认为程序与数据的隔离是必须的,后面程序升级较为方便,如果使用k8s,那么数据目录是会挂载分布式文件系统的。
  6. k8s挂载目录的初始化:上面我们说了,我们需要另加数据目录做为挂载点,但是在k8s里,目录被挂载后,它的权限是root的,由于我们的主进程是用flink用户来启动flink进程的,那么启动后我们的数据目录就会把没有权限错误,那么我们有必要在目录挂载后、flink启动程序前把数据目录的归属为flink用户。这个时间点非常重要,我锊了下所有的k8s的pos启动时机,也只有docker-entrypoint.sh文件最合适。

    chart包的定制

    由于docker镜像考虑了很多的问题,chart包的封装稍微容易点,便也有一些要点是我们不得不考虑的。
  7. 公司kafka等集群需要配置 hostname,需要把hostname实现在value文件里参数化配置
  8. 用户上传的jar包在jobmanager重启后丢失问题,flink默认是放在临时文件夹里,需要修改配置
  9. checkpoint/savepoint的分布式存储问题:由于jobmanager的pod可能会被重启,不能落在本机上,需要一个分布式存储来存放。
  10. binlog监听专用 source(自已开发的)需要存放h2DB内嵌数据库文件,它在做checkpoint时需要里面的列名信息,也需要一个分布式存储来存放。
  11. hadoop配置的可选化配置:原始的chart这东西是必填,不填就会启动出错,但我们公司并没有使用hadoop。把它变为可选配置,默认为不选。
    ##总结
    一个中间件想要上paas平台真心不容易,即要熟悉docker也要熟悉k8s,更是对这个中间件的本身需要有一定程度的了解。上面我提及的也仅是部分问题点,等flink能在生产环境上跑起来,并且跑那么几个项目实战后,我们才能说它是完善的。
本文作者 : andy.zhou
原文链接 : https://rjzjh.gitee.io/2019/04/29/flink-k8s/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹