制作flink镜像

创建一个目录,用来存放Dockerfile文件及需要的tar包

  1. mkdir /home/lonton/docker/dockerfile/flink
  2. #将flink-1.10.0.tar.gz放在目录下
  3. mv flink-1.10.0.tar.gz /home/lonton/docker/dockerfile/flink

Flink的job manager和task manager使用的是同一套配置文件和代码,他们可以使用同一个镜像。启动不同的进程只需要传递不同的启动命令。接下来我们需要为Flink镜像编写一个入口文件。
run.sh:

  1. #!/bin/bash
  2. FLINK_JOB_MANAGER_SH=$FLINK_HOME/bin/jobmanager.sh
  3. FLINK_TASK_MANAGER_SH=$FLINK_HOME/bin/taskmanager.sh
  4. case "$1" in
  5. "jobmanager")
  6. $FLINK_JOB_MANAGER_SH start-foreground
  7. ;;
  8. "taskmanager")
  9. $FLINK_TASK_MANAGER_SH start-foreground
  10. ;;
  11. *)
  12. echo "COMMAND ERROR"
  13. ;;
  14. esac

编写Dockerfile

  1. FROM jdk:alpine
  2. MAINTAINER lbz
  3. RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g" /etc/apk/repositories
  4. RUN apk update && apk upgrade
  5. RUN apk add openssh vim openrc bash bash-doc bash-completion --no-cache
  6. RUN sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config
  7. ADD flink-1.10.0.tar.gz /opt
  8. ENV FLINK_HOME /opt/flink-1.10.0
  9. COPY run.sh /root/
  10. RUN chmod +x /root/run.sh
  11. EXPOSE 8088
  12. VOLUME $FLINK_HOME/conf
  13. ENTRYPOINT ["/root/run.sh"]

基础镜像用的是我自己写的jdk

构造镜像
将run.sh、Dockerfile都放到flink目录下

  1. docker build -t flink:alpine --squash .
  2. #给镜像打标签
  3. docker tag flink:alpine 192.168.0.16:5000/flink:dev
  4. #把镜像push到私仓
  5. docker push 192.168.0.16:5000/flink:dev

部署flink

Flink conf文件

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

配置k8s资源对象

创建configmap
首先修改conf/flink-conf.yaml,修改jobmanager.rpc.address

  1. $ vi flink-conf.yaml
  2. jobmanager.rpc.address: flink-jm-rpc-service

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

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

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

创建Job Manager RPC service
我们需要创建一个service,指向job manager这个pod。Kubenetes会自动创建一个DNS入口。这样一来,无论job manager调度到哪个节点上,它的IP如何变化,k8s自动帮我们更新,并通过DNS关联起来。我们的程序不用做任何修改。
flink-svc.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: flink-jm-rpc-service
  5. spec:
  6. clusterIP: None
  7. selector:
  8. role: jobmanager
  9. ports:
  10. - protocol: TCP
  11. port: 6123
  12. targetPort: 6123

创建Job manager和Task manager的deployment
flink-jm.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: flink-jobmanager
  5. labels:
  6. app: flink
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: flink
  12. role: jobmanager
  13. template:
  14. metadata:
  15. labels:
  16. app: flink
  17. role: jobmanager
  18. spec:
  19. containers:
  20. - name: flink
  21. image: 192.168.0.16:5000/flink:dev
  22. args: ["jobmanager"]
  23. ports:
  24. - name: web-port
  25. containerPort: 8081
  26. volumeMounts:
  27. - name: flink-config-volume
  28. mountPath: /opt/flink-1.10.0/conf
  29. volumes:
  30. - name: flink-config-volume
  31. configMap:
  32. name: flink-config

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

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: flink-taskmanager
  5. labels:
  6. app: flink
  7. role: taskmanager
  8. spec:
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. app: flink
  13. template:
  14. metadata:
  15. labels:
  16. app: flink
  17. spec:
  18. containers:
  19. - name: flink
  20. image: 192.168.0.16:5000/flink:dev
  21. args: ["taskmanager"]
  22. ports:
  23. - name: web-port
  24. containerPort: 8081
  25. volumeMounts:
  26. - name: flink-config-volume
  27. mountPath: /opt/flink-1.10.0/conf
  28. volumes:
  29. - name: flink-config-volume
  30. configMap:
  31. name: flink-config

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

uisvc.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: flink-web-service
  5. spec:
  6. selector:
  7. app: flink
  8. type: NodePort
  9. ports:
  10. - protocol: TCP
  11. port: 8081
  12. targetPort: 8081
  13. nodePort: 30123

启动服务

  1. $ kubectl create -f flink-svc.yaml
  2. $ kubectl create -f flink-jm.yaml
  3. $ kubectl create -f flink-tm.yaml
  4. $ kubectl create -f uisvc.yaml

查看pod状态

  1. $ kubectl get pods
  2. flink-jobmanager-6b789dc567-7lm46 1/1 Running 0 57m
  3. flink-taskmanager-65d457c5c-bjmtz 1/1 Running 0 57m
  4. flink-taskmanager-65d457c5c-hrf9f 1/1 Running 0 57m
  5. flink-taskmanager-65d457c5c-q9l88 1/1 Running 0 57m

登录web界面查看

http://10.8.0.137:30123/