课程介绍

模块简介

本课程详细介绍了kubernetes容器云平台的部署过程以及kubeedge边缘计算环境的部署,此外详细介绍了云端数据监控服务的部署和智能边缘计算平台部署视觉服务。通过本模块的学习可以更好的掌握边缘计算的实际应用场景。

模块知识

(1)了解容器的概念。

(2)熟悉容器基础服务部署。

(3)掌握kubernetes环境搭建。

(4)掌握kubeedge环境搭建。

(5)掌握视觉服务的基本部署和应用过程

环境准备

准备四台虚拟机,包含3台4VCPU/12GB内存/100GB磁盘,另外包含一台桌面系统用来访问图形化页面。

部署测试节点规划,见表1。

表1 测试节点规划

IP 主机名 节点
10.26.3.33 k8s-master 云端主节点
10.26.3.34 k8s-node 云端从节点
10.26.18.145 kubeedge-node 边缘端节点
图形化节点

模块内容

边缘计算简介

边缘计算简介

(1)边缘计算概念

边缘计算是在靠近物或数据源头的网络边缘侧,通过融合网络、计算、存储、应用核心能力的分布式开放平台,就近提供边缘智能服务。简单点讲,边缘计算是将从终端采集到的数据,直接在靠近数据产生的本地设备或网络中进行分析,无需再将数据传输至云端数据处理中心。

OpenStack社区对其定义的概念同样也是:“边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和IT环境服务;目标是在靠近数据输入或用户的地方提供计算、存储和网络带宽。”

(2)边缘计算的作用

① 为什么要使用边缘计算?
通俗一点来讲,边缘计算的本质还是一种服务,类似与云计算、大数据的服务,但是与他们不一样的地方在于,这种服务是非常接进用户的。那为什么这种服务要那么接近于用户呢?答案非常简单就是为了让用户在在使用上有较强的体验,这种体验会让用户觉得自己刷什么内容都是非常快的。
② 边缘计算解决了哪些问题?背景是什么?
随着物联网技术的快速发展,使得越来越多具备独立功能的普通物体实现了互联互通,实现万物互联。得益于物联网的转型,各行各业均在利用物联网技术快速实现数字化转型,越来越多的行业终端设备通过网络联接起来。
然而物联网作为庞大而复杂的系统,不同行业的应用场景也是各异。根据第三方机构分析统计,到2025年将有超过千亿的终端设备联网,终端数据量将达300ZB,如此大规模的数据量,按照传统数据处理方式,获取的所有数据均需上送云计算平台分析,云计算平台将面临着网络时延高、海量设备接入、海量数据处理难、带宽不够和功耗过高等高难度挑战。
为了解决传统数据处理方式下时延高、数据实时分析能力匮乏等弊端,边缘计算技术应运而生。举一个现实的例子,几乎所有人都遇到过手机App出现“无法访问错误”的情况 ,这样的一些错误就和网络状况、云服务器带宽限制有关系。由于资源条件的限制,云计算服务不可避免收到高延迟、和网络不稳定带来的影响,但是通过将部分或者全部处理程序迁移至靠近用户或数据收集点,边缘计算能够大大减少在云中心模式站点下给应用程序所带来的影响。
边缘计算技术是在靠近物或数据源头的网络边缘侧,通过融合网络、计算、存储、应用核心能力的分布式开放平台,就近提供边缘智能服务。如图1-1所示,简单来说,边缘计算是将从终端采集到的数据,直接在靠近数据产生的本地设备或网络中激进型分析,无需再将数据传输至云端数据处理中心。

367

图1-1 边缘计算架构图
边缘计算的核心是在靠近数据源或物的一侧提供计算、存储和应用服务,这与雾计算将计算和分析能力扩展至网络“边缘”的定义非常相近。

(3)雾计算

雾计算(Fog Computing)是云计算(Cloud Computing)的延伸概念,主要用于管理来自传感器和边缘设备的数据,将数据、(数据)处理和应用程序集中在网络边缘的设备中,而不是全部保存在云端数据中心。在终端设备和云端数据中心之间再加一层“雾”,即网络边缘层,比如再加一个带有存储器的小服务器或路由器,把一些并不需要放到云端的数据在这一层直接处理和存储,可以大大减少云端的计算和存储压力,提高效率,提升传输速率,减低时延。
雾计算技术采用分布式的计算方式,将计算、通信、控制和存储资源与服务分布给用户或靠近用户的设备与系统。可以说,雾计算扩大了云计算的网络计算模式,将网络计算从网络中心扩展到了网络边缘,从而更加广泛地应用于各种服务。雾计算在地理上分布更为广泛,而且具有更大范围的移动性,这让它适应如今越来越多不需要进行大量运算的智能设备。对一些对时间延迟敏感的应用如实时和流媒体应用中,雾计算也具有更大的优势。
雾计算并非由性能强大的服务器组成,而是由性能较弱、更为分散的,处于大型数据中心以外的庞大外围设备组成,这些外围设别包括智能终端本身,也包括把智能设备与云端相连接的网关或路由设备,可以渗入工厂、汽车、电器、街灯及人们物质生活中的各类可计算设备中。

