边缘设备智能

边缘设备智能

当前位置:网站首页 > 深度学习 > 边缘设备智能 > 正文

边缘智能-在树莓派上部署kubernetes集群

pixiubiu 2019-01-07 1373 0






0x00 引言

最近学了Kubernetes一段时间后,突然想在自己的树莓派上玩玩,搭建一个集群出来,玩过树莓派的同学都知道,树莓派作为一个“卡片电脑式”的嵌入式电脑,它的性能是非常有限的,内存和CPU对于我们传统的机器智能是远远不可及的,因此我在这里PO出我的目的:

打造一个具有边缘智能的系统,可以在上面部署边缘级别的微服务组件,包括传感器的采集服务、控制和计算单元为核心的服务!

这里的实验环境为 1 个kubernetes master和 3 个 worker节点,共计 4 个树莓派节点。为了方便,这里的主机名以及IP地址如下:

  • edge-master, IP:172.16.3.1

  • edge-node1, IP:172.16.3.17

  • edge-node2, IP:172.16.3.32

  • edge-node3, IP:172.16.3.3

这里我没有使用静态IP,因此IP地址是有可能变的,因此为了稳定,建议设置成静态IP。但为了教程的完整性,我也会说明如何设置静态IP。

这里主要参考了下面的教程:

0x01 系统准备(TL;DR)

这里的准备系统是要准备树莓派操作系统,一般来讲运行kubernetes这么大的系统,最好的系统选择方式为轻量级的操作系统,这里推荐两个操作系统:

  • Raspbian Stretch Lite - https://www.raspberrypi.org/downloads/raspbian/

  • Hypriot OS - https://blog.hypriot.com/

这里为了方便,我使用了 Raspbian Stretch Lite 系统作为我的边缘设备操作系统,下载地址: https://www.raspberrypi.org/downloads/raspbian/

树莓派系统安装都是一个样,安装教程可以参考:https://www.shenhengheng.xyz/files/respberry_doc.pdf

安装完成之后,需要初始化下面的操作,包括更改主机名,密码,连接wifi,设置docker网络代理,还有设置静态IP等。

初始化系统

  • 更改主机名,修改密码以及连接Wi-Fi等工作都可以通过 raspi-config 命令来完成。

0x02 Master节点设置

设置静态IP

$ cat << EOF >> /etc/dhcpcd.conf
profile static_eth0
static ip_address=192.168.0.100/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8
EOF

安装100,101,102,103 的格式设置其他的树莓派节点IP地址

设置网络代理

因为后期会需要下载kubeadm,kubelete,docker等软件,因此需要设置网络代理,通过代理下载软件。

$ export http_proxy="http://172.14.1.54:1080"
$ export https_proxy="http://172.14.1.54:1080"

安装docker

这个步骤依赖于上面的网络代理设置的,如果设置成功了,那么这步才可能成功执行。

$ curl -sSL get.docker.com | sh && sudo usermod pi -aG docker
$ newgrp docker

关闭swap

$ sudo dphys-swapfile swapoff && \
  sudo dphys-swapfile uninstall && \
  sudo update-rc.d dphys-swapfile remove

这个步骤是为了后面的 kubeadm init 成功执行!具体的缘由可以参考我之前的文章:https://www.41sh.cn/?id=8

为了检测是否成功关闭,可以执行下面的命令,如果成功执行了,那么下面的命令将不会有任何的输出。

$ sudo swapon --summary

编辑 /boot/cmdline.txt

打开 /boot/cmdline.txt,并在末尾添加如下指令。

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

该步骤执行完成后,一定要重启!否则后面会有错误。

安装kubernetes

该步骤也同样依赖于设置网络代理那一步骤!

$ sudo su # 切换到root用户
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list && \
apt-get update -q && \
apt-get install -qy kubeadm=1.10.2-00 kubectl=1.10.2-00 kubelet=1.10.2-00
  • 这里有个小坑,切到root用户后,需要重新配置网络代理,然后就可以使用了。

$ export http_proxy="http://172.14.1.54:1080"
$ export https_proxy="http://172.14.1.54:1080"
  • 使用root时,不用加sudo前缀,这个已经踩了很多次了

如果安装最新版本,不用指定版本。可以直接使用下面的命令:

$ apt-get install -qy kubeadm kubectl kubelet

 修改docker的网络代理

这一步非常重要!因为我们可能需要pull很多国内不能访问的镜像,因此需要设置docker网络代理,因为默认情况下,docker服务不是通过systemctl管理的,因此需要创建一个系统服务,具体的命令如下:

$ mkdir -pv /etc/systemd/system/docker.service.d
$ cat << EOF >> /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://172.16.3.12:1080/" "HTTPS_PROXY=http://172.16.3.12:1080/"
EOF 
$ systemctl daemon-reload
$ systemctl restart docker

参考:https://docs.docker.com/config/daemon/systemd/

预先pull镜像

$ kubeadm config images pull -v3

初始化master节点 

$ kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16

这步如果成功的话,会打印下面的消息: 

Your Kubernetes master has initialized successfully!
 
To start using your cluster, you need to run the following as a regular user:
 
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
 
You can now join any number of machines by running the following on each node
as root:
 
  kubeadm join 172.16.3.1:6443 --token xo78oj.02cia85vdh285aqj --discovery-token-ca-cert-hash sha256:9517c72036f8261ac912adaf8339b65583fdaa7dbb8dd60054c6e84e8880a3fd

 然后根据输出的提示,执行下面的语句:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

上面的语句需要在pi用户下执行!否则不管用!

这步完成之后,执行下面的命令,你会发现master节点NotReady的消息,这是因为我们的网络需要依赖于flannel网络组件!

Setup networking with Weave Net or Flannel

Some users have reported stability issues with Weave Net on ARMHF. These issues do not appear to affect x86_64 (regular PCs/VMs). You may want to try Flannel instead of Weave Net for your RPi cluster.

Weave Net

Install Weave Net network driver

$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

If you run into any issues with Weaveworks' networking then flannel is also a popular choice for the ARM platform.

Flannel (alternative)

Apply the Flannel driver on the master:

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/c5d10c8/Documentation/kube-flannel.yml

On each node that joins including the master:

$ sudo sysctl net.bridge.bridge-nf-call-iptables=1

0x03 其他节点设置

其他节点和master类似,最后需要执行下面的命令就可以了!

$ kubeadm join 172.16.3.1:6443 --token xo78oj.02cia85vdh285aqj --discovery-token-ca-cert-hash sha256:9517c72036f8261ac912adaf8339b65583fdaa7dbb8dd60054c6e84e8880a3fd

 


相关推荐

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

请填写验证码

支付宝

微信