bianyuan
简介
边缘计算kubernetes_kubeedge.tar.gz包含了云端和边端在内的Kubeedge管理工具安装包、Kubeedge Dashboard软件包,同时提供了Counter应用部署文件及镜像包等,可以满足公有云上边缘计算案例中的所有运维服务。
本案例所采用的Kubernetes集群为已经构建好的K8s-allinone平台,集群版本为 1.22.1,Kubeedge版本为1.11.1。
边缘计算软件包包含的具体内容如下:
编号 软件包 详细信息
1 yum源 提供Docker安装包、依赖包、MQTT服务安装包、FTP服务安装包等,能够满足所有服务的安装和依赖
2 Harbor仓库 提供Harbor本地镜像仓库安装包、Harbor服务镜像、docker compose安装包,可以满足本地Harbor镜像仓库的部署
3 k8simage 提供部署边缘计算服务的所有本地容器镜像以及上传镜像脚本文件
4 kubeedge-counter-demo 提供Counter案例中所有的yaml部署文件
5 kubeedge 提供部署kubeedge管理工具的所有软件包
6 k8s-allinone-v1.22.1.qcow2 已经部署好K8S平台的allinone镜像
1.边缘计算介绍
1.1 边缘计算概念
边缘计算是在靠近物或数据源头的网络边缘侧,通过融合网络、计算、存储、应用核心能力的分布式开放平台,就近提供边缘智能服务。简单点讲,边缘计算是将从终端采集到的数据,直接在靠近数据产生的本地设备或网络中进行分析,无需再将数据传输至云端数据处理中心。
OpenStack社区对其定义的概念同样也是:“边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和IT环境服务;目标是在靠近数据输入或用户的地方提供计算、存储和网络带宽。”
1.2 边缘计算的作用
(1)为什么要使用边缘计算?
边缘计算的本质实际上还是一种服务,类似于云计算、大数据,但是和它们不一样的是,边缘计算非常接近用户。那为什么这种服务要那么接近于用户呢?答案非常简单就是为了让用户在在使用上有较强的体验,这种体验会让用户觉得自己刷什么内容都是非常快的。
(2)边缘计算背景是什么?解决什么问题?
随着物联网技术的快速发展,使得越来越多具备独立功能的普通物体实现了互联互通,实现万物互联。得益于物联网的转型,各行各业均在利用物联网技术快速实现数字化转型,越来越多的行业终端设备通过网络联接起来。 然而物联网作为庞大而复杂的系统,不同行业的应用场景也是各异。
根据第三方机构分析统计,到2025年将有超过千亿的终端设备联网,终端数据量将达300ZB,如此大规模的数据量,按照传统数据处理方式,获取的所有数据均需上送云计算平台分析,云计算平台将面临着网络时延高、海量设备接入、海量数据处理难、带宽不够和功耗过高等高难度挑战。 为了解决传统数据处理方式下时延高、数据实时分析能力匮乏等弊端,边缘计算技术应运而生。举一个现实的例子,几乎所有人都遇到过手机App出现“无法访问错误”的情况 ,这样的一些错误就和网络状况、云服务器带宽限制有关系。由于资源条件的限制,云计算服务不可避免收到高延迟、和网络不稳定带来的影响,但是通过将部分或者全部处理程序迁移至靠近用户或数据收集点,边缘计算能够大大减少在云中心模式站点下给应用程序所带来的影响。
2.创建部署环境
2.1 申请OBS存储桶
登录华为云平台,点击右上角“控制台”进入华为云服务列表,在对应的存储服务中选择“对象存储服务OBS”,如图2-1所示。
图2-1 对象存储服务OBS
进入OBS服务后,在右上角选择“创建桶”。分别配置桶名称为“k8s-kubeedge”,数据冗余存储策略选择“多AZ存储”,默认存储类别选择“标准存储”,桶策略为“私有”,其他选项均为默认即可,点击“立即创建”,如图2-2所示。
图2-2 OBS基础配置
创建完成后,点击桶的名称进入桶,在当前页面选择“上传对象”,将提供的k8s-allinone-v1.22.1.qcow2镜像上传至存储桶,上传时无需进行任何配置,所有选项全部默认点击上传即可,如图2-3所示。
图2-3 上传对象
上传完毕之后可以查看到对象列表文件中已经包含了k8s-allinone的镜像,如图2-4所示。
图2-4 对象列表
2.2 创建私有镜像
在华为云服务列表,在对应的计算服务中选择“镜像服务IMS”,如图2-5所示。
图2-5 镜像服务IMS
在跳转的页面中点击“创建私有镜像”,配置创建方式为“导入私有镜像”,镜像类型为“系统盘镜像”,镜像文件使用OBS桶中上传好的镜像,如图2-6所示。
图2-6 创建私有镜像
继续配置镜像用途为“ECS系统盘镜像”,名称为“k8s-allinone-v1.22.1”,系统盘大小为“100GiB”,其余选项默认,配置完成点击“立即创建”,如图2-7所示。
图2-7 配置镜像名称
等待5-10分钟后镜像可创建完成。
2.3 申请ECS云服务器
在华为云服务列表,在对应的计算服务中选择“弹性云服务器ECS”,如图2-8所示。
图2-8 云服务器ECS
进入页面后,点击右上角“购买弹性云服务器ECS”,配置计费模式“按需计费”,CPU架构为“X86计算”,服务器规格为“8vCPUs 16GiB”,如图2-9所示。
图2-9 配置服务器规格
继续配置服务器镜像。镜像选择“私有镜像”,系统盘大小为“100GiB”,完成后点击“下一步,网络配置”如图2-10所示。
图2-10 配置镜像
网络选择已经创建好的虚拟私有云,购买弹性公网IP,线路选择“全动态BGP”,“按带宽计费”,带宽大小为“5M”,并勾选“随实例释放”,配置完成后点击“下一步,高级配置”,如图2-11所示。
图2-11 网络配置
配置云服务名称为“master”,登录凭证选择“使用镜像密码”,镜像密码为“Abc@1234”,配置完成后确认配置购买即可,如图2-12所示。
图2-12 高级配置
购买完成后,可以在云服务器列表查看到云主机的运行状态,如图2-13所示。
图2-13 云主机列表
按照上面的步骤,再买一台云服务器,作为边端节点。实例架构为“X86计算”,规格为“4vCPUs 8GiB”,如图2-14所示。
图2-14 配置主机架构
继续配置镜像为“公共镜像 CentOS 7.9”,系统盘大小为“100 GiB”,配置完成后点击“下一步,网络配置”,如图2-15所示。
图2-15 规格配置
网络配置按照上面的步骤进行同样的配置。配置完成之后进行高级配置,在高级配置中,名称修改为“kubeedge-node”,密码配置为“Abc@1234”,其余选项均为默认,配置完成后,购买即可,如图2-16所示。
图2-16 高级配置
购买完成后,查看云主机列表,如图2-17所示。
图2-17 云主机列表
2.基础环境配置
2.1 配置映射
在华为云创建云服务器后,使用服务器公网IP连接主机。等待一段时间,集群初始化完毕后,检查k8s集群状态并查看主机名,命令如下:
[root@master ~]# kubectl get nodes,pod -A
NAME STATUS ROLES AGE VERSION
node/master Ready control-plane,master 23m v1.22.1
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-dashboard pod/dashboard-7575cf67b7-cfk4w 1/1 Running 4 (2m26s ago) 23m
kube-dashboard pod/dashboard-agent-69456b7f56-8cksn 1/1 Running 0 23m
kube-system pod/coredns-78fcd69978-kf247 1/1 Running 0 23m
kube-system pod/coredns-78fcd69978-qwq9k 1/1 Running 0 23m
kube-system pod/etcd-master 1/1 Running 0 23m
kube-system pod/kube-apiserver-master 1/1 Running 0 23m
kube-system pod/kube-controller-manager-master 1/1 Running 0 23m
kube-system pod/kube-flannel-ds-5l5p8 1/1 Running 0 23m
kube-system pod/kube-proxy-pq9fz 1/1 Running 0 23m
kube-system pod/kube-scheduler-master 1/1 Running 0 23m
kube-system pod/metrics-server-77564bc84d-bdbfr 1/1 Running 0 23m
查看两个节点主机名,命令如下:
[root@master ~]# hostnamectl #云端节点
Static hostname: master
Icon name: computer-vm
Chassis: vm
Machine ID: cc2c86fe566741e6a2ff6d399c5d5daa
Boot ID: 648890d05aab423fabaacfb958f82ba9
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64
[root@kubeedge-node ~]# hostnamectl #边端节点
Static hostname: kubeedge-node
Icon name: computer-vm
Chassis: vm
Machine ID: 57beda17722b499da37e22c55c2ef57f
Boot ID: b19726791bdb4858bfb424e352aeb342
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.92.1.el7.x86_64
Architecture: x86-64
分别配置云端节点和边端节点的主机映射文件,命令如下:
[root@master ~]# cat >> /etc/hosts <<EOF
172.16.2.34 master #节点地址为主机私有网络地址
172.16.2.172 kubeedge-node
EOF
[root@kubeedge-node ~]# cat >> /etc/hosts <<EOF
172.16.2.34 master
172.16.2.172 kubeedge-node #节点地址为主机私有网络地址
EOF
2.2 云端、边端节点配置Yum源
将提供的安装包 kubernetes_kubeedge.tar.gz上传至云端master节点/root 目录,并解压到/opt目录,命令如下:
[root@master ~]# tar -zxvf kubernetes_kubeedge.tar.gz -C /opt/
[root@master ~]# ls
docker-compose-Linux-x86_64 harbor-offline-installer-v2.5.0.tgz kubeedge kubernetes_kubeedge.tar.gz
ec-dashboard-sa.yaml k8simage kubeedge-counter-demo yum
在云端master节点配置Yum源,命令如下:
[root@master ~]# cat > /etc/yum.repos.d/local.repo <<EOF
[docker]
name=docker
baseurl=file:///opt/yum
gpgcheck=0
enabled=1
EOF
[root@master ~]# yum -y install vsftpd
[root@master ~]# echo anon_root=/opt >> /etc/vsftpd/vsftpd.conf
[root@master ~]# systemctl enable vsftpd --now
#开启服务,并设置开机自启
边端kubeedge-node配置Yum源,命令如下:
[root@kubeedge-node ~]# mv /etc/yum.repos.d/* /media/
[root@kubeedge-node ~]# cat >/etc/yum.repos.d/ftp.repo <<EOF
[docker]
name=docker
baseurl=ftp://master/yum
gpgcheck=0
enabled=1
EOF
2.3 云端、边端配置Docker
云端master节点已经安装好了Docker服务,需要配置本地镜像拉取,命令如下:
[root@master ~]# 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”]
}
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
daemon.json文件解析:
{
“log-driver”: “json-file”, #管理容器日志的驱动程序
“log-opts”: {
“max-size”: “200m”, #将每个日志文件的最大大小限制为200
“max-file”: “5” #定义保留的日志文件的最大数量
},
“default-ulimits”: { #为容器设置默认资源限制
“nofile”: { #为容器定义最大的打开文件句柄数量
“Name”: “nofile”,
“Hard”: 655360, #硬限制
“Soft”: 655360 #软限制
},
“nproc”: { #为每个容器设置最大进程数
“Name”: “nproc”,
“Hard”: 655360,
“Soft”: 655360
}
},
“live-restore”: true, #允许实时恢复容器,在Docker守护进程重启后,保留容器的运行状态
“oom-score-adjust”: -1000, #设置OOM进程分数调整值为-1000。OOM分数是内核用于选择哪个进程在内存不足时被终止。这里的负值将增加Docker容器的优先级,降低其被终止的可能性。
“max-concurrent-downloads”: 10, #指定Docker同时执行的最大镜像下载数为10个
“max-concurrent-uploads”: 10, #指定Docker同时执行的最大镜像上传数为10个
“insecure-registries”: [“0.0.0.0/0”] #镜像仓库地址范围为[“0.0.0.0/0”],一般不推荐,安全系数低
}
边端节点安装Docker,并配置本地镜像拉取,命令如下:
[root@kubeedge-node ~]# yum -y install docker-ce
[root@kubeedge-node ~]# 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”]
}
[root@kubeedge-node ~]# systemctl daemon-reload
[root@kubeedge-node ~]# systemctl enable docker --now
2.4 云端节点部署Harbor仓库
在云端master节点上部署Harbor本地镜像仓库,命令如下:
[root@master ~]# cd /opt/
[root@master opt]# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
[root@master opt]# tar -zxvf harbor-offline-installer-v2.5.0.tgz
[root@master opt]# cd harbor && cp harbor.yml.tmpl harbor.yml
[root@master harbor]# vi harbor.yml
hostname: 172.16.2.34 #将hostname修改为云端节点私有网络IP
[root@master harbor]# ./install.sh
……
✔ ----Harbor has been installed and started successfully.----
[root@master harbor]# docker login -u admin -p Harbor12345 master
….
Login Succeeded
打开浏览器使用云端master节点公网IP,访问Harbor页面(需要在华为云安全组中入方向规则放开80端口),并使用默认的用户名和密码进行登录(admin/Harbor12345),并创建一个名为“k8s”的命名空间,如图2-1所示。
图2-1 创建k8s项目
加载本地镜像并上传至Harbor镜像仓库,命令如下:
[root@master harbor]# cd /opt/k8simage/ && sh load.sh
[root@master k8simage]# sh push.sh
请输入您的Harbor仓库地址(不需要带http):172.16.2.34 #地址为云端master节点私有网络地址
2.5 配置节点亲和性
在云端节点分别配置flannel pod和proxy pod的亲和性,命令如下:
[root@master k8simage]# kubectl edit daemonset -n kube-system kube-flannel-ds
…
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
- key: node-role.kubernetes.io/edge #增加配置
operator: DoesNotExist
[root@master k8simage]# kubectl edit daemonset -n kube-system kube-proxy
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/edge
operator: DoesNotExist
[root@master k8simage]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-q7mfq 1/1 Running 0 13m
kube-proxy-wxhkm 1/1 Running 0 39s
#可以查看到两个pod被修改完成之后重新运行,状态为Running
3.Kubeedge环境搭建
3.1 Kubeedge介绍
Kubeedge 是一个开源项目,它将容器编排平台 Kubernetes 扩展到边缘计算环境中。边缘计算是一种将计算和数据处理能力推近到数据源头的计算模式,以便更快速地响应本地事件和减少数据传输到中央云的延迟。
Kubeedge 的目标是在边缘设备和云之间提供一个一致的编程和管理模型,从而使开发者能够以类似于在云中运行应用程序的方式来开发和部署边缘应用程序。它提供了一个边缘节点(Edge Node)的运行时环境,该环境在边缘设备上运行,并与云端的 Kubernetes 集群进行通信和协同工作。
使用 KubeEdge,可以很容易地将已有的复杂机器学习、图像识别、事件处理和其他高级应用程序部署到边缘端并进行使用。随着业务逻辑在边缘端上运行,可以在本地保护和处理大量数据。通过在边缘端处理数据,响应速度会显著提高,并且可以更好地保护数据隐私。
3.2 Kubeedge云端环境搭建
在云端master节点配置云端所需要的软件包,及服务配置文件,命令如下:
[root@master k8simage]# cd /opt/kubeedge/
[root@master kubeedge]# mv keadm /usr/bin/
[root@master kubeedge]# mkdir /etc/kubeedge
[root@master kubeedge]# tar -zxf kubeedge-1.11.1.tar.gz
[root@master kubeedge]# cp -rf kubeedge-1.11.1/build/tools/* /etc/kubeedge/
[root@master kubeedge]# cp -rf kubeedge-1.11.1/build/crds/ /etc/kubeedge/
[root@master kubeedge]# tar -zxf kubeedge-v1.11.1-linux-amd64.tar.gz
[root@master kubeedge]# cp -rf * /etc/kubeedge/
启动云端服务,命令如下:
[root@master kubeedge]# cd /etc/kubeedge/
[root@master kubeedge]# keadm deprecated init --kubeedge-version=1.11.1 --advertise-address=172.16.2.34
#–kubeedge-version=指定kubeedge的版本,离线安装必须指定,否则会去下载最新版本
#–advertise-address=暴露IP,此处填写keadm所在的节点云服务器私有网络IP。
……
KubeEdge cloudcore is running, For logs visit: /var/log/kubeedge/cloudcore.log
CloudCore started
检查云端服务,命令如下:
[root@master kubeedge]# netstat -ntpl |grep cloudcore
tcp6 0 0 :::10000 :::* LISTEN 974/cloudcore
tcp6 0 0 :::10002 :::* LISTEN 974/cloudcore
3.3 Kubeedge边缘端环境搭建
在边缘端kubeedge-node节点复制云端软件包至本地,命令如下:
[root@kubeedge-node ~]# scp root@master:/usr/bin/keadm /usr/local/bin/
[root@kubeedge-node ~]# mkdir /etc/kubeedge
[root@kubeedge-node ~]# cd /etc/kubeedge/
[root@kubeedge-node kubeedge]# scp -r root@master:/etc/kubeedge/* /etc/kubeedge/
在云端master节点查询密钥,命令如下:
[root@master kubeedge]# keadm gettoken
1f0f213568007af1011199f65ca6405811573e44061c903d0f24c7c0379a5f65.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTEwNTc2ODN9.48eiBKuwwL8bFyQcfYyicnFSogra0Eh0IpyaRMg5NvY
在边端kubeedge-node使用命令加入集群,命令如下:
[root@kubeedge-node ~]# keadm deprecated join --cloudcore-ipport=172.16.2.34:10000 --kubeedge-version=1.11.1 --token=1f0f213568007af1011199f65ca6405811573e44061c903d0f24c7c0379a5f65.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTEwNTc2ODN9.48eiBKuwwL8bFyQcfYyicnFSogra0Eh0IpyaRMg5NvY
install MQTT service successfully.
…
[Run as service] service file already exisits in /etc/kubeedge//edgecore.service, skip download
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
● edgecore.service
Loaded: loaded (/etc/systemd/system/edgecore.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-08-03 06:05:39 UTC; 15s ago
Main PID: 8405 (edgecore)
Tasks: 15
Memory: 34.3M
CGroup: /system.slice/edgecore.service
└─8405 /usr/local/bin/edgecore
#查看状态服务是否为active
在云端master节点检查边缘端节点是否正常加入,命令如下:
[root@master kubeedge]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubeedge-node Ready agent,edge 5m19s v1.22.6-kubeedge-v1.11.1
master Ready control-plane,master 176m v1.22.1
#若节点数量显示为两台,且状态为Ready,证明节点加入成功
3.4 云端节点部署监控服务
在云端master节点配置证书,命令如下:
[root@master kubeedge]# export CLOUDCOREIPS=“172.16.2.34”
#此处IP填写为云端master节点私网IP
[root@master kubeedge]# cd /etc/kubeedge/
[root@master kubeedge]# ./certgen.sh stream
更新云端配置,使监控数据可以传送至云端master节点,命令如下:
[root@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
更新边缘端的配置,命令如下:
[root@kubeedge-node kubeedge]# vi /etc/kubeedge/config/edgecore.yaml
edgeStream:
enable: true #修改为true
handshakeTimeout: 30
serviceBus:
enable: true #修改为true
重新启动云端服务,命令如下:
[root@master kubeedge]# kill -9 $(netstat -lntup |grep cloudcore |awk ‘NR==1 {print $7}’ |cut -d ‘/’ -f 1)
[root@master kubeedge]# cp -rfv cloudcore.service /usr/lib/systemd/system/
[root@master kubeedge]# systemctl start cloudcore.service
[root@master kubeedge]# netstat -lntup |grep 10003
tcp6 0 0 :::10003 :::* LISTEN 15089/cloudcore
#通过netstat -lntup |grep 10003查看端口,如果出现10003端口则表示成功开启cloudStream
重新启动边缘端服务,命令如下:
[root@kubeedge-node kubeedge]# systemctl restart edgecore.service
在云端部署服务并查看收集指标,命令如下:
[root@master kubeedge]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
kubeedge-node 24m 0% 789Mi 6%
master 278m 3% 8535Mi 54%
#服务部署后,需等待一段时间才能查看到kubeedge-node的资源使用情况,这时因为数据还未同步至云端节点
4.云端节点部署kubeedge-dashboard
4.1 Kubeedge dashboard部署
使用命令执行创建kubeedge-dashboard.yaml文件,命令如下:
[root@master kubeedge]# vi /opt/kubeedge-counter-demo/crds/kubeedge-dashboard.yaml
…
location ^~ /api/ {
proxy_pass https://172.16.2.34:6443; #修改此处地址为虚拟私有IP
}
location ^~ /apis/ {
proxy_pass https://172.16.2.34:6443; #修改此处地址
}
[root@master kubeedge]# kubectl create -f kubeedge-dashboard.yaml
namespace/kubeedge-dashboard created
configmap/nginx-config created
service/kdashboard-service created
[root@master kubeedge]# kubectl get pod -n kubeedge-dashboard
NAME READY STATUS RESTARTS AGE
pod/kdashboard-deploy-64556c67ff-crvf6 1/1 Running 0 9m52s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kdashboard-service NodePort 192.111.3.90 <none> 30086:30086/TCP 9m52s
在云端master节点执行,获取登录token:
[root@master ~]# kubectl create serviceaccount curl-user -n kube-system
[root@master ~]# kubectl create clusterrolebinding curl-user-binding --clusterrole=cluster-admin --serviceaccount=kube-system:curl-user -n kube-system
[root@master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep curl-user | awk ‘{print $1}’)
4.2 页面展示与使用
浏览器访问云端http://master节点公网IP:30086(安全组需放开30086端口入方向规则),如图4-1所示。
图4-1 Kubeedge-dashboard登录页面
将master节点上获取的token复制粘贴到登录框中,即可进入到管理页面,如图4-2所示。
图4-2 Kubeedge-dashboard管理页面
点击功能栏中的“节点”,即可看到当前集群中存在的节点信息,如图4-3所示。
图4-3 节点管理
5.kubeedge-counter-demo部署
5.1 部署Device Model和Device
利用搭建好的边缘计算平台,部署计数器应用。
首先要部署Device Model和Device,它们是Kubernetes CRD自定义的两个资源类型,用来描述设备的元数据和状态,利用提供的yaml文件部署设备模型,命令如下:
[root@master kubeedge]# cd /opt/kubeedge-counter-demo/crds/
[root@master crds]# cat kubeedge-counter-model.yaml
apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:
name: counter-model
namespace: default
spec:
properties:
- name: status
description: counter status
type:
string:
accessMode: ReadWrite
defaultValue: ‘’
#该文件定义了一个名为“counter-model的计数器模型”,并描述了计数器的状态为可读写的字符串类型,默认为空
[root@master crds]# kubectl apply -f kubeedge-counter-model.yaml
devicemodel.devices.kubeedge.io/counter-model created
[root@master crds]# kubectl get devicemodel -A #获取模型列表
NAMESPACE NAME AGE
default counter-model 60s
接下来部署设备实例,命令如下:
[root@master crds]# cat 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
- key: ’ kubernetes.io/hostname ’
- matchExpressions:
status:
twins:
- propertyName: status
desired:
metadata:
type: string
value: ‘OFF’
reported:
metadata:
type: string
value: ‘0’
#该文件定义了一个“counter”的设备实例,配置引用了上面创建的“counter-model ”,并定义了状态的属性分别为“OFF”和“0”
[root@master crds]# kubectl apply -f kubeedge-counter-instance.yaml
device.devices.kubeedge.io/counter created
[root@master crds]# kubectl get device -A #获取设备实例列表
NAMESPACE NAME AGE
default counter 8s
5.2部署云端应用控制器
该控制器是一个通用的 Web 控制器应用,可以管理和监控多种类型的设备和应用程序,这里可以利用该控制器来管理创建的计数器设备和模型。
使用提供的yaml文件部署云端应用控制器,命令如下:
[root@master crds]# cat 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: 172.16.2.34/k8s/kubeedge-counter-app:v1.0.0 #地址修改为云端服务器内网IP
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
roleRef:
kind: Role
name: kubeedge-counter
apiGroup: rbac.authorization.k8s.io
[root@master crds]# kubectl apply -f kubeedge-web-controller-app.yaml
deployment.apps/kubeedge-counter-app unchanged
role.rbac.authorization.k8s.io/kubeedge-counter unchanged
rolebinding.rbac.authorization.k8s.io/kubeedge-counter-rbac created
[root@master crds]# kubectl get pod -A |grep counter
default kubeedge-counter-app-7f4dc5bfc6-zbkjs 1/1 Running 0 8m52s
查看是否存在8089端口,也可以浏览器访问云端master节点公网IP:8089(需要在华为云安全组中放开入方向8089端口),如图5-1所示。
[root@master crds]# netstat -ntpl |grep 8089
tcp6 0 0 :::8089 :::* LISTEN 16234/kubeedge-coun
图5-1 访问Web Controller
5.3部署边端计数器
边缘端的pi-counter-app应用受云端应用控制,主要与mqtt服务器通信,进行简单的计数功能。
利用提供的yaml文件部署边端计数器,命令如下:
[root@master crds]# scp /opt/k8simage/edgepause.tar kubeedge-node:/root/
[root@kubeedge-node ~]# docker load -i /root/edgepause.tar
#边端kubeedge-node节点导入镜像
[root@kubeedge-node kubeedge]# docker login -u admin -p Harbor12345 master
#首先在边端kubeedge-node节点登录仓库
[root@master crds]# cat 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: “”
hostNetwork: true
containers:
- name: kubeedge-pi-counter
image: 172.16.2.34/k8s/kubeedge-pi-counter:v1.0.0
#地址为实际的镜像地址
imagePullPolicy: IfNotPresent
nodeSelector:
node-role.kubernetes.io/edge: “”
restartPolicy: Always
#为了避免云端节点服务和边端节点服务在通信时报错,导致pod运行失败,所以先重启两个节点的核心服务
[root@master ~]# systemctl restart cloudcore
[root@kubeedge-node ~]# systemctl restart edgecore.service
[root@master crds]# kubectl apply -f kubeedge-pi-counter-app.yaml
[root@master crds]# kubectl get pod -o wide |grep pi-counter
kubeedge-pi-counter-54dc4b94f4-49vdg 1/1 Running 0 12m 172.128.11.202 kubeedge-node <none> <none>
5.4 测试应用
在边缘端节点查看kubeedge-pi容器,并查看日志,命令如下:
[root@kubeedge-node ~]# docker ps #容器名称为k8s_kubeedge-pi-counter_kubeedge-开头
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13e73ff1864f 172.16.2.34/k8s/kubeedge-pi-counter “/pi-counter-app pi-…” 18 seconds ago Up 18 seconds k8s_kubeedge-pi-counter_kubeedge-pi-counter-6446d778f8-sl2h2_default_7be252ae-1d66-4372-ab68-3d8646f66318_0
26c5ffaa0574 kubeedge/pause:3.1 “/pause” 20 seconds ago Up 20 seconds k8s_POD_kubeedge-pi-counter-6446d778f8-sl2h2_default_7be252ae-1d66-4372-ab68-3d8646f66318_0
[root@kubeedge-node ~]# docker logs 13e73ff1864f -f
#查询容器日志,可以看到反馈结果首先为空,还没有日志数据
打开浏览器输入http://master公网IP:8089/ 在Web页面上选择ON,并单击“Execute”按钮,可以在边缘计算节点上再次查看执行结果,命令如下:
[root@kubeedge-node ~]# docker logs 820a0e10830e -f
turn on counter.
Counter value: 1
Counter value: 2
Counter value: 3
Counter value: 4
Counter value: 5
Counter value: 6
Counter value: 7
Counter value: 8
turn off counter.
点击“OFF”,可以结束计数。在Web页面上选择STATUS,并单击“Execute”按钮,会在Web页面上返回counter当前的status状态,如图5-2所示。
图5-2 计数状态
- 点赞
- 收藏
- 关注作者
评论(0)