368

图1-2 云计算雾计算结构组织

369

图1-3 边缘计算工作流程

云计算、边缘计算、雾计算之间区别

(1) 边缘计算VS云计算

边缘计算的概念是相对于云计算而言的,云计算的处理方式是将所有数据上传至计算资源集中的云端数据中心或服务器处理,任何需要访问该信息的请求都必须上送云端处理。

因此,云计算面对物联网数据量爆发的时代,弊端逐渐凸显:

① 云计算无法满足爆发式的海量数据处理诉求。

随着互联网与各个行业的融合,特别是在物联网技术普及后,计算需求出现爆发式增长,传统云计算架构将不能满足如此庞大的计算需求。

② 云计算不能满足数据实时处理的诉求。

传统云计算模式下,物联网数据被终端采集后要先传输至云计算中心,再通过集群计算后返回结果,这必然出现较长的响应时间,但一些新兴的应用场景如无人驾驶、智慧矿山等,对响应时间有极高要求,依赖云计算并不现实。

边缘计算的出现,可在一定程度上解决云计算遇到的这些问题。如图2-1所示,物联终端设备产生的数据不需要再传输至遥远的云数据中心处理,而是就近即在网络边缘侧完成数据分析和处理,相较于云计算更加高效和安全。

370

图1-4 边缘计算和云计算的对比

(2)三者之间的区别

云计算、边缘计算、雾计算三者之间的区别见表1-1。

表1-1 云计算、边缘计算、雾计算之间区别对比

特性 云计算 雾计算 边缘计算
计算方式 集中式 去中心化 去中心化
计算地点 远离终端 靠近终端设备或网关 靠近终端设备或网关
延时性 延时 低延时 低延时
安全性 需要采取措施 隐私性较高 隐私性较高
数据存储 存储所有信息 仅向云端发送结果和数据 仅向云端发送结果和数据
部署成本

边缘计算分类和典型应用

(1)边缘计算分类

从市场应用区分纬度,边缘计算主要区分三类——电信运营商边缘计算、企业与物联网边缘计算、工业边缘计算。

(2)边缘计算的典型应用

正是基于这种更实时处理数据的能力、特性,更快的响应时间,边缘计算非常适合被应用于物联网领域,通过具有边缘计算能力的物联网关就近(网络边缘节点)提供设备管理控制等服务,解决物联网通信“最后一公里”的问题,最终实现物联网设备的智慧连接和高效管理。

边缘计算网联网架构如图1-5所示,它聚焦于工业物联网领域,不仅支持丰富的工业协议和物联接口,可以广泛适应不同行业设备的联接场景,而且通过开放的边缘计算能力和云管理架构,快速满足不同行业边缘智能数据处理诉求:

(1)联接:实现海量终端设备接入物联网络,主要通过边缘计算网关支持的各种物联接口(IP化PLC/RF/RS485/RS232等)连接各种传感器和终端,实现终端设备接入。

(2)云管理:通过物联网平台,应用云计算技术,实现边缘物联设备(如网络、设备、容器及应用)的统一云化管理,同时北向支持与其他行业应用系统灵活对接。

(3)行业应用:物联网平台提供标准的开放接口与不同合作伙伴的行业应用系统开放对接,构建广泛的行业适应性,可开发更多契合行业场景,深度定制化物联网行业应用。

371

图1-5 边缘计算网联网架构

实战案例——Kubekey安装kubernetes

基础环境配置

将三个节点主机分别修改主机名为k8s-master、k8s-node和kubeedge-node命令如下:

1
2
3
4
5
[root@localhost ~]# hostnamectl set-hostname k8s-master
# 切换节点
[root@localhost ~]# hostnamectl set-hostname k8s-node
# 切换节点
[root@localhost ~]# hostnamectl set-hostname kubeedge-node

