本文介绍了如何在两台 ubuntu 16.04 64 bit 双核 CPU 虚拟机上从源码开始部署 KubeEdge 1.1.0 集群的过程,云端 Kubernetes 版本为 1.17.0,Golang 版本为1.12.4。本文具有一定实践参考意义。限于精力和能力,对本文所述不提供技术支持。

一、概述

1.1 环境

云端:ubuntu 16.04 64 bit,用户名为 ubuntu。IP 为 192.168.0.102。
边缘端:同上,IP 为 192.168.0.140。
KubeEdge部署涉及两端:

  • 云端
    docker, kubernetes 集群和 KubeEdge 云端核心模块。
  • 边缘端
    docker, mqtt 和 KubeEdge 边缘端核心模块。

1.2 依赖

依赖组件(含工具、编译器)及版本:

  • golang
    版本 1.12.14,到 https://studygolang.com/dl 下载。编译源码需要,如果不编译,则无须安装。需要指出的是,KubeEdge 对 golang 版本有兼容性,根据当前官方要求,需要使用 1.12 版本 golang,因为不管是最新代码,还是已发布的 1.1.0 版本,都不支持 1.13 版本 golang。
  • k8s 版本
    1.17,具体部署参考其它文章。根据当前官方文档,只支持 1.16 版本,但本文部署的是 1.17,亦无问题。
  • mosquitto
    1.6.8, 到 https://mosquitto.org/download/ 下载。
  • KubeEdge 相关的(云端、边缘端)
    v1.1.0, 到 https://github.com/kubeedge/kubeedge/releases 下载。
    注意,github并不是一直都十分稳定,所以下载可能会较耗时。

1.3 方法论

最权威的莫过于 KubeEdge 官方安装文档:https://docs.kubeedge.io/en/latest/setup/setup.html 。该文档从源码编译到安装,均有涉及。然作为初学者,个人认为官方的文档还不够细致。网上也有很多安装部署教程,虽然方法不同,但目的是一样的。这里根据笔者经验简述如下:

  • 步步为营
    根据官方文档安装,先产生证书,再编译源码得到云端和边缘端核心程序。再修改配置文件,最后运行。

  • 事预则立
    下载官方编译好的二进制文件(cloudcore、edgecore),或者自行编译源码得到这两个二进制文件。准备好配置文件(并做适应性修改)。然后再运行。本文采用此方式。先准备好所有的文件,并统一放置到部署工程目录。

需要注意的是,KubeEdge 官方文档只涉及 KubeEdge 有关的部署,KubeEdge 还要依赖 docker 和 kubernetes(边缘端还要依赖 mosquitto)。而这些需要实践者额外进行,为减少篇幅,本文不过多涉及,但给出部署文章链接。

二、准备

2.1 创建部署文件目录

创建部署工程目录

# mkdir ~/kubeedge

创建子目录:

# cd ~/kubeedge
# mkdir cloud edge certs yamls src

作用:
cloud:云端相关文件,包括 cloudcore 和配置文件。
edge:边缘端相关文件,包括 edgecore 和配置文件。
certs:证书文件。
yamls:一些 yamls 文件。
src:源码目录(不创建克隆代码时自动创建)。

2.2 KubeEdge 二进制

** 本文使用的 KubeEdge 是从源码编译得到。**

2.2.1 官方编译好的文件

到 https://github.com/kubeedge/kubeedge/releases 下载官方编译好的二进制。压缩包名称为 kubeedge-v1.1.0-linux-amd64.tar.gz 。
也可以通过编译源码得到,方法参考文后。
另外,除了编译好的二进制外,还需要下载源码,地址为: https://github.com/kubeedge/kubeedge 。因为部分配置文件只在仓库源码中才可找到(当然,也可以直接在 github 仓库上找到对应的文件下载)。

2.2.2 KubeEdge 源码编译

1、Golang 环境搭建
下载好 golang,并解压:

# mkdir ~/tools
# tar xf go1.12.14.linux-amd64.tar.gz -C ~/tools

在 ~/.bashrc 文件最后添加:

export PATH=$PATH:/home/ubuntu/tools/go/bin
export GOROOT=/home/ubuntu/kubeedge
export GOPATH=/home/ubuntu/kubeedge

执行 source ~/.bashrc 生效。验证:

# ubuntu@ubuntu:~/kubeedge$ go version
go version go1.12.14 linux/amd64

2、克隆仓库:

# git clone https://github.com/kubeedge/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge

