树莓派搭建流计算集群

树莓派搭建流计算集群

生活扇了我一巴掌,我能怎么办?擦擦脸,接着与生活同行。:-1

无名 2021

本篇介绍如何利用(闲置的)树莓派搭设流处理集群。

原材料:树莓派若干。(我有两个ARMv7的树莓派4)

主要用到的技术和软件:

  • Docker, 用来管理集群计算资源
  • Portainer,集群管理UI
  • Flink,原生流处理凭条
  • Redis,缓存+Broker
  • Prometheus,流监控
  • Grafana,图形化流监控

集群控制没有使用K8s,因为k8s对32位处理器支持一般,而且没有原生的ARM支持,只能用一个API协调的软件叫k3s,后来发现还不如直接用Docker Swarm就行集群资源管理。反正所有的服务都是 docker 容器,后期集群扩容,只需要在新节点上加入集群即可。

最终我的集群包含两个Docker Swarm节点:

集群运行服务:

树莓派设置

首先,安装操作系统,具体可以参考。基本的操作就是下载操作系统,烧录在sd卡里,然后把卡查回树莓派。
这里注意SD卡烧制系统结束后,在SD卡跟目录里加入一个空的叫ssh的文件,这样树莓派会自动激活ssh服务。默认用户是pi,密码是raspberry。这样就可以实现headless部署。

将多个树莓派通过集线器或者路由器连接起来,然后设置每个树莓派的hostname和静态IP地址。

静态IP地址可以在这里设置:/etc/dhcpcd.conf

1
2
3
interface eth0
static ip_address = 192.168.1.xxx
static domain_name_server = 192.168.1.1, 8.8.8.8

创建Docker Swarm集群

SSH进入一个树莓派,将它作为集群的主机:

  1. 安装 Docker
1
curl -fsSL https://get.docker.com | sh
  1. 创建 Swarm 集群
1
docker swarm init --advertise-adr 192.168.1.xxx

其中xxx就是当前选定的集群主机静态IP地址。这个命令会生成一个token,记录token用来后续接入其他集群节点。

在其他节点树莓派中同样安装docker,但是输入如下命令连接入集群:

1
docker swarm join --token 这里是你的token 192.168.1.xxx:2377

所有节点接入集群后,可以在集群主机查看集群状态:docker node ls

1
2
3
4
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
4588i2fvipv17led4hptn349s * pi1 Ready Active Leader 20.10.8
uvhsalsyo9zfx8z5ny4nfb4ze pi2 Ready Active 20.10.8
  1. 安装 Portainer 监控集群状态

在主机执行:

1
2
$ docker volume create portainer_data
$ docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

然后就可用过访问192.168.1.xxx:9000访问集群控制界面了。

部署流处理集群服务

具体的配置文件见这个repo

主要的工作在于自己build可用flink镜像,可以clone仓库,然后自己build一个镜像。也可以直接pull我做的好的镜像:docker pull wangzhe3224/flink-1.13.2-armv7:latest,这是针对的arml7处理器的,后期的树莓派应该都是v8版本了,需要另外重新构建。

下一步就是用docker文件配置各项服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
version: "3"
services:
jobmanager:
image: digitaljazz/flink-1.8.0-armv7:latest
ports:
- "8081:8081"
command: jobmanager.sh start-foreground jobmanager
networks:
flinknet:
aliases:
- jobmanager
deploy:
replicas: 1
placement:
constraints:
- node.hostname == worker04

taskmanager:
image: digitaljazz/flink-1.8.0-armv7:latest
depends_on:
- jobmanager
command: taskmanager.sh start-foreground -Djobmanager.rpc.address=jobmanager
networks:
- flinknet
deploy:
replicas: 3
placement:
constraints:
- node.hostname != worker04
- node.hostname != worker01

mosquitto:
image: eclipse-mosquitto:1.6.5
ports:
- "1883:1883"
- "9001:9001"
networks:
flinknet:
aliases:
- mosquitto
deploy:
replicas: 1
placement:
constraints:
- node.hostname == worker01

prometheus:
image: prom/prometheus:latest
networks:
flinknet:
aliases:
- prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yaml:/etc/prometheus/prometheus.yml
deploy:
replicas: 1
placement:
constraints:
- node.hostname == worker04

grafana:
image: grafana/grafana:6.1.3
depends_on:
- prometheus
networks:
flinknet:
aliases:
- grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- ./grafana/provisioning/:/etc/grafana/provisioning/
deploy:
replicas: 1
placement:
constraints:
- node.hostname == worker04

networks:
flinknet:
driver: overlay

然后再集群主机:docker stack deploy --compose-file docker-stack.yaml flink 启动所有服务。

可以通过docker service ls 查看集群运行服务。