Flink Native Kubernetes实战

高斋晓开卷,独共圣人语。这篇文章主要讲述Flink Native Kubernetes实战相关的知识,希望能为你提供帮助。
欢迎访问我的GitHub

  • 尽管还没有进入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(这里的部署是说把安装包解压,不启动任何服务):
    Flink Native Kubernetes实战

    文章图片
  • 准备完毕,开始实战了~ 实战内容简介
  • 本次实战是在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

    4. 执行以下命令创建名为==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

  2. 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

  3. 如下图,控制台提示创建成功,并且红框中提示了flink web UI的访问地址是==http://192.168.50.135:31753==:
    Flink Native Kubernetes实战

    文章图片
  4. 下载镜像和启动容器需要一定的时间,可以用==kubectl get==和==kubectl describe==命令观察对应的deployment和pod的状态:
Flink Native Kubernetes实战

文章图片

  1. pod启动成功后访问flink web,如下图,此时还没有创建TaskManager,因此Slot为零:
    Flink Native Kubernetes实战

    文章图片
  2. 回到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

  3. 控制台提示提交任务成功:
    Flink Native Kubernetes实战

    文章图片
  4. 页面上也会同步显示增加了一个TaskManager,对应6个slot,已经用掉了一个:
    Flink Native Kubernetes实战

    文章图片
  5. 再连续提交5次相同的任务,将此TaskManager的slot用光:
    Flink Native Kubernetes实战

    文章图片
  6. 这时候再提交一次任务,按理来说应该增加一个TaskManager,可是页面如下图所示,TaskManager数量还是1,并没有增加,并且红框中显示新增的任务并没有正常运行起来:
    Flink Native Kubernetes实战

    文章图片
  7. 在kubernetes环境查看pod情况,如下图红框所示,有个新建的pod状态是Pending,看来这就是第七个任务不能执行就是因为这个新建的pod无法正常工作导致的:
    Flink Native Kubernetes实战

    文章图片
  8. 再看看这个namespace的事件通知,如下图红框所示,名为session001-taskmanager-1-2的pod有一条通知信息:==由于CPU资源不足导致pod创建失败==:
    Flink Native Kubernetes实战

    文章图片
  9. 穷到没钱配置kubernetes环境,连一核CPU都凑不齐:
    Flink Native Kubernetes实战

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

  14. 控制台提示操作成功:
    Flink Native Kubernetes实战

    文章图片
  15. 稍等一分钟左右,再去查看pod,发现已经全部不见了:
    Flink Native Kubernetes实战

    文章图片
  16. 在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

  17. 从控制台提示得到新的flink web UI端口值,再访问网页,发现启动成功了:
    Flink Native Kubernetes实战

    文章图片
  18. 像之前那样提交任务,连续提交7个,这一次很顺利,在提交了第七个任务后,新的TaskManager创建成功,7个任务都成功执行了:
    Flink Native Kubernetes实战

    文章图片
  19. 用==kubectl describe pod==命令查看TaskManager的pod,如下图红框所示,可见该pod的CPU用量是==500单位==,符合之前的推测:
    Flink Native Kubernetes实战

    文章图片
    • 这里再提醒一下,降低CPU用量,意味着该pod中的进程获取的CPU执行时间被降低,会导致任务执行变慢,所以这种方法不可取,正确的思路是确保硬件资源能满足业务需求(像我这样穷到一核CPU都凑不齐的情况还是不多的....) 清理资源
    • 如果已完成Flink Native Kubernetes体验,想彻底清理掉前面的所有资源,请按照以下步骤操作:
  20. 在web页面点击Cancel Job停止正在运行的任务,如下图红框:
    Flink Native Kubernetes实战

    文章图片
  21. 在CentOS7电脑上停止session cluster:
    echo stop | \\ ./bin/kubernetes-session.sh \\ -Dkubernetes.namespace=flink-session-cluster \\ -Dkubernetes.cluster-id=session001 \\ -Dexecution.attached=true

  22. 【Flink Native Kubernetes实战】在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

  23. 所有cluster session相关的ConfigMap、Service、Deployment、Pod等资源,都通过kubernetes的==ownerReferences==配置与service关联,因此一旦service被删除,其他资源被被自动清理掉,无需处理;
  • 至此,Flink Native Kubernetes相关的实战就完成了,如果您也在关注这个技术,希望本文能给您一些参考。
欢迎关注51CTO博客:程序员欣宸

    推荐阅读