Wx::

KubeEdge 完整安装&部署

官方安装文档:Setup KubeEdge from sourcecode

KubeEdge,一个开源的边缘计算框架,分为 cloud 端和 edge 端,大致上就是通过云端对各边缘端的节点进行管理。

虽是基于 Kubernetes(K8S),但两者的关系好像也目测比较明显的一点便是 KubeEdge 很好的支持了 K8S API,因此命令行操作方式上很相似。

因为该方向技术还比较新,所以网上的教程大多不太完整,官方文档对我这初学者来说也还未能详尽。又涉及了 Docker、Kubernetes、Mosquitto 等技术,并且遇到了很大一个问题!网络!解决的办法要不就是搭梯子,搞全局代理,要不就是尽可能的在需要的地方换为国内的源,很多地方奇怪的报错都是因为网络不通,并不是真的有问题!

刚开始我选用了官方文档中提到的 一键安装 的方式,但其并 没有详细的报错指示,因此尝试多次之后还是放弃了,改用正常(且复杂)的 手动安装 方式。下文我会列出各部分环境配置所参考的文章,亲测有效。

在云端(cloud side)

1. ubuntu 16.04

选用了 Linux ubuntu 16.04 虚拟机,因为之前接触较少,所以啰嗦一下,分别配置了

  • 完整版 vim
  • root 身份登录
  • 防火墙
  • ssh
  • 网络梯子 ss 和 polipo(尤为重要,因为很多安装步骤可能需要国外的资源,但要注意在实际进行 KubeEdge 内部网络连接相关操作时需要关闭全局的代理,这部分有些繁琐)

该部分不详细展开了,有需要的小伙伴可以联系我呀。

2. Docker 18.06.0+

参考:

一个很方便且强大的平台,很多集群管理相关的技术好像都基于此,在命令行中通过 docker 命令与 docker daemon(守护进程,或者说 docker 后台服务器)交流,来完成一系列的操作。

我主要参考了 Ubuntu 安装 Docker CE 这篇文章,完成了 Docker 的环境配置。

注:如果 Docker 内的网络出现了什么问题,可以 systemctl restart docker 重启来试一下。

3. Kubernetes 1.14.1

  1. 学习 Kubernetes 基础,因为它的 kubectl 操作会在 KubeEdge 中频繁使用,所以需要先对这种集群管理的方式有个初步了解(我是第一次接触这方面哈)

  2. 需要安装 Kubernetes 相关的 kubeadm 和 kubectl,这部分我直接阅读了 这篇官方文档,注意不要忽略文档中 「Before you begin」 这一部分,这儿涉及了一些可能会在之后导致很隐蔽错误的地方,我遇到了一些问题并查到了一些资料来补充:

  3. 用 kubeadm 在云端创建集群,我参考了 这篇官方文档,但我开始阅读这篇文章的时候被它有所误导,正确的顺序应该是先 kubeadm init,再安装网络插件(我选用了 Calico 插件)。对于 kubeadm init,我查到了这篇资料:

4. Go

这里的 Go 不是 「开始」 的意思啊哈,是 Golang 环境,具体为:

  1. 下载:wget https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
  2. 解压:tar -C /usr/local -xzf go1.12.9.linux-amd64.tar.gz
  3. /etc/profile 中添加环境变量,可参考 这篇文章
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=$HOME/go
  4. 刷新系统环境变量 source /etc/profile

5. KubeEdge 的云端核心模块

我参考了 官方文章 中 「Setup cloud side」一直到 「Setup edge side」 部分的之前,一步步照着做便可。
其中遇到了一些问题:

  • coreDNS 模块状态未正常 runnning
  • ~/cmd/config/controller.yaml 中 kubeconfig 默认的路径 ~/.kube/config 虽然文件确实存在,但前台运行 ./cloudcore 时会报错找不到该文件(有时后台运行不易发现报错,应改为前台运行测试),因此将该文件复制至 /usr/local/kubeedge/config,并相应的修改了 yaml,因此不报错了

以上云端基本配置完成了,在文档中 「Deploy the edge node」 部分最后我们执行了 kubectl apply -f kubectl apply -f ~/cmd/yaml/node.json 命令,如果正常运行的话,我们的云端已经在等待边缘节点的加入了。

在边缘端(edge side)

1. ubuntu

同上文云端的 ubuntu 配置

2. Docker

