树莓派 RaspberryPi docker集群
概述:
当时正在学习 Docker 集群管理,想找点低成本实验环境折腾,就想到用树莓派了。参考Hypriot的博客,我买了1块Rasp2代板和2块Rasp3代板。当初的考虑是2代便宜就做 master,3代性能好些做 node,组合起来刚好是个小集群。

其中2代默认安装了Hypriot的系统。3代板如果您有兴趣可以自己参考《Building a 64bit Docker OS for the Raspberry Pi 3》这篇文章编译一套64bit的系统。也可以直接下载作者的已编译好镜像地址中压缩包。
Hypriot 这系统当时还挺有意思,是专门为 ARM 设备定制的 Docker OS,内置了 docker-ce,省去了很多手动配置的麻烦。
网络的问题:
日常的升级或者包安装之类的情况,都会遇到墙的问题。避免经常为墙而烦恼的情况,有必要给控制网络出口的路由做些调整。参考《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动翻墙》解决墙的烦恼,因为这个不是这篇文的重点,具体细节略。
当时在 ARM 板子上编译代理软件真的很痛苦,性能太差了。
给每个arm板子在路由上赋予一个静态IP地址。
系统:
OS细节: 手动配3块板子真的很累,就找了个ansible-playbook来自动化部署。个人习惯调整一下环境,如zsh,vim等,可以考虑弄个ansible-playbook或者shell脚本来简化一下。
1 2 3 4 5 6 7# 调整默认文本工具为vim $ update-alternatives --config editor $ dpkg-reconfigure locales # 新建自己的账号并加入到docker组 $ usermod a -G docker xxx # 这步对集群很重要,修改设备的名字,否则后期加入集群会报错 $ sed -i "s/black-pearl/node01-pearl/" /boot/device-init.yaml /etc/hostnameHypriot 镜像是同一个,所以默认名字都叫 black-pearl,不改名字集群管理会很混乱。
Kubernetes(本来我想用这个来管理的,但是我的pi2的docker是最新ce版本,kubeadmin提示不支持。) 参考《Setup Kubernetes on a Raspberry Pi Cluster easily the official way!》
添加源:
1 2$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - $ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list安装kubeadm
1$ apt-get update && apt-get install -y kubeadm初始化主节点
1$ kubeadm init --pod-network-cidr 10.244.0.0/16略。。。
Swarm(选择了这个)
初始化pi2(在2代上执行)
1$ docker swarm init把得到的token信息给每个节点接入来
1 2 3$ docker swarm join \ --token SWMTKN-1-5pm7otmn3vt9bmjhdfdk2hhgxp1zm9wfcyebl7x4dlkbbqujke-4fmuuxxxxxxxxxhiyqem \ 192.168.xx.2:2377输出一下node信息:
1 2 3 4 5$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS mbosd1usr6vfoj2p9zyw6zhau node01-pearl Ready Active sc4vtm5fqbdet8k4vrr38x1fo * master-pearl Ready Active Leader v8uxeq9pc8pzlciing7lol16e node02-pearl Ready Active看到3个节点都是 Ready 的时候还挺有成就感的,毕竟是第一次自己搭集群。
Docker-Engine的安装:
利用MickeyZZC / MiAnsibleRules中的docker-engine ,参考以下playbook:
| |
Docker-Container:
- 参考MickeyZZC / MiAnsibleRules其他rules.
- 每个rules都有变量,可以在自己的ansible项目中给予vars值.
当时还维护了一个 Ansible 规则库,后来这些集群主要用来跑些轻量级服务,也算是第一次完整的容器化实践了。