创建一个运行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