根据实际地址,分别配置三个节点主机映射,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@k8s-master ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.26.3.33 k8s-master
10.26.3.34 k8s-node
10.26.18.145 kubeedge-node
[root@k8s-node ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.26.3.33 k8s-master
10.26.3.34 k8s-node
10.26.18.145 kubeedge-node
[root@kubeedge-node ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.26.3.33 k8s-master
10.26.3.34 k8s-node
10.26.18.145 kubeedge-node

将提供的安装包 kubernetes_kubeedge.tar.gz下载至k8s-master节点/root 目录,并解压到/opt目录:

1
2
3
4
5
6
7
[root@k8s-master ~]# ls
kubernetes_kubeedge.tar.gz

[root@k8s-master ~]# tar -zxf kubernetes_kubeedge.tar.gz -C /opt/
[root@k8s-master ~]# ls /opt/
deploy.yaml ec-dashboard-sa.yaml k8simage kk kubekey
docker-compose-Linux-x86_64 harbor-offline-installer-v2.5.0.tgz k8s.yaml kubeedge yum

在配置本地Yum源,并安装vsftpd服务,共享软件库:

1
2
3
4
5
6
7
8
9
10
11
[root@k8s-master ~]# mv /etc/yum.repos.d/* /media/
[root@k8s-master ~]# vi /etc/yum.repos.d/local.repo
[docker]
name=docker
baseurl=file:///opt/yum
gpgcheck=0
enabled=1
[root@k8s-master ~]# yum install -y vsftpd
[root@k8s-master ~]# echo anon_root=/opt >> /etc/vsftpd/vsftpd.conf
[root@k8s-master ~]# systemctl enable vsftpd --now
#设置服务开机自启,并启动

云端node节点(k8s-node)以及边缘端节点(kubeedge-node)Yum源配置,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-node ~]# mv /etc/yum.repos.d/* /media/
[root@k8s-node ~]# vi /etc/yum.repos.d/ftp.repo
[docker]
name=docker
baseurl=ftp://k8s-master/yum
gpgcheck=0
enabled=1
[root@kubeedge-node ~]# mv /etc/yum.repos.d/* /media/
[root@kubeedge-node ~]# vi /etc/yum.repos.d/ftp.repo
[docker]
name=docker
baseurl=ftp://k8s-master/yum
gpgcheck=0
enabled=1

安装Docker服务

在三个节点分别安装docker-ce,并配置镜像本地拉取,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# yum install -y docker-ce
# vi /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "200m",
"max-file": "5"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 655360,
"Soft": 655360
},
"nproc": {
"Name": "nproc",
"Hard": 655360,
"Soft": 655360
}
},
"live-restore": true,
"oom-score-adjust": -1000,
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"insecure-registries": ["0.0.0.0/0"]
}
# systemctl daemon-reload
# systemctl enable docker --now

注:三个节点做相同的操作。

部署Harbor服务

在云端主节点(k8s-master)安装部署Harbor,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-master ~]# cd /opt/
[root@k8s-master opt]# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
[root@k8s-master opt]# tar -zxf harbor-offline-installer-v2.5.0.tgz
[root@k8s-master harbor]# cd harbor && cp harbor.yml.tmpl harbor.yml
[root@k8s-master harbor]# vi harbor.yml
hostname: 10.26.3.33
# 修改为k8s-master节点IP
[root@k8s-master harbor]# ./install.sh
……
✔ ----Harbor has been installed and started successfully.----
[root@k8s-master harbor]# docker login -u admin -p Harbor12345 k8s-master
….
Login Succeeded

在打开浏览器访问harbor UI。http://10.26.3.33/ ,登录用户名密码(admin/Harbor12345),并创建k8s命名空间,如图2-1所示:

372

图2-1 新建k8s项目

加载并上传镜像至仓库,命令如下:

1
2
3
4
5
6
[root@k8s-master harbor]# cd ..
[root@k8s-master opt]# cd k8simage && sh load.sh
[root@k8s-master k8simage]# sh push.sh
请输入您的Harbor仓库地址(不需要带http):10.26.3.33
….
Login Succeeded

配置Kubekey部署kubernetes

在云端主节点(k8s-master)配置kubekey服务,命令如下:

1
2
[root@k8s-master k8simage]# cd /opt/
[root@k8s-master opt]# mv /opt/kk /usr/bin/

在云端主节点(k8s-master)以及云端从节点(k8s-node)安装依赖服务,命令如下:

1
2
[root@k8s-master opt]# yum install -y socat conntrack
[root@k8s-node ~]# yum install -y socat conntrack

在云端主节点(k8s-master)修改kubekey部署kubernetes模板文件,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@k8s-master opt]# vi k8s.yaml
hosts:
- {name: k8s-master, address: 10.26.3.33, internalAddress: 10.26.3.33, user: root, password: "Abc@1234"}
- {name: k8s-node, address: 10.26.3.34, internalAddress: 10.26.3.34, user: root, password: "Abc@1234"}
roleGroups:
etcd:
- k8s-master #修改成主节点
control-plane:
- k8s-master #修改成主节点
worker:
- k8s-node #工作节点,根据情况来填写
#address 若云主机为本地,则修改成本地的IP。若是公有云,则修改成公网IP。
#internalAddress 若云主机为本地,则修改成本地的IP。若是公有云,则修改成内网IP。
#name 修改为节点的主机名
registry:
type: harbor
auths:
"10.26.3.33": #harborip 修改为实际harbor地址
username: admin
password: Harbor12345
privateRegistry: "10.26.3.33" #harborip 修改为实际harbor地址
namespaceOverride: "k8s" #添加实际命名空间