如果克隆速度慢,可以直接下载zip包,并解压源码到 $GOPATH/src/github.com/kubeedge/kubeedge,注意,这个目录一定是源码所在目录。
3、检测 gcc 版本:

# gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.

如果没有安装 gcc,则自行安装。

编译云端:

# cd $GOPATH/src/github.com/kubeedge/kubeedge/
# make all WHAT=cloudcore

生成二进制 cloudcore 文件位于 cloud 目录。拷贝 cloudcore 和同一目录的配置文件(conf目录)到部署工程目录:

# cp -a cloud/cloudcore ~/kubeedge/cloud/
# cp -a cloud/conf/ ~/kubeedge/cloud/

编译边缘端:

cd $GOPATH/src/github.com/kubeedge/kubeedge
make all WHAT=edgecore

生成二进制 edgecore 文件位于 edge 目录。拷贝二进制及配置文件到部署工程目录:

# cp -a edge/edgecore ~/kubeedge/edge/
# cp -a edge/conf/ ~/kubeedge/edge/

2.3 生成证书

# $GOPATH/src/github.com/kubeedge/kubeedge/build/tools/certgen.sh genCertAndKey edge

# cp -a /etc/kubeedge/* ~/kubeedge/certs

ca 和 certs 分别位于 /etc/kubeedge/ca 和 /etc/kubeedge/certs 目录,将其拷贝到部署工程目录的 certs 目录。注意,这是在云端机器执行,所以云端已经有了证书,拷贝到 certs 目录,是为了方便分发到边缘节点。

2.4 拷贝设备模块和设备CRD yaml 文件