同上文云端的 docker 配置

3. Mosquitto

参考:

简单来说,这是对 MQTT 协议的一个开源实现,用来使 KubeEdge 的边缘节点与具体的设备通信,并非用于云端、边缘端的通信。

安装也不复杂:

  1. 添加 apt-get 源:
    add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
    apt-get update
  2. 安装:
    apt-get install mosquitto

4. KubeEdge 的边缘核心模块

仍然,看着 这篇文档 的 「Setup edge side」 部分照着做便可。

顺着文档,配置完 KubeEdge 的云端模块和边缘端模块,便来到了 「Deploy Application on cloud side」 部分,文档中 kubectl apply -f deployment.yaml 命令是便是在边缘节点成功连接云端节点之后,向边缘节点发布一个 deployment(即一个任务或者说是作业),让边缘端节点来执行。这过程中我也遇到了一些问题:

  • 通过 kubectl get pods 发现边缘端某 pod 持续处于 ContainerCreating 状态时,可能是边缘端在执行 deployment 时确实发生了问题,一个问题可能是文档中已经提到的 Note: Currently, for edge node, we must use hostPort in the Pod container spec so that the pod comes up normally, or the pod will be always in ContainerCreating status. The hostPort must be equal to containerPort and can not be 0.,其他一些问题可能是:
  • Failed to get host IP: failed to get network interface:可能是默认的配置文件中的网络设置的 network interface 并非 ubuntu 中实际的网络接口的名字,应该根据自己机器的情况进行修改 edge.yaml 中默认的 netword interface
  • 报告端口占用,可能是之前占用此端口的 docker container 没有被清理掉,可以看 这篇

More: 基于 KubeEdge 的 Spark 部署

Spark 是大数据中一个很重要的技术,本着先装上再说的原则,我将其部署到了上文已经搭建的 KubeEdge 集群中。

1. 基础学习

参考:官网

2. 安装 Java 8

这个有很多教程,正常安装即可,我参考了 这篇文章 的前 5 步。

3. 安装 Scala 2.12

官网下载链接 下载,参考 这篇文章 配置即可。

4. 安装 Spark 2.4.4

直接 下载、解压到自定义的目录、配环境变量即可。

5. 配置并部署于 KubeEdge

讨论一下

参考 Spark 官网的 「Launching on a Cluster」 部分,我选用了 Standalone Deploy Mode 的部署方式,没有选用 Kubernetes(即 K8S)的部署方案,因为 KubeEdge 和 K8S 本质上是不同的,我认为对于 K8S 来说,所有 “节点” 处于 “同一平面”,节点没有明显的 “主次分别”,是一个 “平面” 上的集群,而 KubeEdge 有明显的 “控制端”(即云端)和 “受控端”(即边缘端)组成。查看 Spark 官方文档的说明可知,Kubernetes 部署方案的大致实现是 Spark 选用一个 pod 作为 master 节点,再选取若干 pod 作为 worker,而 KubeEdge 是不适合将边缘端的节点作为 master 的,所以我们采用了 standalone 的部署方案,将 Spark 的 master 放于云端,将 worker 节点放于边缘端,并使其连接到云端的 master,由 master 部署作业和调度,即可。

实现

那我们如何实现呢?

云端自然容易实现,根据 这里 说的直接启动 start-master 即可。
而对于边缘端,因为 KubeEdge 同样基于类似于 Kubernetes 的 docker 技术,即,我们需要将运行于边缘端的东西打包成 docker 的镜像,才能通过 KubeEdge 来分发部署。具体为:

  1. 在 cloud node 上手动启动 start-master

  2. 在边缘端节点上将 start-slave 的启动、连接 master 之类的步骤封装到 docker image(见下方附录),之后便可以通过 KubeEdge 的 deployment.yaml 将使该镜像在边缘端节点运行(这里确实有点复杂,可以留言交流)。

  3. 对于 Spark,在云端以 client mode 的方式 部署 application

  4. 部署 application 的额外参数、资源调度、executors调度、监控、日志等参考 这里

  • 用于构建 docker image 的 dockerfile:点击可下载

  • 用于构建 docker image 的目录:

spark-slave
|- Dockerfile
|- jdk-8u221-linux-x64.tar.gz
|- scala-2.12.10.tgz
|- spark-2.4.4-bin-hadoop2.7.gz
0

评论(0

评论 取消
验证码:
搜索