安装部署集群,命令如下:

1
2
3
4
5
6
7
8
9
10
[root@k8s-master opt] # kk create cluster -f k8s.yaml
……
Continue this installation? [yes/no]: yes
……
09:17:55 UTC Pipeline[CreateClusterPipeline] execute successfully
Installation is complete
[root@k8s-master opt]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 85s v1.22.1
k8s-node Ready worker 63s v1.22.1

注: 两个节点都为Ready状态表示部署成功。

Kubeedge简介

什么是kubeedge?

Kubeedge 是一个开源项目,它将容器编排平台 Kubernetes 扩展到边缘计算环境中。边缘计算是一种将计算和数据处理能力推近到数据源头的计算模式,以便更快速地响应本地事件和减少数据传输到中央云的延迟。

Kubeedge 的目标是在边缘设备和云之间提供一个一致的编程和管理模型,从而使开发者能够以类似于在云中运行应用程序的方式来开发和部署边缘应用程序。它提供了一个边缘节点(Edge Node)的运行时环境,该环境在边缘设备上运行,并与云端的 Kubernetes 集群进行通信和协同工作。

使用 KubeEdge,可以很容易地将已有的复杂机器学习、图像识别、事件处理和其他高级应用程序部署到边缘端并进行使用。随着业务逻辑在边缘端上运行,可以在本地保护和处理大量数据。通过在边缘端处理数据,响应速度会显著提高,并且可以更好地保护数据隐私。

功能和特性

(1)边缘计算节点管理:Kubeedge 允许在边缘设备上运行 Kubernetes 节点,以便在边缘设备上调度和运行容器化应用程序。

(2)边缘设备注册:边缘设备可以注册到云端的 Kubernetes 集群,从而与云端进行连接和通信。

(3)边缘和云之间的数据同步:Kubeedge 提供了一种机制,可以在边缘设备和云端之间进行数据同步和传输,以便在边缘设备上进行本地处理和分析。

(4)边缘设备状态管理:Kubeedge 允许在云端管理和监控边缘设备的状态和健康状况,以便进行集中管理和故障排除。

(5)本地边缘规则执行:Kubeedge 支持在边缘设备上执行本地的业务逻辑和规则,而无需依赖云端的决策。

Kubeedge 的设计目标是为边缘计算提供一个弹性、高效且可扩展的解决方案,同时与 Kubernetes 生态系统紧密集成,以便开发者能够充分利用 Kubernetes 的优势和工具来开发和管理边缘应用程序。

组件介绍

KubeEdge 由多个组件组成,每个组件负责不同的功能。以下是 Kubeedge 的主要组件及其功能:

(1)Edge Core(边缘核心):Edge Core 是 Kubeedge 的核心组件,运行在边缘节点上。它负责管理边缘节点的生命周期、与云端的通信和协调、容器运行时管理等。Edge Core 将边缘节点连接到云端的 Kubernetes 控制平面,实现边缘和云端之间的集成和交互。

(2)Edge Hub(边缘消息中心):Edge Hub 是边缘节点上的消息中间件,负责边缘设备和云端之间的消息传递和通信。它处理设备和应用程序之间的数据交换,支持设备状态的上报和命令的下发,并提供 MQTT 和 HTTP 协议的支持。

(3)Edge Device Controller(边缘设备控制器):Edge Device Controller 负责管理边缘设备,包括设备的注册、状态监控、设备影子(Device Shadow)的管理等。它提供了设备管理的 API,使开发者能够与边缘设备进行交互和控制。

(4)Edge Function(边缘函数):Edge Function 允许在边缘节点上运行函数式服务,以便在本地处理数据和执行特定的业务逻辑。它支持在边缘节点上部署、运行和管理函数,实现边缘计算的本地处理能力。

(5)Edge Mesh(边缘网络):Edge Mesh 提供边缘节点之间的网络互联,形成一个边缘网络拓扑结构。它通过构建虚拟网络和路由机制,实现了边缘节点之间的通信和数据交换。

(6)Edge Sync(边缘数据同步):Edge Sync 用于在边缘设备和云端之间进行数据同步和传输。它支持将云端的应用程序、配置文件和资源同步到边缘设备上,并将边缘设备上的数据同步回云端进行分析和处理。

这些组件共同工作,为 Kubeedge 提供了一个完整的边缘计算解决方案,将边缘设备和云端的 Kubernetes 集群进行集成,并支持在边缘环境中进行应用程序的开发、部署和管理。

工作流程

Kubeedge的工作流程如图3-1所示,介绍如下:

373

图3-1 Kubeedge的工作流程

云部分工作

(1)CloudHub:Websocket server,负责在云侧观察更改,缓存并向Edge Hub发送消息。

