KubeEdge安装详细教程
(注:本安装教程主要参考⾃,但是在安装过程中⾃⼰也遇到了很多不同的问题,故转载,并记录于此)
本⽂介绍了在两台Ubuntu 18.04.3 LTS虚拟机下从源码开始部署 KubeEdge 1.1.0 集的过程,云端 Kubernetes 版本为 1.16.0,Golang 版本为1.12.4。
ubuntu安装教程1. 概述
1.1 环境
云端:Ubuntu 18.04.3 LTS,⽤户名为k8smaster。ip 为 192.168.179.131
边缘端:Ubuntu 18.04.3 LTS,⽤户名为k8slave1。ip 为 192.168.179.142
KubeEdge 部署需要的组件:(注意,本安装教程假定你已经在云端机器上安装好了k8s集和docker,并在边缘端机器上安装好了docker)
云端:docker, kubernetes 集和 KubeEdge 云端核⼼模块。
边缘端:docker, mqtt 和 KubeEdge 边缘端核⼼模块。
1.2 依赖
golang:版本1.12.14,移步下载(由于是源码编译,所以需要⽤到golang)
k8s版本:v1.16.0
mosquitto:直接通过apt-get安装
KubeEdge:v1.1.0
2. 准备
2.1 创建部署⽂件⽬录
本安装⽅法主要适⽤于初学者,因为初学者对于搭建集往往是⽐较陌⽣的。本⽂会先创建⼀个⽬录,存放各类安装过程中需要的⽂件。
创建部署⼯程⽬录:
# mkdir /home/kkbill/kubeedge
创建⼦⽬录:
# cd /home/kkbill/kubeedge
# mkdir cloud edge certs yamls src
说明:
cloud:云端相关⽂件,包括 cloudcore 和配置⽂件。
edge:边缘端相关⽂件,包括 edgecore 和配置⽂件。
certs:证书⽂件。
yamls:⼀些 yamls ⽂件。
src:源码⽬录,存放kubeedge源码。
2.2 KubeEdge ⼆进制
获取KubeEdge的⽅式有两种,⼀种是直接从官⽹() 中下载(本实验版本为kubeedge-v1.1.);另⼀种⽅法是通过源码编译得到。这⾥介绍⼀下源码编译的⽅法(嗯,折腾...)
2.2.1 Golang环境搭建
(1) 下载golang,并解压
# wget studygolang/dl/golang/go1.12.14.
# tar -C /usr/local -xzf  go1.12.14.
(2) 添加环境变量
在~/.bashrc⽂件末尾添加:
# vim ~/.bashrc
export GOPATH=/home/kkbill/kubeedge
export PATH=$PATH:/usr/local/go/bin
保存后记得执⾏ source ~/.bashrc ⽣效。验证:
# go version
# go version go1.12.14 linux/amd64
2.2.2 下载kubeedge源码
# git clone github/kubeedge/kubeedge.git $GOPATH/src/github/kubeedge/kubeedge
2.2.3 检测gcc是否安装
# gcc --version
如果没有,则⾃⾏安装。
2.2.4 编译云端
# cd $GOPATH/src/github/kubeedge/kubeedge/
# make all WHAT=cloudcore
⽣成⼆进制 cloudcore ⽂件位于 cloud ⽬录。拷贝 cloudcore 和同⼀⽬录的配置⽂件(conf⽬录)到部署⼯程⽬录:
# cp -a cloud/cloudcore $GOPATH/cloud/
# cp -a cloud/conf/ $GOPATH/cloud/
在编译的时候遇到了第⼀个坑,就是版本的问题。由于最新clone下来的版本已经不是v1.1.0了,所以,我们需要把代码切回到v1.1.0版本,操作如下:(如果你在这⼀步⽆异常,则跳过)
在 $GOPATH/src/github/kubeedge/kubeedge ⽬录下,执⾏ git tag,并选择 v1.1.0 即可
# git tag
...
v1.1.0
...
# git checkout v1.1.0 执⾏完这⼀句后,代码就会回到v1.1.0版。
2.2.5 编译边缘端
# cd $GOPATH/src/github/kubeedge/kubeedge/
# make all WHAT=edgecore
⽣成⼆进制 edgecore ⽂件位于 edge ⽬录。拷贝⼆进制及配置⽂件到部署⼯程⽬录:
# cp -a edge/edgecore $GOPATH/edge/
# cp -a edge/conf/ $GOPATH/edge/
这⾥⼜遇到了第2个坑,即出现如下错误:
/usr/local/go/pkg/tool/linux_amd64/link: signal: killed
这是由于编译需要较⼤的内存,⽽内存不够,造成了OOM。对应的解决办法:增加内存
(1) 创建要作为swap分区的⽂件:增加1GB⼤⼩的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=⽂件⼤⼩)。
# dd if=/dev/zero of=/root/swapfile bs=1M count=1024
(2) 格式化为交换分区⽂件:
mkswap /root/swapfile #建⽴swap的⽂件系统
(3) 启⽤交换分区⽂件:
swapon /root/swapfile #启⽤swap⽂件
解决这个问题,参考了:
/t/go-build-exits-with-signal-killed/513
segmentfault/a/1190000012219689
wwwblogs/spjy/p/7085389.html
2.3 ⽣成证书
# $GOPATH/src/github/kubeedge/kubeedge/build/tools/certgen.sh genCertAndKey edge
# cp -a /etc/kubeedge/* $GOPATH/certs
⽣成的 ca 和 certs 分别位于 /etc/kubeedge/ca 和 /etc/kubeedge/certs ⽬录,将其拷贝到部署⼯程⽬录的 certs ⽬录。注意,这是在云端机器执⾏,所以云端已经有了证书,拷贝到 certs ⽬录,是为了⽅便分发到边缘节点
2.4 拷贝设备模块和设备CRD yaml ⽂件
# cp GOPATH/src/github/kubeedge/kubeedge/build/crds/devices/* GOPATH/yamls
2.5 拷贝node.json
# cp GOPATH/src/github/kubeedge/kubeedge/build/node.json GOPATH/cloud
释义:node.json 为节点的配置信息,需要在云端机器执⾏,作⽤是将边缘端加⼊集(但实际上只是让 k8s 知道有这个节点,还不是真正意义上的加⼊)
2.6 配置云端节点
打开配置⽂件 $GOPATH/cloud/conf/controller.yaml ,修改两处 master 的值,将master修改为 k8s 的apiserver的地址,在我的配置中,修改为:192.168.179.131:6443
这个地址当然就是云端这台机器的ip,那么端⼝是怎么来的?你可以从/etc/kubernetes/manifests/kube-apiserver.yaml 中到答案,如下图所⽰:
(当然,这⾥的前提是你已经装好了kubernetes,但是安装 kubernetes 不在本教程范围。)
这⾥提醒⼀下,我在第⼀次安装的时候,由于⾃⾝对k8s也还⾮常的不了解,还不知道是查看kube-apiserver.yaml,所以错写成了http,这个错误让我废了很长的时间才解决。另外,还需要将kubeconfig的值修改为:/root/.kube/config
这⼀步也存在⼀个坑,如果设置不正确,可能会导致 cloudcore 启动失败,出现如下错误:
E0102 17:53:58.630318 :125] github/kubeedge/kubeedge/cloud/pkg/devicecontroller/:40: Failed to list *v1alpha1.Device: the server rejected our request for an unknown reason (get devices.devices.kubeedge.io)
E0102 17:53:58.630335 :125] github/kubeedge/kubeedge/cloud/pkg/devicecontroller/:40: Failed to list *v1alpha1.DeviceModel: the server rejected our request for an unknown reason (get devicemodels.devices.kubeedge.io)
W0102 17:53:58.632435 :51] new downstream controller failed with error: the server rejected our request for an unknown reason (get nodes)
这⼀问题在有讨论,我也是从这个issue中摸索出了⾃⼰的解决⽅案。
2.7 配置边缘节点
打开配置⽂件$GOPATH/edge/conf/edge.yaml ,将如下两处ip换成你⾃⼰的云端主机的ip。
另外,由于在v1.1.0版本中,边缘节点名称为fb4ebb70-2783-42b8-b3ef-63e2fd6d242e,这不⽅便阅读,我们将其修改为edge-node。在edge.yaml⽂件中把所有 fb4ebb70-2783-42b8-b3ef-63e2fd6d242e 的值替换为 edge-node。
此外,还有⾮常重要的⼀点是,注意该⽂件中 cgroup-driver 字段的值,默认情况下是 cgroupfs,有些
⽂章不说明具体原因就让你将其修改为 sysemd,这是不负责的。这⾥是否需要修改该字段的值取决于你安装的docker的cgroup-driver是什么,原则就是要保持两者⼀直,若不⼀致,就会出现致命的问题。
可以通过 docker info 命令查看已安装的docker的cgroup-driver,确定好后,再决定是否修改edge.yaml ⽂件中cgroup-driver的值。
这⾥我也踩过坑,第⼀次安装时未经检查,就盲⽬修改了该字段的值,导致最后边缘节点的状态始终是NotReady,这个问题在issue列表中也有讨论,详见。
2.8 安装mqtt
mqtt只需要在边缘端安装。由于我使⽤的是ubuntu系统,直接使⽤apt-get,如下:
# add-apt-repository ppa:mosquitto-dev/mosquitto-ppa // 添加源
# apt-get update // 更新
# apt-get install mosquitto // 安装
3. 部署
前⾯已经准备好了所需要的配置⽂件,现在,只需要将证书和边缘端的⽂件拷贝到边缘机器上,使⽤ scp 命令进⾏拷贝。(当然,你也可以在边缘机器上完成上⾯的2.7节。)
在云端主机上进⾏操作,192.168.179.142是边缘端的ip。
# ssh 192.168.179.142 "mkdir -p /etc/kubeedge /home/kkbill/kubeedge/edge"
# scp -r GOPATH/certs/* 192.168.179.142:/etc/kubeedge # scp -r GOPATH/edge/* 192.168.179.142:/home/kkbill/kubeedge/edge
这⾥可能会涉及到⼀些permission deny的问题,这是由于 scp 命令造成的,这个问题不难,⾃⼰解决⼀下。
3.1 云端
⾸先进⼊部署⼯程⽬录:cd /home/kkbill/kubeedge
3.1.1 添加边缘端到集
# kubectl apply -f cloud/node.json
注意:在执⾏该命令前,务必修改node.json⽂件的值,如下,把name字段的值由 fb4ebb70-2783-42b8-b3ef-63e2fd6d242e 的值替换为 edge-node。
此时,查看节点状态,边缘端未就绪。如下:
# kubectl get nodes
NAME        STATUS      ROLES  AGE    VERSION
edge-node NotReady    edge      9s
k8smaster  Ready          master    15h      v1.16.0
3.1.2 创建设备模块和设备CRD
# kubectl apply -f yamls
注意,yamls ⽬录有2个 yaml ⽂件,此处指定⽬录,会⾃动执⾏⽬录所有⽂件。
3.1.3 运⾏cloudcore
# cd  cloud
# ./cloudcore
可能会出现如下错误:
github/kubeedge/kubeedge/cloud/pkg/edgecontroller/:31: Failed to list *v1.Secret: Get x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
参考这⾥的讨论,我忘了当时是怎么解决这个问题的了...
3.2 边缘端
该部分在边缘端机器上进⾏。
⾸先,在边缘端运⾏mqtt:
# mosquitto -d -p 1883
然后进⼊部署⼯程⽬录:cd /home/kkbill/kubeedge/edge,并运⾏ edgecore
# ./edgecore
3.3 验证
在云端查看状态:
# kubectl get nodes
NAME        STATUS    ROLES    AGE    VERSION
edge-node  Ready        edge        8h      v1.15.3-kubeedge-v1.1.0
k8smaster    Ready        master    173d  v1.16.0
这个时候,edge-node 的状态就变成了 Ready。到这⾥,基本上算是搭建完成了。
Processing math: 0%