KubeEdge 1.1 部署
本文介绍了如何在两台 ubuntu 16.04 64 bit 双核 CPU 虚拟机上从源码开始部署 KubeEdge 1.1.0 集群的过程,云端 Kubernetes 版本为 1.17.0,Golang 版本为1.12.4。本文具有一定实践参考意义。限于精力和能力,对本文所述不提供技术支持。
本文介绍了如何在两台 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:10000
和url: 127.0.0.1:10001
分别用云端IP替换,改为url: wss://192.168.0.102:10000
和url: 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
更多推荐
所有评论(0)