kube-edge
KubeEdge 是一个开源的系统,可将本机容器化应用编排和管理扩展到边缘端设备。 它基于Kubernetes构建,为网络和应用程序提供核心基础架构支持,并在云端和边缘端部署应用,同步元数据。KubeEdge 还支持 MQTT 协议,允许开发人员编写客户逻辑,并在边缘端启用设备通信的资源约束。KubeEdge 包含云端和边缘端两部分。
安装
kube-edge 强调的“云边协同”概念,分为“云”部分和“边”部分。云部分基于完整的社区发行版kubernetes,需要自行安装。kube-edge 基于社区版本kubernetes进行扩展,发展边缘计算,将mqtt等适用于边缘计算的协议加载进入云中,通过适配层接入k8s。
安装整套kube-edge 需要先安装完成“云”环境,云环境参照社区k8s版本进行安装。完成后安装“kube-edge”扩展。
安装环境
使用openstack虚拟机:
主机名称 | IP | 备注 |
---|---|---|
kube-edge-1 | 10.0.1.153 | root/password |
kube-edge-2 | 10.0.1.157 | root/password |
kube-edge-3 | 10.0.1.72 | root/password |
前置设置
- 关闭防火墙
- 关闭selinux或者apparmor
安装docker
kube-edge-1 kube-edge-2 kube-edge-3 节点:
对于ubuntu centos等发行版可以使用 docker 提供的安装脚本进行安装。--mirror
参数指定docker源为阿里云源以提升安装速度。
每一台作为“云”端的主机均需要安装docker。
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
安装kubernetes
安装 kubelet kubeadm kubectl
参考Installing kubeadm
或者过内镜像Kubernetes 镜像
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <
安装kubernetes集群
kube-edge-1 节点:
可以选择先获取镜像(国内无法直接获取gcr镜像,需要通过国内源或者代理)
images=$(kubeadm config images list)
for image in ${images} ; do
name=${image#"k8s.gcr.io/"}
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${name}
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${name} ${image}
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${name}
done
docker images
或者kubeadm init时指定repository为国内地址
kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers/ --pod-network-cidr 10.240.0.0/16 --v 5
执行安装:
kubeadm init --pod-network-cidr 10.240.0.0/16 --v 5
配置kubelet
kube-edge-1 节点:
安装完成后:
kubelet 环境文件 "/var/lib/kubelet/kubeadm-flags.env"
kubelet 配置文件 "/var/lib/kubelet/config.yaml"
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件
kube-edge-1 节点:
以flannel为例:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
扩展节点
留意kubeadm init
后的输出,可寻找到token用于新增节点至已有集群。
kubeadm join 10.0.1.153:6443 --token ltuf9t.gyimo6d8n53xk4os \
--discovery-token-ca-cert-hash sha256:b09492fbb6f793274c6a395d26045e62a77fa1a156ebe1ff74803942015d6a16
安装kube-edge
下载kube-edge
仅需要下载 keadm 工具即可,其会自动下载相关需要的文件。
如果下载失败,可以预先下载对应的文件至目录 /etc/kubeedge/
# keadm version
version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.0", GitCommit:"8b0913e04ef4ef826af6715d336e23a66e3774df", GitTreeState:"clean", BuildDate:"2020-11-13T08:04:56Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
# wget -P /etc/kubeedge/ https://github.com/kubeedge/kubeedge/releases/download/v1.5.0/kubeedge-v1.5.0-linux-amd64.tar.gz
配置“云”端
kube-edge-1 节点:
# keadm init
...
# keadm gettoken
89358eec8392985968899207038ea7118f0b627ffc2e56bf5ec8310c52b051ac.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDg2MDg4MTh9.bvOSdKD7DMxLPYsX66lwBGVTDSQ0UWKWKFFzlIT7HWU
配置“边”端
kube-edge-2 节点:
keadm join --cloudcore-ipport=10.0.1.153:10000 --token=89358eec8392985968899207038ea7118f0b627ffc2e56bf5ec8310c52b051ac.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDg2MDg4MTh9.bvOSdKD7DMxLPYsX66lwBGVTDSQ0UWKWKFFzlIT7HWU
边端设备会安装mqtt服务器,以及启动针对边缘设备接入的http服务器等。
介绍
KubeEdge 由以下组件构成:
云上部分
- CloudHub: CloudHub 是一个 Web Socket 服务端,负责监听云端的变化, 缓存并发送消息到 EdgeHub。
- EdgeController: EdgeController 是一个扩展的 Kubernetes 控制器,管理边缘节点和 Pods 的元数据确保数据能够传递到指定的边缘节点。
- DeviceController: DeviceController 是一个扩展的 Kubernetes 控制器,管理边缘设备,确保设备信息、设备状态的云边同步。
边缘部分
- EdgeHub: EdgeHub 是一个 Web Socket 客户端,负责与边缘计算的云服务(例如 KubeEdge 架构图中的 Edge Controller)交互,包括同步云端资源更新、报告边缘主机和设备状态变化到云端等功能。
- Edged: Edged 是运行在边缘节点的代理,用于管理容器化的应用程序。
- EventBus: EventBus 是一个与 MQTT 服务器(mosquitto)交互的 MQTT 客户端,为其他组件提供订阅和发布功能。
- ServiceBus: ServiceBus是一个运行在边缘的HTTP客户端,接受来自云上服务的请求,与运行在边缘端的HTTP服务器交互,提供了云上服务通过HTTP协议访问边缘端HTTP服务器的能力。
- DeviceTwin: DeviceTwin 负责存储设备状态并将设备状态同步到云,它还为应用程序提供查询接口。
- MetaManager: MetaManager 是消息处理器,位于 Edged 和 Edgehub 之间,它负责向轻量级数据库(SQLite)存储/检索元数据。
架构
从架构上看,其依赖于k8s apiserver。是需要附加于已有的k8s集群之上,依赖于已有k8s集群。
功能
kubeedge 云上部分和k8s功能无差别,主要为k8s 功能。
在kubeedge概念中,edge设备与cloud设备无法双向互通,其假设cloud端开发一个用于公开访问的端点(即cloudcore的websocket端点),edge设备通过该端点与cloud 同步,上报节点信息,接受cloud任务下发。
其中运行在edge边的部分由edgecore实际控制,edgecore还向更下层设备提供http/mqtt接口用于更下层设备接入。其本身亦可为执行工作负载。
下图描述了一个典型的应用场景
核心能力
kubeedge总体来说解决了两个问题:
- 解决了云边网络不对等问题。精简/重新设计的edgehub,解决了云无法直接访问边缘设备的问题。将原kubelet的通信和功能使用websocket进行实现。由边缘设备发起链接,通过云中的配套服务转换注册进入云集群。
- 边缘设备管理与消息处理。
- 设备型号注册。将一个型号的设备和其属性以k8s自定义资源注册进入云端,支持定义其属性,属性定义用于确定消息下发的数据结构。
- 设备实例管理。将实际运行的边缘设备实例以k8s自定义资源注册进入云端,在云端对属性进行更改后,通过边缘设备mqtt将消息推送至边缘设备,边缘设备针对属性更改进行实际处理。
- 设备实例操作。提供http接口对已经注册的边缘设备属性进行更改,更改会通过kubeedge转换为mqtt消息下发至对应设备。
资源占用
在1vCPU2GB
内存机器中,空载 edgecore 进程信息:
# top -p 35553
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
35553 root 20 0 1393868 81924 52304 S 3.7 4.0 1:43.06 edgecore
# systemctl status edgecore.service
● edgecore.service
Loaded: loaded (/etc/systemd/system/edgecore.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-12-21 07:18:55 UTC; 1h 7min ago
Main PID: 35553 (edgecore)
Tasks: 12 (limit: 2344)
Memory: 32.1M
CGroup: /system.slice/edgecore.service
└─35553 /etc/kubeedge/edgecore