Flink standalone on Kubernetes的部署流程

2022-05-19

< view all posts

Flink除Standalone模式外,还支持YARN、Docker、k8s等多种配置方式,其中k8s部署又能分为standalone on Kubernetes和Native Kubernetes两种。这篇笔记记录一下standalone on Kubernetes方式的部署流程。

使用`minikube`建立一个单机k8s集群。在这种方案下,k8s的安装主要包括以下三个组件:

Docker的安装

选择手动下载RPM package进行安装,即使是在隔离互联网的系统也能够使用这种方式:

首先根据Linux发行版本,可以选择相应的安装文档作参考。

以CentOS为例,可以在此处浏览所有支持的CentOS版本和架构,选择合适的包下载

Docker的完整安装包括四个包,其中三个包是必须的:docker-ce-clidocker-scan-plugindecker-ce

另一个包docker-ce-rootless-extras如果不需要rootless(非root安装)的话可以不下载

安装使用如下命令:

sudo yum install /path/to/package.rpm
# Start Docker
sudo systemctl start docker

测试安装:

sudo docker run hello-world

执行此命令后如果是在有互联网的环境,会联网下载一个hello-world镜像并运行,能够运行就说明安装成功。

kubectl的安装

可以直接从这里下载binary,之后安装:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
mkdir -p ~/.local/bin/kubectl
mv ./kubectl ~/.local/bin/kubectl
# and then append (or prepend) ~/.local/bin to $PATH

minikube的安装

minikube支持amd64、arm64等指令集,有不同的binary包

例如安装amd64版本,可以使用:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

安装完成后启动:

minikube start

Flink Standalone 部署

在使用`minikube`部署时首先要运行:

minikube ssh 'sudo ip link set docker0 promisc on'

Standalone部署有两种可选模式:Application Mode、Session Mode,Application Mode模式下部署的集群只用于跑一个特定的应用(即jar包),而Session Mode部署模式则能够运行多任务、接受提交新任务。我们主要使用的应该是Session Mode,下面都以Session Mode为例。

non-HA部署

non-HA部署时需要提供四个配置文件,可以参考官网的配置示例

配置文件编辑完成后,启用四个配置文件:

# Configuration and service definition
kubectl create -f flink-configuration-configmap.yaml
kubectl create -f jobmanager-service.yaml
# Create the deployments for the cluster
kubectl create -f jobmanager-session-deployment.yaml
kubectl create -f taskmanager-session-deployment.yaml

完成之后可以用 kubectl get deployments 命令来查看部署的情况。

可以用 kubectl get pods 命令来查看 pods 的信息。

因为k8s容器的网络和外部默认是隔离的,使用 kubectl port-forward jobmanager-pod的名称 8081:8081 命令,创建一个端口转发,这样就可以从 http://localhost:8081 访问到flink默认的控制台页面。通过REST API,可以完成任务的提交和控制。

HA高可用的部署

首先删除刚刚创建的non-HA的部署:

kubectl delete deploy flink-jobmanager
kubectl delete deploy flink-taskmanager
kubectl delete configmap flink-config
kubectl delete serivce flink-jobmanager

HA部署需要三个配置文件,可以参考官网编辑相应的内容,之后使用类似的方法应用。

需要注意的是如果开启HA,则k8s的runtime必须连接到对应的HA存储,并且需要pods的service accounts具有创建修改和删除ConfigMaps的权限。参考此处

部署的扩缩

Standalone模式不支持由Flink自动发起对task manager数量的调节,但通过k8s,可以方便地对task manager做手动扩缩:

kubectl scale deploy flink-taskmanager --replicas=3

这条命令就将task manager的数量调整为3。再运行 kubectl get pods ,会显示更新的信息。