(2)EdgeController:一个Kubernetes controller,它管理边缘节点和云侧的数据,以便可以将数据定向到特定的边缘节点。

(3)DeviceController:一个Kubernetes controller,用于管理设备,以便可以在边缘和云之间同步设备元数据/状态数据。

(4)SyncController:一个Kubernetes controller,用于将objectsyncs指定的资源触发一次同步。是1.2.1 里新增的conrtoller。

目前Kubeedge提供了4种CRD:clusterobjectsyncs (集群级别的对象同步)、objectsyncs namespace(级别的对象同步)、devices(设备)和devicemodels(设备模板)。对应了2个controller:synccontroller和DeviceController。

边缘部分工作

(1)EdgeHub:Websocket 客户端,负责与Cloud Service进行交互,包括将云侧资源更新同步到边缘,并将边缘侧主机和设备状态更改报告给云。

(2)Edged:在边缘节点上运行并管理容器化应用的Agent,类似kubelet,增强了cm,secret,等资源的cache。

(3)EventBus:与MQTT服务器(mosquitto)进行交互的客户端,提供对其他组件的发布和订阅功能。

(4)ServiceBus:与HTTP服务器(REST)交互的HTTP客户端,为云组件提供HTTP客户端功能,以访问在边缘运行的HTTP服务器,提供的是服务暴露的功能。

(5)DeviceTwin:负责存储设备状态并将设备状态同步到云。它还为应用程序提供查询接口。

(6)MetaManager:Edged和EdgeHub之间的消息处理器。它还负责将元数据存储到轻量级数据库(SQLite)或从中检索元数据。

实战案例——Kubeedge环境搭建

Kubeedge云端环境搭建

在云端主节点(k8s-master)配置云端所需要的软件包,及服务配置文件,命令如下:

1
2
3
4
5
6
7
8
[root@k8s-master opt]# cd /opt/kubeedge/
[root@k8s-master kubeedge]# mv keadm /usr/bin/
[root@k8s-master kubeedge]# mkdir /etc/kubeedge
[root@k8s-master kubeedge]# tar -zxf kubeedge-1.11.1.tar.gz
[root@k8s-master kubeedge]# cp -rf kubeedge-1.11.1/build/tools/* /etc/kubeedge/
[root@k8s-master kubeedge]# cp -rf kubeedge-1.11.1/build/crds/ /etc/kubeedge/
[root@k8s-master kubeedge]# tar -zxf kubeedge-v1.11.1-linux-amd64.tar.gz
[root@k8s-master kubeedge]# cp -rf * /etc/kubeedge/

启动云端服务,命令如下:

1
2
3
4
5
6
7
[root@k8s-master kubeedge]# cd /etc/kubeedge/
[root@k8s-master kubeedge]# keadm deprecated init --kubeedge-version=1.11.1 --advertise-address=10.26.3.33
#--kubeedge-version=指定kubeedge的版本,离线安装必须指定,否则会去下载最新版本
#--advertise-address=暴露IP,此处填写keadm所在的节点内网IP。如果要与本地集群对接的话,则填写 公网IP。此处因为云上,所以只需要写内网IP。
……
KubeEdge cloudcore is running, For logs visit: /var/log/kubeedge/cloudcore.log
CloudCore started

检查云端服务,命令如下:

1
2
3
[root@k8s-master kubeedge]# netstat -ntpl |grep cloudcore
tcp6 0 0 :::10000 :::* LISTEN 60452/cloudcore
tcp6 0 0 :::10002 :::* LISTEN 60452/cloudcore

Kubeedge边缘端环境搭建

在边缘端节点(kubeedge-node)复制云端软件包至本地,命令如下:

1
2
3
4
5
6
7
[root@kubeedge-node ~]# scp root@k8s-master:/usr/bin/keadm /usr/local/bin/
root@k8s-master's password: #输入云端主节点主机密码
keadm 100% 64MB 26.8MB/s 00:02
[root@kubeedge-node ~]# mkdir /etc/kubeedge
[root@kubeedge-node ~]# cd /etc/kubeedge/
[root@kubeedge-node kubeedge]# scp -r root@k8s-master:/etc/kubeedge/* /etc/kubeedge/
root@k8s-master's password: #输入云端主节点主机密码

在云端主节点查询出密钥,命令如下:

1
2
[root@k8s-master ~]# keadm gettoken
37629685215a3ab6461c4bc4f868746edc62ba5db3885b75b26f4f8060ebb083.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODkxNTQ3NjN9.g8x_2Nnu_6ZI795LxOlSuGnCU4TVfguDOMRpYpHBIuA

