raspberry pi
是否曾经想打造自己的云? 现在你可以! 它所需要的只是一些廉价的开源硬件和开源软件。 只需花费约200美元,我就可以使用Fabric8在Kubernetes云操作系统上安装四台Raspberry Pi 2 。
Fabric8是一个开源DevOps和集成平台,可在任何Kubernetes或OpenShift环境中直接使用,并提供连续的交付,管理,ChatOps和Chaos Monkey。 简而言之,这是开发和管理微服务的最佳框架。 (全部披露:我从事Red Hat Fabric8项目。)
在软件体系结构和运行它的硬件之间再没有比以前更好的匹配了。 Pi完全静音(无风扇),并具有功能强大的四核CPU,而微服务架构使每个进程相对较小,因此可以在每个节点的1GB RAM内存约束下运行。 如果您需要更多的计算能力,则只需添加更多的Pi。 最后,与硬件一起玩而不是登录到Amazon的远程虚拟机上只是很有趣 。
1.所需的硬件
要构建此四像素设置,我使用了:
- 4个Raspberry Pi 2s
- 4张16GB MicroSD卡(10类)
- 1个带USB插座的60W电源
- 4条短USB至Micro USB电缆(用于为Pis供电)
- 4条5类短网络电缆
- 1根更长的Cat 5网络电缆可连接到网络
- 1个网络集线器(我的是一个旧的五端口,我已经清理掉了10 / 100MBps)
- 乐高(相信我,建立自己的感觉真好!)
获取Class 10 MicroSD卡非常重要,因为这是一个会极大影响系统速度的组件。 您可以轻松地为4个Pis配备一个较小的20W电源,但是我打算以后再增加一个,以便获得更大的电源。 Pi上的网络端口为100MBps,因此您可以使用旧的集线器。
2.刷新MicroSD卡
现在我们需要将操作系统安装到MicroSD卡上。 我正在使用Hypriot图片 。 我测试了许多其他软件 ,包括Pidora,Redsleeve / CentOS和Arch Linux,但得出结论说,Hypriot在这一点上对我来说是最好的(主要是因为对本机Docker的支持以及映像很小)。 您可以在此处下载最新的Hypriot映像。
- 将存储卡插入读卡器中。 不要安装它。 如果自动安装,请卸载卡。 然后将图像写入卡。 在我的OS X机器上,执行此命令的命令是:
sudo dd bs=1m if=hypriot-rpi-20151103-224349.img of=/dev/diskn
将“ n”替换为使用磁盘实用程序找到的磁盘数量:在Mac OS X 10.8.x Mountain Lion上,“验证磁盘”(在卸载之前)将BSD名称显示为“ / dev / disk2s1”或类似名称。 请仔细检查,否则您可能正在格式化不想格式化的磁盘!
- 等待。 这可能需要10分钟左右。
- 对所有四个MicroSD卡执行此操作。 您可以在等待时在LEGO机壳上工作。
3.启动并添加DNS
您现在可以打开第一个Pi的电源。 默认情况下,使用root / hypriot登录。您将需要为每个Pi设置DNS。 如果您不想连接显示器和键盘来确定其IP和MAC地址,则可以使用nmap 。 如果您有DNS服务,请在此处进行配置。 否则,在/ etc / hosts中命名Pis。 我给我的Pis命名为rpi-master,rpi-node-1,rpi-node-2和rpi-node-3。 快速重启每个Pi之后,您将在cmd提示符下看到名称。 请注意, 如果您跳过DNS步骤,您的Kubernetes集群将无法正常工作 。 我在所有机器上的/ etc / hosts文件中添加了以下内容:
192.168.1.9 rpi-master
192.168.1.21 rpi-node-1
192.168.1.18 rpi-node-2
192.168.1.23 rpi-node-3
4.添加交换(可选)
我为rpi-master添加了1GB的交换空间,因为它运行了更多的Kubernetes组件。 某些人似乎担心,频繁写入MicroSD卡会使其快速失效。 因此,我决定设置swappiness使得其仅使用交换作为最后的手段。
dd if=/dev/zero of=/swap/swapfile bs=1M count=1024
mkswap /swap/swapfile
swapon /swap/swapfile
现在,您可以顶部检查是否有1GB的交换空间。
KiB Mem: | 总计947468, | 913096使用了, | 34372免费, | 69884缓冲区 |
KiB Swap: | 总计1048572, | 使用了484个, | 1048088免费, | 667248已缓存 |
要使重启之间的交换永久生效,请添加
/swap/swapfile none swap sw 0 0
到您的/ etc / fstab文件。 最后,在/etc/sysctl.conf中,将swappiness设置为1:
vm.swappiness = 1
“ 1”表示仅在RAM使用率超过99%时才使用交换。
5.安装Kubernetes
这些说明用于安装来自Google的普通香草Kubernetes。 由于某些64位依赖性,我在编译OpenShift 3时遇到了一些问题,稍后我将再讨论。 我想都支持。 我正在使用的所有代码都在https://github.com/Project31下签入。 如果您想编译自己的Kubernetes二进制文件,请查看我的博客文章 。
5.1。 安装Kubernetes Master
Kubernetes主服务器运行Kubernetes REST API,调度程序,kubernetes-proxy和复制控制器。 它还将etcd用作在其他Kubernetes主服务器之间复制的键值存储。 有关更多详细信息,请参阅Kubernetes文档 。
![Kubernetes主组件图](https://i-blog.csdnimg.cn/blog_migrate/48b6cda2e9da6804d1658563ea4d492f.png)
要将这些组件安装到主节点上,请登录到主节点并运行:
git clone git@github.com:Project31/kubernetes-installer-rpi.git
cd kubernetes-install-rpi
./build-master.sh
使用docker ps验证正在运行的Docker容器:
CONTAINER ID | 图片 | 命令 | 已建立 | 状态 | 名字 |
d598e486daf5 | 超库 | “ / hyperkube代理--m” | ... | ... | k8s_kube-proxy ... |
026c19a67f86 | 超库 | “ / hyperkube调度程序” | ... | ... | k8s_kube-scheduler ... |
8f615b87cfda | 超库 | “ /超kubecontrolle” | ... | ... | k8s_kube-controller-manager .... |
a737d9927c03 | 超库 | “ / hyperkube apiserver” | ... | ... | k8s_kube-apiserver .... |
0207a21ce18d | 等 | “ etcd --data-dir = / var” | ... | ... | k8s_etcd ... |
a4174bf7cb98 | ... /暂停:0.8.0 | “/暂停” | ... | ... | k8s_POD ... |
现在设置的导出KUBERNETES_MASTER = http:/ / rpi-master:8080,因此您的kubectl可以在主服务器上连接Kubernetes REST API。 现在,使用kubectl get pod来查看正在运行的pod
NAME | 准备 | 状态 | 重新启动 | 年龄 |
kube-controller-rpi-master | 5/5 | 跑步 | 0 | 10秒 |
我们可以看到kube-controller-rpi-master容器包含运行五个带有上述Kubernetes服务的Docker容器。
5.2。 安装Kubernetes节点
Kubernetes节点仅运行Kubernetes代理和容器。
![Kubernetes客户端组件图](https://i-blog.csdnimg.cn/blog_migrate/6eb55308e50cc06c6cbdce81e075491f.png)
要将这些组件安装在节点上,请登录到该节点并运行:
git clone git@github.com:Project31/kubernetes-installer-rpi.git
cd kubernetes-install-rpi
现在编辑kube-procy.yaml并设置--master = http:/ / rpi-master:8080到您的Kubernetes主机。 然后编辑kubelet.service文件,并在那里设置主服务器的Kubernetes REST端点(在我的情况下为http:/ /192.168.1.9:8080)。
现在,您可以运行安装:
./build-worker.sh
并使用docker ps验证我们的代理:
CONTAINER ID | 图片 | 命令 | 已建立 | 状态 | 名字 |
cf4a9a2d7f35 | 超库 | “ / hyperkube代理--m” | 40秒前 | 最多37秒 | k8s_kube-proxy ... |
d9f8f937df4d | gcr.io/go ... | “/暂停” | 43秒前 | 最多40秒 | k8s_POD.e4cc .. |
代理正在运行! 设置导出KUBERNETES_MASTER = http:/ / rpi-master:8080,因此您的kubectl可以在主服务器上连接Kubernetes REST API。 现在,验证所有节点均已注册:
kubectl get nodes
NAME | 标签 | 状态 |
rpi-master | kubernetes.io/hostname=rpi-master | 准备 |
rpi-node-1 | kubernetes.io/hostname=rpi-node-1 | 准备 |
rpi-node-2 | kubernetes.io/hostname=rpi-node-2 | 准备 |
rpi-node-3 | kubernetes.io/hostname=rpi-node-3 | 准备 |
是的,它有效!
6.打开Docker进行远程连接
我们需要在主服务器上修复Docker配置,以便它可以接受远程连接,并且可以向其中部署某些内容。 打开/ etc / default / docker文件进行编辑,然后设置DOCKER_OPTS :
DOCKER_OPTS="-H tcp://192.168.1.9:2375 -H unix:///var/run/docker.sock --storage-driver=overlay -D"
指定机器的IP地址,或者您可以使用用户“ 0.0.0.0”绑定到所有接口。 现在,我们可以将Docker映像远程推送到主映像。
7.部署简单的服务
让我们部署一个简单的服务并将其扩展到两个Pod,以确保一切正常:
kubectl -s http://localhost:8080 run httpd --image=hypriot/rpi-busybox-httpd --port=80
kubectl scale --replicas=2 rc httpd
kubectl get pods -o wide
我们看到,即使我们在主服务器上执行了该命令,它仍然在node-2和node-3上启动了一个pod:
NAME | 准备 | 状态 | 重新启动 | 年龄 | 节点 |
httpd-4v1qw | 1/1 | 跑步 | 0 | 9m | rpi-node-2 |
httpd-qxcxu | 0/1 | 待定 | 0 | 16岁 | rpi-node-3 |
kube-controller-rpi-master | 5/5 | 跑步 | 0 | 1天 | 大师 |
kube-system-rpi-node-1 | 1/1 | 跑步 | 0 | 33m | rpi-node-1 |
kube-system-rpi-node-2 | 1/1 | 跑步 | 0 | 43m | rpi-node-2 |
kube-system-rpi-node-3 | 1/1 | 跑步 | 0 | 53m | rpi-node-3 |
8.结论
首先,它有效! Kubernetes主服务器可能没有足够的内存来运行服务,但另一方面,节点几乎有整个1GB的空间可用于Docker容器。 如果您需要更多的计算能力,则只需添加节点即可。 该硬件平台的极低价格,再加上Kubernetes云OS以及Fabric8 DevOps和iPaaS功能,使该技术真正具有破坏性。 它真的是只需要200美元就可以买到的盒子里的云。
翻译自: https://opensource.com/life/16/2/build-a-kubernetes-cloud-with-raspberry-pi
raspberry pi