Flink on K8s 部署

作者: AlienPaul | 来源:发表于2020-02-18 13:42 被阅读0次

    简介

    本篇博客为大家讲解下如何在Kubernetes集群部署Flink standalone集群。

    准备材料

    Flink镜像

    首先需要制作一个Flink镜像,具体方法请看Flink in docker 部署

    Flink conf文件

    下载Flink的二进制软件包,解压其中的conf目录到任意目录即可。

    配置K8s资源对象

    创建ConfigMap

    首先修改conf/flink-conf.yaml,修改jobmanager.rpc.address,如下所示:

    jobmanager.rpc.address: flink-jm-rpc-service
    

    其中flink-jm-rpc-service为后续需要创建的service名称。这个service创建之后,k8s会为我们创建一个同名的DNS条目。我们使用这条DNS可以访问到Flink的job manager。

    接下来执行这条命令,将conf目录下所有文件内容创建为一个config map,名字为flink-config

    kubectl create configmap flink-config --from-file=./conf
    

    创建Job manager和Task manager的deployment

    Job manager的Deployment如下所示。需要注意的是这里replica设置为1,flink-conf的内容作为数据卷,挂载到/flink-1.9.2/conf

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: flink-jobmanager
      labels:
        app: flink
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: flink
          role: jobmanager
      template:
        metadata:
          labels:
            app: flink
            role: jobmanager
        spec:
          containers:
          - name: flink
            image: paul8263/flink-1.9.2:1.9.2
            args: ["jobmanager"]
            ports:
            - name: web-port
              containerPort: 8081
            volumeMounts:
            - name: flink-config-volume
              mountPath: /flink-1.9.2/conf
          volumes:
            - name: flink-config-volume
              configMap:
                name: flink-config
    

    同理,下面是Task manager的Deployment。这里我们设定replica为3,即启动3个task manager。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: flink-taskmanager
      labels:
        app: flink
        role: taskmanager
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: flink
      template:
        metadata:
          labels:
            app: flink
        spec:
          containers:
          - name: flink
            image: paul8263/flink-1.9.2:1.9.2
            args: ["taskmanager"]
            ports:
            - name: web-port
              containerPort: 8081
            volumeMounts:
            - name: flink-config-volume
              mountPath: /flink-1.9.2/conf
          volumes:
            - name: flink-config-volume
              configMap:
                name: flink-config
    

    完成yaml文件的编写之后使用如下命令:

    kubectl apply -f 文件名.yaml
    

    创建出这两个Deployment。

    创建Job Manager RPC service

    目前需要解决的是Task manager如何找到job manager。Job manager的pod会被k8s调度到任意的节点,这个结果是不可控的。因此,我们需要创建一个service,指向job manager这个pod。Kubenetes会自动创建一个DNS入口。这样一来,无论job manager调度到哪个节点上,它的IP如何变化,k8s自动帮我们更新,并通过DNS关联起来。我们的程序不用做任何修改。

    下面编写这个service的描述文件,如下所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: flink-jm-rpc-service
    spec:
      clusterIP: None
      selector:
        role: jobmanager
      ports:
        - protocol: TCP
          port: 6123
          targetPort: 6123
    

    创建这个service之后,无论这个pod的IP怎么变化,我们可以通过flink-jm-rpc-service这个DNS访问到job manager。

    暴露Flink web端口到集群外

    到目前为止,Flink集群实际上已经部署完毕,但是Flink的web界面只能在集群的容器内部访问,我们需要将这个端口暴露到集群外部。

    该service的描述文件如下所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: flink-web-service
    spec:
      selector:
        app: flink
      type: NodePort
      ports:
        - protocol: TCP
          port: 8081
          targetPort: 8081
          nodePort: 30123
    

    需要注意的是这个service使用了NodePort的方式,将service的8081端口暴露为节点的30123端口。

    验证配置

    执行kubectl get all查看创建出的所有资源对象,可以看到类似如下的输出:

    NAME                                     READY   STATUS    RESTARTS   AGE
    pod/flink-jobmanager-6db8bb4999-hsblq    1/1     Running   0          155m
    pod/flink-taskmanager-795bfc5fdc-bdlc4   1/1     Running   2          153m
    pod/flink-taskmanager-795bfc5fdc-mkp7q   1/1     Running   2          153m
    pod/flink-taskmanager-795bfc5fdc-z42pr   1/1     Running   2          153m
    
    
    NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    service/flink-jm-rpc-service   ClusterIP   None           <none>        6123/TCP         3h12m
    service/flink-web-service      NodePort    10.101.29.26   <none>        8081:30123/TCP   3h9m
    service/kubernetes             ClusterIP   10.96.0.1      <none>        443/TCP          12h
    
    
    NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/flink-jobmanager    1/1     1            1           155m
    deployment.apps/flink-taskmanager   3/3     3            3           153m
    
    NAME                                           DESIRED   CURRENT   READY   AGE
    replicaset.apps/flink-jobmanager-6db8bb4999    1         1         1       155m
    replicaset.apps/flink-taskmanager-795bfc5fdc   3         3         3       153m
    

    然后我们在浏览器访问k8s节点的30123端口,然后查看所有的Task manager。如下图所示:

    Flink管理页面Task Managers列表

    Task manager的个数和状态均正常,Flink on Kubernetes部署完毕。

    相关文章

      网友评论

        本文标题:Flink on K8s 部署

        本文链接:https://www.haomeiwen.com/subject/hulgfhtx.html