使用命令加入集群,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@kubeedge-node kubeedge]# keadm deprecated join --cloudcore-ipport=10.26.3.33:10000 --kubeedge-version=1.11.1 --token=37629685215a3ab6461c4bc4f868746edc62ba5db3885b75b26f4f8060ebb083.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODkxNTQ3NjN9.g8x_2Nnu_6ZI795LxOlSuGnCU4TVfguDOMRpYpHBIuA
……
kubeedge-v1.11.1-linux-amd64/
kubeedge-v1.11.1-linux-amd64/edge/
kubeedge-v1.11.1-linux-amd64/edge/edgecore
kubeedge-v1.11.1-linux-amd64/version
kubeedge-v1.11.1-linux-amd64/cloud/
kubeedge-v1.11.1-linux-amd64/cloud/csidriver/
kubeedge-v1.11.1-linux-amd64/cloud/csidriver/csidriver
kubeedge-v1.11.1-linux-amd64/cloud/iptablesmanager/
kubeedge-v1.11.1-linux-amd64/cloud/iptablesmanager/iptablesmanager
kubeedge-v1.11.1-linux-amd64/cloud/cloudcore/
kubeedge-v1.11.1-linux-amd64/cloud/cloudcore/cloudcore
kubeedge-v1.11.1-linux-amd64/cloud/controllermanager/
kubeedge-v1.11.1-linux-amd64/cloud/controllermanager/controllermanager
kubeedge-v1.11.1-linux-amd64/cloud/admission/
kubeedge-v1.11.1-linux-amd64/cloud/admission/admission

KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -xe
##如若提示YUM问题,删除多余yum源文件,重新执行加入集群命令##
[root@kubeedge-node kubeedge]# rm -rf /etc/yum.repos.d/epel*

[root@kubeedge-node kubeedge]# systemctl status edgecore
#查看状态服务是否为active

在云端主节点检查边缘端节点是否正常加入,命令如下:

1
2
3
4
5
6
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 57m v1.22.1
k8s-node Ready worker 56m v1.22.1
kubeedge-node Ready agent,edge 5m35s v1.22.6-kubeedge-v1.11.1
#Ready状态可以发现,边缘计算端加入成功

回到云端节点,进行设置亲和性配置,防止调度到边缘节点导致Pod资源失败,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@k8s-master ~]# kubectl edit daemonset -n kube-system calico-node
[root@k8s-master ~]# kubectl edit daemonset -n kube-system kube-proxy
[root@k8s-master ~]# kubectl edit daemonset -n kube-system nodelocaldns
增加亲和性配置
spec:
...
tmeplate:
...
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/edge
operator: DoesNotExist

首先在边缘端节点停止服务,命令如下:

1
2
3
[root@kubeedge-node kubeedge]# systemctl stop edgecore
[root@kubeedge-node kubeedge]# systemctl status edgecore
# 服务为inactive (dead) 状态

在云端主节点移除边缘端节点,命令如下:

1
2
3
4
5
[root@k8s-master ~]# kubectl drain kubeedge-node --delete-local-data --force --ignore-daemonsets 
node/kubeedge-node cordoned
node/kubeedge-node drained
[root@k8s-master ~]# kubectl delete node kubeedge-node
node "kubeedge-node" deleted

重新加入节点(边缘端节点操作kubeedge-node),命令如下:

1
2
[root@kubeedge-node kubeedge]# systemctl restart docker
[root@kubeedge-node kubeedge]# systemctl start edgecore &&systemctl enable edgecore

重检查边缘端节点是否运行Pod,命令如下:

1
[root@k8s-master ~]# kubectl get pod -A -o wide | grep kubeedge-node

如果没有任何Pod运行,则成功搭建。

云端启用数据监控

在云端主节点(k8s-master)配置证书,命令如下:

1
2
3
4
[root@k8s-master ~]# export CLOUDCOREIPS="10.26.3.33"
#此处设置的为云端masterIP
[root@k8s-master ~]# cd /etc/kubeedge/
[root@k8s-master kubeedge]# ./certgen.sh stream

更新云端的配置,命令如下:

1
2
3
4
5
6
7
8
9
[root@k8s-master kubeedge]# vi /etc/kubeedge/config/cloudcore.yaml
cloudStream:
enable: true #修改为true
streamPort: 10003
router:
address: 0.0.0.0
enable: true #修改为true
port: 9443
restTimeout: 60

更新边缘端的配置,命令如下:

1
2
3
4
5
6
7
[root@kubeedge-node kubeedge]# vi /etc/kubeedge/config/edgecore.yaml
edgeStream:
enable: true #修改为true
handshakeTimeout: 30
[root@kubeedge-node ~]# vi /etc/kubeedge/config/edgecore.yaml
serviceBus:
enable: true #修改为true

重新启动云端服务,命令如下:

1
2
3
4
5
[root@k8s-master kubeedge]# kill -9 $(netstat -lntup |grep cloudcore |awk 'NR==1 {print $7}' |cut -d '/' -f 1)
[root@k8s-master kubeedge]# cp -rfv cloudcore.service /usr/lib/systemd/system/
‘cloudcore.service’ -> ‘/usr/lib/systemd/system/cloudcore.service’
[root@k8s-master kubeedge]# systemctl start cloudcore.service
#通过netstat -lntup 查看端口,如果出现10003端口则表示成功开启cloudStream