cp $GOPATH/src/github.com/kubeedge/kubeedge/build/crds/devices/* ~/kubeedge/yamls 

2.5 拷贝 node.js

cp $GOPATH/src/github.com/kubeedge/kubeedge/build/node.json ~/kubeedge/cloud

释义:node.js 为节点的配置信息,需要在云端机器执行,作用是将边缘端加入集群(但实际上只是让 k8s 知道有这个节点,还不是真正意义上的加入)。

2.6 配置云端节点

打开配置文件 ~/kubeedge/cloud/conf/controller.yaml,修改两处 kubeconfig 的路径,注意,这个路径不能含变量、~ 等,否则会提示:

create kube client failed with error: stat $HOME/.kube/config: no such file or directory  
start unix domain socket server

官方默认为kubeconfig: "/root/.kube/config",本文改为 kubeconfig: "/home/ubuntu/.kube/config"

2.7 配置边缘节点

打开配置文件 ~/kubeedge/edge/conf/edge.yaml。
修改服务IP。将url: wss://0.0.0.0:10000url: 127.0.0.1:10001分别用云端IP替换,改为url: wss://192.168.0.102:10000url: 192.168.0.102:10001
将 cgroup-driver 的值改为 systemd,即cgroup-driver: systemd。因为云端的 k8s 也是使用 systemd,为统一起见,进行修改。
注:发布的v1.1.0版本,该文件的节点名称为fb4ebb70-2783-42b8-b3ef-63e2fd6d242e,需改为edge-node。master 仓库中的配置文件已是edge-node

至此,KubeEdge 云端和边缘端的二进制文件和配置已准备、修改完毕。未提及的使用官方默认配置。

2.8 mqtt

mqtt 只有边缘端需要
如果边缘端为 ubuntu 系统,直接使用源安装:

add-apt-repository ppa:mosquitto-dev/mosquitto-ppa // 添加源
apt-get update // 更新
apt-get install mosquitto // 安装

也可以使用源码编译。

2.9 Docker 和 kubernetes

Docker 安装可参考这里,kubernetes 安装可参考这里。需要指出的是,kubernetes 只部署 master 即可,node 无须部署。但必须安装网络插件(此处存疑,如果不安装,状态不是 Ready)。

三、部署

前面已经准备好了文件,直接部署就方便很多。注意,需要将证书和边缘端和文件拷贝到边缘机器上。方式多种,建议使用 scp 命令。前提是安装了 SSH 协议。拷贝(也称为分发)示例:

ssh 192.168.0.140 "mkdir -p /etc/kubeedge ~/kubeedge/edge"
scp -r ~/kubeedge/certs/* 192.168.0.140:/etc/kubeedge
scp -r ~/kubeedge/edge/* 192.168.0.140:~/kubeedge/edge/

释义:
将证书拷贝到边缘端机器的 /etc/kubeedge 目录。将边缘端文件拷贝到 ~/kubeedge/edge/ 目录。
笔者配置了 SSH 允许 root 登陆,并添加了公钥。所以无须输入密码。如无此方式,可手动拷贝。

3.1 云端

进入部署工程目录:

cd ~/kubeedge
3.1.1 部署 k8s 集群

具体部署另见文章,这里简述如下:
创建集群:

# kubeadm init --pod-network-cidr=10.244.0.0/16 \
  --image-repository registry.aliyuncs.com/google_containers

启动网络插件 flannel。

3.1.2 添加边缘端到集群
# kubectl apply -f cloud/node.json

查看节点状态:

# kubectl get nodes  
NAME        STATUS     ROLES    AGE   VERSION
edge-node   NotReady   edge     9s    
ubuntu      Ready      master   15h   v1.17.0

从输出信息看出,边缘端未就绪。

3.1.3 创建设备模块和设备CRD
# kubectl apply -f yamls

注意,yamls 目录有2个 yaml 文件,此处指定目录,会自动执行目录所有文件。

3.1.4 运行云端核心
# cd cloud
# ./cloudcore   // 建议先如此,方便观察日志

3.2 边缘端

进入边缘端机器的部署工程目录:

# cd ~/kubeedge/edge

运行边缘端核心:

# ./edgecore // 建议先如此,方便观察日志

运行 mqtt :

# mosquitto -d -p 1883

3.3 验证

在云端查看状态:

# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
edge-node   Ready    edge     23s   v1.15.3-kubeedge-v1.1.0
ubuntu      Ready    master   1h    v1.17.0

云端和边缘端均为 Ready 状态。

在云端部署一个应用:

# kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml

之后可以看到已经在边缘端运行了 nginx 容器。查看 pod:

# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP       NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-77698bff7d-bwc94   1/1     Running   1          1m56s   <none>   edge-node   <none>           <none>

在边缘端查看容器:

# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                NAMES
882570ac2dec        53f3fd8007f7         "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds                             k8s_nginx_nginx-deployment-77698bff7d-bwc94_default_4b4cdbcd-fcae-45d4-abb2-46ddd5c3c41e_1
183903d7816f        kubeedge/pause:3.1   "/pause"                 7 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp   k8s_POD_nginx-deployment-77698bff7d-bwc94_default_4b4cdbcd-fcae-45d4-abb2-46ddd5c3c41e_6

五、完善

为了方便查看日志,本文直接运行了云端和边缘端核心。为了符合生产环境,需要将其添加到系统服务,参考官网文档即可。要注意的是,核心程序和conf必须在同一目录。
前文已经整理好了部署脚本和程序,需要更新时,只需替换其中的文件即可。证书生成一次后可重复使用,只要保证云、边缘两者完全一致即可。
理论上应该使用脚本直接部署的,以笔者经验,初步接触者,不建议如此,还是一步一步来,但后续为了提高效率,还是建议使用脚本——因为部署过程基本上都是重复的工作。

六、后续

在 armv7 上实现边缘端的部署。
研究多个边缘端的应用场合。
研究不同系统的边缘端应用场合(如一为 x86,一为 armv7)。
研究 KubeEdge 源码(为提高 Golang 水平)。
边缘端信息中出现Failed to get host IP: failed to get network interface: eth0 err:route ip+net: no such network interface,暂未研究。

七、折腾

官方提供了一个 keadm 的部署工具,使用该工具部署时出现:

gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Error: failed to run 'sh -c cd /etc/kubeedge/ && tar -C /etc/kubeedge/ -xvzf kubeedge-v1.1.0-linux-amd64.tar.gz && cp /etc/kubeedge//kubeedge/edge/edgecore /usr/local/bin/.' because of error : exit status 2

跟踪源码,发现有部分路径不符合条件,鉴于 Golang 才接触一个月,放弃修改源码。

在阅读官方文档时,遇到了一些理解上的问题(更多是自身原因)。文档没有序号,仅靠标题大小区分,所以头几次阅读并不知道哪里是哪里。另外,这句话Please make sure edge-node is added in kubernetes.理解上出现偏差,我以为是要将边缘节点添加到 k8s 集群中(即在边缘端使用 kubeadm join 添加),实际上应该指部署 node.json 文件,将集群中添加一个节点。

参考

  • 官方源码仓库: https://github.com/kubeedge/kubeedge
  • 压缩包: https://github.com/kubeedge/kubeedge/releases
  • 官方安装文档:https://docs.kubeedge.io/en/latest/setup/setup.html
  • 一键安装脚本: https://github.com/du2016/one-step-install-kubeedge
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