树莓派 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脚本来简化一下。

    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/hostname

    Hypriot 镜像是同一个,所以默认名字都叫 black-pearl,不改名字集群管理会很混乱。

  • Kubernetes(本来我想用这个来管理的,但是我的pi2的docker是最新ce版本,kubeadmin提示不支持。) 参考《Setup Kubernetes on a Raspberry Pi Cluster easily the official way!》

    添加源:

    shell
    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

    shell
    1
    
    $ apt-get update && apt-get install -y kubeadm

    初始化主节点

    shell
    1
    
    $ kubeadm init --pod-network-cidr 10.244.0.0/16

    略。。。

  • Swarm(选择了这个)

    初始化pi2(在2代上执行)

    shell
    1
    
    $ docker swarm init

    把得到的token信息给每个节点接入来

    shell
    1
    2
    3
    
    $ docker swarm join \
      --token SWMTKN-1-5pm7otmn3vt9bmjhdfdk2hhgxp1zm9wfcyebl7x4dlkbbqujke-4fmuuxxxxxxxxxhiyqem \
      192.168.xx.2:2377

    输出一下node信息:

    shell
    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:

yaml
1
2
3
4
5
6
7
8
#!/usr/bin/env ansible-playbook
---
- hosts: all
  gather_facts: yes
  sudo: yes
  roles:
    - role: docker-engine
      tags: docker

Docker-Container:

当时还维护了一个 Ansible 规则库,后来这些集群主要用来跑些轻量级服务,也算是第一次完整的容器化实践了。