重新启动边缘端服务,命令如下:

1
2
[root@kubeedge-node kubeedge]# systemctl stop edgecore.service
[root@kubeedge-node kubeedge]# systemctl restart edgecore.service

在云端部署服务并查看收集指标,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@k8s-master kubeedge]# cd /opt/
[root@k8s-master opt]# kubectl apply -f deploy.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
[root@k8s-master opt]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 469m 29% 2051Mi 66%
k8s-node 156m 9% 1202Mi 38%
kubeedge-node 23m 1% 565Mi 15%

metrics-server是离线监控数据组件。提供容器基础资源监控能力。

实战案例——kubeedge-dashboard

安装nodejs

k8s-node节点下载所需安装包:

1
2
3
4
[root@k8s-node ~]# ls

node-v14.9.0-linux-x64.tar.xz
dashboard-main.tar.gz

安装nodejs:

1
2
3
4
5
[root@k8s-node ~]# tar -xvf node-v14.9.0-linux-x64.tar.xz
[root@k8s-node ~]# ln -s /root/node-v14.9.0-linux-x64/bin/npm /usr/local/bin/npm
[root@k8s-node ~]# ln -s /root/node-v14.9.0-linux-x64/bin/node /usr/local/bin/node
[root@k8s-node ~]# npm -v
6.14.8

启动dashboard应用

解压kubeedge-dashboard压缩包:

1
[root@k8s-node ~]# tar -zxvf dashboard-main.tar.gz

运行dashbaord应用:

1
2
[root@k8s-node ~]# cd dashboard-main
[root@k8s-node dashboard-main]# npm run dev --apiserver=https://10.26.3.134:6443 & #IP地址为master地址

在master节点执行,获取登录token:

1
2
3
[root@k8s-master ~]# kubectl create serviceaccount curl-user -n kube-system
[root@k8s-master ~]# kubectl create clusterrolebinding curl-user-binding --clusterrole=cluster-admin --serviceaccount=kube-system:curl-user -n kube-system
[root@k8s-master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep curl-user | awk '{print $1}')

页面展示与使用

浏览器打开http://localhost:8000 如图5-1所示。

374

图5-1 打开KubeEdge登录页面

填入刚刚获取的token,单击“Login”按钮,首页会显示集群的一些相关信息如图5-2所示:

375

图5-2 登录KubeEdge首页

展开左侧菜单node,单击nodes可以看到集群中的节点,可以查看节点详细信息,删除节点以及添加节点,如图5-3所示:

376

图5-3 集群节点信息

展开左侧菜单Application,单击deployment可以看到已部署的deployment,其中我们之前部署的kubeedge-counter应用也有显示,如图5-4所示:

377

图5-4 Application显示

展开左侧菜单 Kubernetes Policy可以看到集群的相关策略,如图5-5所示:

378

图5-5 集群的相关策略

实战案例——kubeedge-counter-demo

创建device model和device

利用已搭建的kubeedge平台进行部署智能边缘计算平台。

下载所需镜像和demo案例包:

1
2
3
4
5
6
[root@k8s-master ~]# ls

edgepause.tar
kubeedge-counter-app.tar
kubeedge-pi-counter.tar
kubeedge-counter-demo.tar.gz

创建device model:

1
2
3
[root@k8s-master ~]# tar -zxvf kubeedge-counter-demo.tar.gz
[root@k8s-master ~]# cd kubeedge-counter-demo/crds/
[root@k8s-master crds]# kubectl create -f kubeedge-counter-model.yaml

创建device,根据你的实际情况修改matchExpressions:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@k8s-master crds]# vi kubeedge-counter-instance.yaml 
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
name: counter
labels:
description: 'counter'
spec:
deviceModelRef:
name: counter-model
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: ' kubernetes.io/hostname '#修改此处
operator: In
values:
- kubeedge-node #修改此处为自己的kubeedge节点名称

status:
twins:
- propertyName: status
desired:
metadata:
type: string
value: 'OFF'
reported:
metadata:
type: string
value: '0'
[root@k8s-master crds]# kubectl create -f kubeedge-counter-instance.yaml

部署云端应用

导入镜像kubeedge-counter-app.tar:

1
2
3
[root@k8s-master kubeedge-counter-demo]# cd
[root@k8s-master ~]# docker load -i kubeedge-counter-app.tar
[root@k8s-master ~]# cd kubeedge-counter-demo/crds/

