创建一个运行Kubernetes的Raspberry Pi集群,安装(第2部分)
在比利时Devoxx和摩洛哥Devoxx, 曾 和我 (Arjen Wassink)显示了我们在Quintor上构建的Raspberry Pi集群,运行HypriotOS,Docker和Kubernetes。虽然我们对这次演讲表示赞赏,但最常见的问题是关于如何自己构建Pi集群!我们将分两部分来完成。的 第一部分介绍了集群的购物清单,第二部分将向您展示如何启动和运行kubernetes。 。 。
现在您已经完成了Raspberry Pi Cluster的所有设置,是时候在其上运行一些软件了。如前一篇博客所述,本教程基于ARM处理器的Hypriot linux发行版。主要原因是对Docker的捆绑支持。我用了 这个版本的Hypriot 对于本教程,因此,如果您遇到其他版本的Hypriot遇到麻烦,请考虑我使用的版本。
第一步是确保每个Pi都运行Hypriot,如果尚未运行,请检查 入门指南 其中。另外,将群集交换机连接到网络,以便可以使用Internet,并且每个Pi都可以通过DHCP分配IP地址。由于我们将同时运行多个Pi,因此为每个Pi赋予唯一的主机名是可行的。为了方便起见,我将Pi的名称重命名为rpi-master,rpi-node-1,rpi-node-2等。请注意,在Hypriot上,通过编辑/boot/occidentalis.txt文件而不是/ etc / hostname来设置主机名。您也可以使用Hypriot Flash工具设置主机名。
在Pi上运行软件最重要的是ARM发行版的可用性。谢谢 布伦丹·伯恩斯,其中有适用于ARM的Kubernetes组件, Google Cloud Registry。那很棒。第二个障碍是如何安装Kubernetes。有两种方法;直接在系统上或Docker容器中。尽管容器支持处于试验状态,但我还是选择这样做,因为它使为您安装Kubernetes更加容易。 Kubernetes需要在节点上运行多个进程(etcd,flannel,kubectl等),这些进程应以特定顺序启动。为了缓解这种情况,可以使用systemd服务以正确的方式启动必要的进程。另外,系统服务还确保在(重新)引导节点时启动Kubernetes。为了使安装真正容易,我为主节点和工作节点创建了一个简单的安装脚本。都可以在 的GitHub。现在开始吧!
安装Kubernetes主节点
首先,我们将在主节点上安装Kubernetes,然后将工作节点添加到集群中。基本上,这取决于获取git存储库的内容并执行安装脚本。
$ curl -L -o k8s-on-rpi.zip //github.com/awassink/k8s-on-rpi/archive/master.zip
$ apt-get update
$ apt-get install unzip
$ unzip k8s-on-rpi.zip
$ k8s-on-rpi-master/install-k8s-master.sh
安装脚本将安装五个服务:
- docker-bootstrap.service-是运行etcd和法兰绒的独立Docker守护程序,因为由于网络配置,法兰绒需要在标准Docker守护程序(docker.service)之前运行。
- k8s-etcd.service-是用于存储法兰绒和kubelet数据的etcd服务。
- k8s-flannel.service-是法兰绒进程,可在群集中的所有节点上提供覆盖网络。
- docker.service-是标准的Docker守护程序,但使用法兰绒作为网桥。它将运行所有Docker容器。
- k8s-master.service-是提供集群功能的kubernetes主服务。
此安装过程的基本详细信息也记录在了 入门指南 Kubernetes。请检查它以获取有关如何设置多节点Kubernetes集群的更多信息。
让我们检查一下是否一切正常。两个docker daemon进程必须正在运行。
$ ps -ef|grep docker
root 302 1 0 04:37 ? 00:00:14 /usr/bin/docker daemon -H unix:///var/run/docker-bootstrap.sock -p /var/run/docker-bootstrap.pid --storage-driver=overlay --storage-opt dm.basesize=10G --iptables=false --ip-masq=false --bridge=none --graph=/var/lib/docker-bootstrap
root 722 1 11 04:38 ? 00:16:11 /usr/bin/docker -d -bip=10.0.97.1/24 -mtu=1472 -H fd:// --storage-driver=overlay -D
etcd和法兰绒容器必须打开。
$ docker -H unix:///var/run/docker-bootstrap.sock ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4855cc1450ff andrewpsuedonym/flanneld "flanneld --etcd-endp" 2 hours ago Up 2 hours k8s-flannel
ef410b986cb3 andrewpsuedonym/etcd:2.1.1 "/bin/etcd --addr=127" 2 hours ago Up 2 hours k8s-etcd
The hyperkube kubelet, apiserver, scheduler, controller and proxy must be up.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a17784253dd2 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube controller" 2 hours ago Up 2 hours k8s\_controller-manager.7042038a\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_2174a7c3
a0fb6a169094 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube scheduler" 2 hours ago Up 2 hours k8s\_scheduler.d905fc61\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_511945f8
d93a94a66d33 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube apiserver" 2 hours ago Up 2 hours k8s\_apiserver.f4ad1bfa\_k8s-master-127.0.0.1\_default\_43160049df5e3b1c5ec7bcf23d4b97d0\_b5b4936d
db034473b334 gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube kubelet -" 2 hours ago Up 2 hours k8s-master
f017f405ff4b gcr.io/google\_containers/hyperkube-arm:v1.1.2 "/hyperkube proxy --m" 2 hours ago Up 2 hours k8s-master-proxy
在集群上部署第一个Pod和服务
看起来不错时,我们可以使用kubectl访问Kubernetes集群的主节点。可以从googleapis存储下载用于ARM的Kubectl。 kubectl get节点显示哪些集群节点已注册其状态。主节点名为127.0.0.1。
$ curl -fsSL -o /usr/bin/kubectl //storage.googleapis.com/kubernetes-release/release/v1.1.2/bin/linux/arm/kubectl
$ kubectl get nodes
NAME LABELS STATUS AGE
127.0.0.1 kubernetes.io/hostname=127.0.0.1 Ready 1h
An easy way to test the cluster is by running a busybox docker image for ARM. kubectl run can be used to run the image as a container in a pod. kubectl get pods shows the pods that are registered with its status.
$ kubectl run busybox --image=hypriot/rpi-busybox-httpd
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE NODE
busybox-fry54 1/1 Running 1 1h 127.0.0.1
k8s-master-127.0.0.1 3/3 Running 6 1h 127.0.0.1
Now the pod is running but the application is not generally accessible. That can be achieved by creating a service. The cluster IP-address is the IP-address the service is avalailable within the cluster. Use the IP-address of your master node as external IP and the service becomes available outside of the cluster (e.g. at http://192.168.192.161 in my case).
$ kubectl expose rc busybox --port=90 --target-port=80 --external-ip=\<ip-address-master-node\>
$ kubectl get svc
NAME CLUSTER\_IP EXTERNAL\_IP PORT(S) SELECTOR AGE
busybox 10.0.0.87 192.168.192.161 90/TCP run=busybox 1h
kubernetes 10.0.0.1 \<none\> 443/TCP \<none\> 2h
$ curl http://10.0.0.87:90/
\<html\>
\<head\>\<title\>Pi armed with Docker by Hypriot\</title\>
\<body style="width: 100%; background-color: black;"\>
\<div id="main" style="margin: 100px auto 0 auto; width: 800px;"\>
\<img src="pi\_armed\_with\_docker.jpg" alt="pi armed with docker" style="width: 800px"\>
\</div\>
\</body\>
\</html\>
安装Kubernetes工作节点
下一步是在每个工作节点上安装Kubernetes,并将其添加到集群中。从根本上讲,这还取决于获取git存储库的内容并执行安装脚本。尽管在此安装中,k8s.conf文件需要正手复制并进行编辑以包含主节点的IP地址。
$ curl -L -o k8s-on-rpi.zip //github.com/awassink/k8s-on-rpi/archive/master.zip
$ apt-get update
$ apt-get install unzip
$ unzip k8s-on-rpi.zip
$ mkdir /etc/kubernetes
$ cp k8s-on-rpi-master/rootfs/etc/kubernetes/k8s.conf /etc/kubernetes/k8s.conf
更改/etc/kubernetes/k8s.conf中的ip地址以匹配主节点
$ k8s-on-rpi-master/install-k8s-worker.sh
安装脚本将安装四个服务。这些与主节点上的非常相似,但是不同之处在于,没有etcd服务正在运行,并且kubelet服务被配置为工作节点。
一旦工作节点上的所有服务启动并运行,我们就可以检查该节点是否已添加到主节点上的集群中。
$ kubectl get nodes
NAME LABELS STATUS AGE
127.0.0.1 kubernetes.io/hostname=127.0.0.1 Ready 2h
192.168.192.160 kubernetes.io/hostname=192.168.192.160 Ready 1h
$ kubectl scale --replicas=2 rc/busybox
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE NODE
busybox-fry54 1/1 Running 1 1h 127.0.0.1
busybox-j2slu 1/1 Running 0 1h 192.168.192.160
k8s-master-127.0.0.1 3/3 Running 6 2h 127.0.0.1
享受您的Kubernetes集群!
恭喜你!现在,您的Kubernetes Raspberry Pi集群正在运行,并且可以开始使用Kubernetes并开始学习。结帐 Kubernetes用户指南 找出你们所有人能做什么。而且不要忘了像Ray一样偶尔拔一些插头,我也很:-)
Quintor Java架构师和团队负责人Arjen Wassink