❝KubeEdge 是一个开源系统,可将本机容器化的业务流程和设备管理扩展到 Edge 上的主机。它基于 Kubernetes 构建,并为网络,应用程序部署以及云与边缘之间的元数据同步提供核心基础架构支持。它还支持 MQTT,并允许开发人员编写自定义逻辑并在 Edge 上启用资源受限的设备通信。KubeEdge 由云部分和边缘部分组成,本文基于 kubeEdge1.14 和 centos7, k8s1.18.3 进行部署调试
1.系统配置与部署
1.1 环境信息
角色 | IP | 服务部署 |
---|---|---|
云端 | 10.20.3.112 | k8s 的 master,docker,cloudcore |
边缘端 | 10.20.3.113 | docker,edgecore |
边缘端 | 10.20.3.109 | docker,edgecore |
以上机器都要安装 docker,由于云端是 k8s 的 master,而我已经装好了,所以不需再去执行,只需边缘端执行以下操作就可以!,如果你没有现成的 k8s 集群,就需要所有的机器都要执行,且云端需要部署一套 k8s 集群。
1.2 关闭防火墙及 selinux (边缘端)
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
禁用 selinux
setenforce 0
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
1.3 关闭 swap (边缘端)
sed -i 's/.*swap.*/#&/' /etc/fstab
echo vm.swappiness=0 >> /etc/sysctl.conf
1.4 设置主机名 (边缘端)
hostnamectl set-hostname ke-edge1 #设置成对应的主机名
1.5 安装 docker (边缘端)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
systemctl enable docker
systemctl start docker
1.6 重启机器 (边缘端)
reboot
2. kubeEdge 安装与配置
2.1 云端配置
云端主要是负责编译 kubeEdge 的相关组件与运行 cloudcore,所以需要准备 golang 环境,以及需要去官方 github 上拉取源码,进行编译
2.2 配置 golang 环境
wget https://golang.google.cn/dl/go1.14.4.linux-amd64.tar.gz
tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local
配置 golang 环境变量
vim /etc/profile
文件末尾追加
# golang env
export GOROOT=/usr/local/go
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# source /etc/profile
# mkdir -p /data/gopath && cd /data/gopath
# mkdir -p src pkg bin
2.3 配置 cloudcore
下载 kubeEdge 源码
由于从github上下载比较慢,这里使用加速地址
git clone https://hub.fastgit.org/dogfei/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge
编译 keadm
# cd $GOPATH/src/github.com/kubeedge/kubeedge
# make all WHAT=keadm
说明:编译后的二进制文件在./_output/local/bin下,单独编译cloudcore与edgecore的方式如下:
# make all WHAT=cloudcore
# yum -y install gcc
# make all WHAT=edgecore
将编译好的二进制文件 copy 到/usr/local/bin 中
cp _output/local/bin/* /usr/local/bin/
创建 cloudcore 节点
keadm init --advertise-address="10.20.3.112"
期间会远程拉取一些yaml文件,耐心等待即可,最后出现如下输出表示成功
Kubernetes version verification passed, KubeEdge installation will start...
......
KubeEdge cloudcore is running, For logs visit: /var/log/kubeedge/cloudcore.log
CloudCore started
3. Edge 端配置
Edge 端也通过 keadm 进行配置,可以将 cloud 端编译生成的二进制文件 scp 到 Edge 端
scp -P 2222 -r _output/local/bin/* root@10.20.3.109:/usr/local/bin/
3.1 从云端获取令牌 token (云端)
获取的令牌用于边缘节点加入时使用,类似于 k8s 的节点加入集群中
# keadm gettoken
8684deb4b3273edeb2af5f22e91b17ded18a9f2bc18b9ddd9000ba2f5ef580b2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDQ0ODg2NzR9.4mRutBzfKLLqu4-oM_IvZrbmXPdQB5QeQawB7cXjcDU
3.2 加入边缘节点
两台机器分别执行以下命令
# keadm join --cloudcore-ipport=10.20.3.112:10000 --token=8684deb4b3273edeb2af5f22e91b17ded18a9f2bc18b9ddd9000ba2f5ef580b2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDQ0ODg2NzR9.4mRutBzfKLLqu4-oM_IvZrbmXPdQB5QeQawB7cXjcDU
出现以下输出表示安装成功
KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -b
可能期间会遇到报错,可以参考下面的问题记录
3.3 验证
边缘端 edgecore 启动成功后,会与云端的 cloudcore 进行通信,并且边缘端会加入到 k8s 集群中,所以可以使用 kubectl 命令进行验证
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready master 126m v1.18.3
k8s-node01 Ready <none> 125m v1.18.3
k8s-node02 Ready <none> 125m v1.18.3
ke-edge1 Ready agent,edge 18m v1.18.6-kubeedge-v1.4.0
# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-kube-controllers-76d4774d89-phznw 1/1 Running 0 126m 10.100.0.131 k8s-master01 <none> <none>
calico-node-8nxpq 1/1 Running 0 126m 10.20.3.107 k8s-node01 <none> <none>
calico-node-dss8j 1/1 Running 0 126m 10.20.3.108 k8s-node02 <none> <none>
calico-node-lsqdd 1/1 Running 0 126m 10.20.3.112 k8s-master01 <none> <none>
calico-node-rcb8r 0/1 Init:Error 5 19m <none> ke-edge1 <none> <none>
coredns-546565776c-9skt7 1/1 Running 0 126m 10.100.0.128 k8s-master01 <none> <none>
coredns-546565776c-c69cr 1/1 Running 0 126m 10.100.0.130 k8s-master01 <none> <none>
官方上是这样说的:
这里由于edge节点没有部署kubelet,
所以调度到edge节点上的calico pod会创建失败。这不影响KubeEdge的使用,可以先忽略这个问题
4. 运行 kubeedge 示例
这里拿官方的一个例子,进行测试,官方介绍如下:
❝KubeEdge Counter Demo 计数器是一个伪设备,用户无需任何额外的物理设备即可运行此演示。计数器在边缘侧运行,用户可以从云侧在 Web 中对其进行控制,也可以从云侧在 Web 中获得计数器值,原理图如下:
4.1 准备工作 (云端操作)
下载示例代码:
# 使用官方的示例仓库会比较慢,这里使用加速仓库
git clone https://hub.fastgit.org/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples
4.2 下载 device model 和 device
创建 device model
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
kubectl create -f kubeedge-counter-model.yaml
创建 model
#需要根据实际情况修改yaml文件,修改matchExpressions
# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
# vim kubeedge-counter-instance.yaml
apiVersion: devices.kubeedge.io/v1alpha1
kind: Device
metadata:
name: counter
labels:
description: 'counter'
manufacturer: 'test'
spec:
deviceModelRef:
name: counter-model
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: 'kubernetes.io/hostname'
operator: In
values:
- ke-edge1 # 我这里的hostname就是ke-edge1
status:
twins:
- propertyName: status
desired:
metadata:
type: string
value: 'OFF'
reported:
metadata:
type: string
value: '0'
# 运行yaml
# kubectl create -f kubeedge-counter-instance.yaml
4.3 部署云端应用
云端应用 web-controller-app 用来控制边缘端的 pi-counter-app 应用,该程序默认监听的端口号为 80,此处修改为 8089,如下所示:
# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app
# vim main.go
package main
import (
"github.com/astaxie/beego"
"github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app/controller"
)
func main() {
beego.Router("/", new(controllers.TrackController), "get:Index")
beego.Router("/track/control/:trackId", new(controllers.TrackController), "get,post:ControlTrack")
beego.Run(":8089")
}
构建镜像
注意:构建镜像时,请将源码拷贝到GOPATH对应的路径下,如果开启了go mod请关闭。
# make all
# make docker
这里会进行构建jngxiang的操作
部署 web-controller-app
# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
# kubectl apply -f kubeedge-web-controller-app.yaml
部署边缘端应用
修改代码与构建镜像 需要将 Makefile 中的 GOARCH 修改为 amd64 才能运行该容器。
# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/counter-mapper
# vim Makefile
.PHONY: all pi-execute-app docker clean
all: pi-execute-app
pi-execute-app:
GOARCH=amd64 go build -o pi-counter-app main.go
docker:
docker build . -t kubeedge/kubeedge-pi-counter:v1.0.0
clean:
rm -f pi-counter-app
# make all
# make docker
部署 Pi Counter App
# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
# kubectl apply -f kubeedge-pi-counter-app.yaml
说明:为了防止Pod的部署卡在`ContainerCreating`,这里直接通过docker save、scp和docker load命令将镜像发布到边缘端
# docker save -o kubeedge-pi-counter.tar kubeedge/kubeedge-pi-counter:v1.0.0
# scp -P 2222 kubeedge-pi-counter.tar root@10.20.3.109:/root
# docker load -i kubeedge-pi-counter.tar # 在边缘端执行
体验 demo 现在,KubeEdge Demo 的云端部分和边缘端的部分都已经部署完毕,如下:
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubeedge-counter-app-6984dcb4dd-jz5nh 1/1 Running 0 32m 10.20.3.112 k8s-master01 <none> <none>
kubeedge-pi-counter-784d57c5d4-27v5g 1/1 Running 0 30m <none> ke-edge1 <none> <none>
访问测试 因为使用的 hostNetwork 模式,所以直接访问即可
选择ON
点击Execute
去边缘节点使用docker logs -f counter-container-id
问题记录
错误一
❝Converted 0 files in 0 seconds. kubeedge-v1.4.0-linux-amd64.tar.gz checksum: checksum_kubeedge-v1.4.0-linux-amd64.tar.gz.txt content: Output failed: exit status 1 Error: failed to run command(chmod +x /etc/kubeedge/edgecore), err:exit status 1
如果出现这个报错,需要进到/etc/kubeedge/
目录下,解压kubeedge-v1.4.0-linux-amd64.tar.gz
这个压缩包,然后手动进行拷贝
cp kubeedge-v1.4.0-linux-amd64/edge/edgecore /etc/kubeedge/
然后,重新keadm join
即可
错误二
❝F1104 18:03:19.701956 15614 keadm.go:27] failed to run command(cd /etc/kubeedge/ && sudo -E wget -k --no-check-certificate https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.4/build/tools/edgecore.service), err:exit status 4
可能是网络问题,需要手动下载下这个文件或者直接创建一个
# cd /etc/kubeedge
# vim edgecore.service
[Unit]
Description=edgecore.service
[Service]
Type=simple
ExecStart=/etc/kubeedge/edgecore
[Install]
WantedBy=multi-user.target
然后,重新keadm join
即可
错误三
如果在云端执行kubectl get nodes
能看到新加入的边缘端,但是处于Not Ready
状态,然后重新执行keadm join
进行加入一直失败,且 edgecore 和 edgecore.service 文件都存在,不妨试试在云端把边缘端踢掉
kubectl delete node ke-edge1
然后再次重新keadm join
错误四
如果在访问时ip:8089
点击 execute 没反应,浏览器 f12 查看请求https://code.jquery.com/jquery-1.10.2.min.js
失败,则需要修改源码,重新编译,方法如下:
cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app/views
vim layout.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>KubeEdge Web Demo {{.Title}}</title>
<meta content="" name="description">
<meta content="" name="author">
<script src="/static/js/jquery-1.10.2.min.js"></script> #修改这一段,改成从本地js读取
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/bootstrap-select.js"></script>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/main.css">
<link rel="stylesheet" href="/static/css/bootstrap-select.css">
<link href='http://fonts.googleapis.com/css?family=Rambla' rel='stylesheet' type='text/css'>
{{.PageHead}}
<!-- Just for debugging purposes. Don't actually copy this line! -->
<!--[if lt IE 9]><script src="../../docs-assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211117_000ea91c-4779-11ec-bf48-fa163eb4f6be.png"></script>
<script src="https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211117_009ce09c-4779-11ec-bf48-fa163eb4f6be.png"></script>
<![endif]-->
</head>
<body>
{{.LayoutContent}}
{{.Modal}}
</body>
</html>
需要把 jquery-1.10.2.min.js 放到本地$GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app/static/js
下
然后重新编译,重复上面的操作就可以了
最后喜欢的朋友可以扫描下方二维码,关注我的公众号哦