修改apiVersion版本号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@k8s-master crds]# vi kubeedge-web-controller-app.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: kubeedge-counter-app
name: kubeedge-counter-app
namespace: default
spec:
selector:
matchLabels:
k8s-app: kubeedge-counter-app
template:
metadata:
labels:
k8s-app: kubeedge-counter-app
spec:
hostNetwork: true
nodeSelector:
node-role.kubernetes.io/master: ""
containers:
- name: kubeedge-counter-app
image: kubeedge/kubeedge-counter-app:v1.0.0
imagePullPolicy: IfNotPresent
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
restartPolicy: Always

apiVersion: rbac.authorization.k8s.io/v1#修改此处的版本号
kind: Role
metadata:
name: kubeedge-counter
namespace: default
rules:
- apiGroups: ["devices.kubeedge.io"]
resources: ["devices"]
verbs: ["get", "patch"]


apiVersion: rbac.authorization.k8s.io/v1#修改此处的版本号
kind: RoleBinding
metadata:
name: kubeedge-counter-rbac
namespace: default
subjects:
- kind: ServiceAccount
name: default
[root@k8s-master crds]# kubectl apply -f kubeedge-web-controller-app.yaml

查看是否存在8089端口(也可以浏览器打开k8s-master_IP:8089):

1
2
[root@k8s-master crds]# netstat -ntpl |grep 8089
tcp6 0 0 :::8089 :::* LISTEN 45700/kubeedge-coun

部署边缘端应用

边缘端的pi-counter-app应用受云端应用控制,主要与mqtt服务器通信,进行简单的计数功能。

将镜像发送至kubeedge节点并导入:

1
2
3
[root@k8s-master ~]# cd
[root@k8s-master ~]# scp edgepause.tar kubeedge-node:/root/
[root@k8s-master ~]# scp kubeedge-pi-counter.tar kubeedge-node:/root/

kubeedge节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@kubeedge-node ~]# docker load -i  edgepause.tar
[root@kubeedge-node ~]# docker load -i kubeedge-pi-counter.tar
[root@k8s-master ~]# cd kubeedge-counter-demo/crds/
[root@k8s-master crds]# vi kubeedge-pi-counter-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: kubeedge-pi-counter
name: kubeedge-pi-counter
namespace: default
spec:
selector:
matchLabels:
k8s-app: kubeedge-pi-counter
template:
metadata:
labels:
k8s-app: kubeedge-pi-counter
spec:
#nodeSelector: #注释此行
# node-role.kubernetes.io/master: "" #注释此行
nodeName: kubeedge-node #添加此行
hostNetwork: true
containers:
- name: kubeedge-pi-counter
image: kubeedge/kubeedge-pi-counter:v1.0.0
imagePullPolicy: IfNotPresent
nodeSelector:
node-role.kubernetes.io/edge: ""
restartPolicy: Always
[root@k8s-master crds]# kubectl apply -f kubeedge-pi-counter-app.yaml

注意!如果pod为runing状态则正常,若一直处于pending状态为不正常,可以切换到master节点执行以下操作,正常就无需执行。

1
2
3
4
5
6
7
8
9
[root@k8s-master crds]# kubectl delete -f kubeedge-pi-counter-app.yaml
[root@k8s-master crds]# kubectl delete pod kubeedge-pi-counter-674b9f4f74-2k67z --force
[root@k8s-master crds]# kubectl get objectsyncs -A
NAMESPACE NAME AGE
default kubeedge-node.ad7960f2-3832-49eb-8aad-dd3e9c148611 23s
[root@k8s-master ~]# kubectl delete objectsyncs kubeedge-node.ad7960f2-3832-49eb-8aad-dd3e9c148611
objectsync.reliablesyncs.kubeedge.io "kubeedge-node.ad7960f2-3832-49eb-8aad-dd3e9c148611" deleted
[root@k8s-master ~]# systemctl restart cloudcore
[root@kubeedge-node ~]#systemctl restart edgecore.service

上述过程完成后,再次重新执行kubectl apply -f kubeedge-pi-counter-app.yaml命令。

测试应用

通过WEB APP来控制COUNTER

切换到带桌面的主机,右击选择“Open Terminal Here”选项:

1
2
vi /etc/resolv.conf  #添加DNS
nameserver 114.114.114.114

打开浏览器输入http://masterIP:8089/ 在Web页面上选择ON,并单击“Execute”按钮,可以在edge节点上通过以下命令查看执行结果:

1
2
3
4
5
6
7
8
[root@kubeedge-node ~]# docker logs -f c40aec9ff027     #容器的名称为k8s_kubeedge-pi-counter_kubeedge-开头
turn on counter.
Counter value: 1
Counter value: 2
Counter value: 3
Counter value: 4
Counter value: 5
Counter value: 6

查看COUNTER STATUS

在Web页面上选择STATUS,并单击“Execute”按钮,会在Web页面上返回counter当前的status,如图6-1所示

379

图6-1 通过WEB APP来控制COUNTER