kubeedge安装

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 <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

安装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)存储/检索元数据。

架构

kubeedge_arch.png

从架构上看,其依赖于k8s apiserver。是需要附加于已有的k8s集群之上,依赖于已有k8s集群。

功能

kubeedge 云上部分和k8s功能无差别,主要为k8s 功能。

在kubeedge概念中,edge设备与cloud设备无法双向互通,其假设cloud端开发一个用于公开访问的端点(即cloudcore的websocket端点),edge设备通过该端点与cloud 同步,上报节点信息,接受cloud任务下发。

其中运行在edge边的部分由edgecore实际控制,edgecore还向更下层设备提供http/mqtt接口用于更下层设备接入。其本身亦可为执行工作负载。

下图描述了一个典型的应用场景

kubeedge.drawio.png

核心能力

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

推荐阅读更多精彩内容