1.3 边缘计算系统的部署与管理
本节对边缘计算系统的部署采用两个节点的形式,即将边缘计算系统的云部分Kubernetes部署在云控制节点,边缘部分KubeEdge和端部分EdgeX Foundry部署在边缘计算节点。这样做的目的是让读者能够快速部署边缘计算系统。通过操作已运行的系统,读者可对本书要讲的边缘计算系统有一个感性认识。
1.3.1 系统部署
本节将对边缘计算系统部署所需要的主机环境和部署Docker、Kubernetes、KubeEdge和EdgeX Foundry的相关步骤进行说明。
1. 主机环境
表1-4是部署边缘计算系统的两台主机的详细配置,该环境包含两个节点,即云控制节点和边缘计算节点。
表1-4 部署边缘计算系统主机配置
2. 部署Docker
本节Docker的安装步骤适合CentOS 7.7 64位操作系统,具体安装步骤如下。其他操作系统请读者参考Docker官网相关安装文档。
1)卸载之前安装的老版本Docker(可选),命令如下:
# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2)安装Docker Repository,命令如下:
# yum install -y yum-utils device-Mapper-persistent-data lvm2
配置安装Docker时需要的仓库链接,命令如下:
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3)安装Docker Engine-Community(最新版本),命令如下:
# yum install docker-ce docker-ce-cli containerd.io
4)查看已安装的Docker相关包,命令如下:
# yum list docker-ce --showduplicates | sort -r
5)启动Docker,命令如下:
# systemctl start docker
6)查看Docker运行状态,确认Docker已经正常运行,命令如下:
# systemctl status docker
如果输出类似图1-12的信息,说明Docker已经正常运行。
图1-12 Docker运行状态
3. 部署Kubernetes
下面介绍Kubernetes16.5的部署。本书的边缘计算系统中只需要部署Kubernetes Master节点,并将其作为边缘计算系统的云控制中心。为了让Kubernetes的部署得更完整,下面将部署Kubernetes Node节点的步骤包含了进来。
(1)安装Kubernetes Master节点
1)在需要运行Kubelet的节点上关闭Swap分区,命令如下:
# swapoff -a
2)关闭防火墙,命令如下:
# systemctl disable firewalld && systemctl stop firwalld
3)关闭SELinux,命令如下:
# setenforce 0
4)下载所需的二进制文件和镜像压缩包并解压。
服务二进制文件是Kubernetes GitHub上发布的编译好的Kubernetes版本,包括各组件的二进制和镜像。进入Kubernetes发布(release)页面,点击某个已发布版本的changelog,如CHANGELOG-1.16.5.md,下载其中的服务二进制压缩包。下载完成的安装包如下所示:
[root@all-in-one~]# ls kubernetes-server-linux-amd64.tar.gz
解压安装包命令:
# tar -zxvf Kubernetes-server-linux-amd64.tar.gz
通过上述命令解压后,我们会看到类似图1-13的内容。
图1-13 Kubernetes服务二进制压缩包解压
通过图1-13可知,压缩包Kubernetes-server-linux-amd64.tar.gz解压成文件夹kubernetes,所需的二进制文件和镜像都在kubernetes/server/bin目录下。
5)把kubernetes/server/bin里的kubeadm、kubelet、kubectl三个二进制文件复制到/usr/bin下,命令如下:
#cp kubernetes/server/bin/kubectl kubernetes/server/bin/kubeadm kubernetes/server/bin/kubelet /usr/bin
6)提前加载控制平面镜像。
根据官方文档中“Running kubeadm without an internet connection”小节内容,Kubeadm在执行kubeadm init过程中需要启动控制平面,因此需要在此之前将控制平面对应版本的镜像准备好,包括Apiserver、Controller Manager、Scheduler和Kube-proxy组件镜像,然后将kubernetes/server/bin中包含的镜像压缩包加载到Master节点,命令如下:
#docker load -i kube-scheduler.tar
但是,Etcd和Pause镜像需要通过其他途径(如Docker Hub)来获得。
7)下载Kubelet的systemd unit定义文件,命令如下:
# export RELEASE=v1.16.5 #curl -sSL "https://raw.GitHubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" > /etc/systemd/system/kubelet.service
其中,RELEASE变量需要提前导出,如v1.16.5。
8)下载Kubeadm配置文件,命令如下:
#mkdir -p /etc/systemd/system/Kubelet.service.d #curl -sSL
9)设置Kubelet开机自启动,命令如下:
#systemctl enable Kubelet
10)初始化Master节点,命令如下:
#kubeadm init --kubernetes-version=v1.16.5 --pod-network-cidr=10.244.0.0/16
其中,kubernetes-version告诉Kubeadm具体需要安装什么版本的Kubernetes;“pod-network-cidr=192.168.0.0/16 flflag”的值与具体网络方案有关,这个值对应后面的Calico网络方案。如果安装的是Flannel,则pod-network-cidr的值应该是10.244.0.0/16。
注意
如果所有镜像就绪,则kubeadm init步骤执行时间只需几分钟。如果安装过程中遇到错误需要重试,则重试之前运行kubeadm reset。
11)配置Kubectl。
由于下面安装Pod网络时使用了Kubectl,因此需要在此之前执行如下配置。
- 如果后续流程使用root账户,则执行:
#export KUBECONFIG=/etc/kubernetes/admin.conf
注意
为了方便,我们可以将该命令写到<home>/.profifile下。
- 如果后续流程使用非root账户,则执行:
# mkdir -p $HOME/.kube # cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # chown $(id -u):$(id -g) $HOME/.kube/config
12)安装pod。
这里选择Calico,按照Kubernetes官方安装文档操作即可,命令如下:
#kubectl apply -f
Calico的yaml文件链接为:
https://docs.projectCalico.org/v3.7/manifests/Calico.yaml
13)设置Trait允许Pod调度到Master节点上,否则Master节点的状态是不可用(not ready)。(该步骤为可选项,如果是单节点集群则执行此步。)
默认在执行kubeadm init过程中,通过执行以下命令使Pod调度到Master节点上:
#kubectl taint nodes --all node-role.Kubernetes.io/master-
14)执行到这一步,我们已经有了一个单节点Kubernetes集群,可以运行Pod。如果需要更多节点加入,可以把其他节点集合到集群。安装就绪的单节点集群如图1-14所示。
图1-14 单节点集群负载
(2)安装Kubernetes Node节点(可选)
1)关闭内存Swap分区:swapoff -a
。
2)安装Docker。
3)安装Kubeadm、Kubelet。
详细内容读者可参考官网安装Kubernetes Master节点的步骤。
将安装Kubernetes Master节点时下载的服务二进制压缩包里包含的kubeadm、kubelet两个二进制文件复制到/usr/bin下。
4)准备镜像。
把安装Kubernetes Master节点时下载的Kube-proxy、Pause镜像转移到该节点并加载。
5)为Kubelet和Kubeadm准备配置文件,命令如下:
# export RELEASE=v1.16.5 #curl -sSL "https://raw.GitHubusercontent.com/Kubernetes/Kubernetes/ ${RELEASE}/build/debs/Kubelet.service" > /etc/systemd/system/Kubelet.service #mkdir -p /etc/systemd/system/Kubelet.service.d #curl -sSL "https://raw.GitHubusercontent.com/Kubernetes/Kubernetes/ ${RELEASE}/build/debs/10-kubeadm.conf" > /etc/systemd/system/Kubelet.service.d/10-kubeadm.conf
6)设置Kubelet开机自动启动,命令如下:
# systemctl enable Kubelet
7)将Node节点加入集群,命令如下:
# kubeadm join --token : --discovery-token-ca-cert-hash sha256:
注意
这条命令在Master节点执行kubeadm init结束时会在Console上显示。
4. 部署KubeEdge
在Kubernetes已经安装成功的基础上安装KubeEdge 1.1.0,将Kubernetes Master节点作为云控制节点。
(1)安装Cloud部分
1)修改Kubernetes Master节点配置。
Cloud端是KubeEdge中与Kube-apiserver交互的组件,在本书中Cloud端与Kube-apiserver交互使用的是非安全端口,需要在Kubernetes Master节点上做如下修改:
#vi /etc/Kubernetes/manifests/kube-apiserver.yaml - --insecure-port=8080 - --insecure-bind-address=0.0.0.0
2)下载安装包。可以通过两种方式下载安装包:通过cURL直接下载;在KubeEdge的已发布版本的仓库中下载。
- 第一种方式:通过cURL直接下载。
VERSION="v1.0.0" OS="linux" ARCH="amd64" curl -L "https://GitHub.com/KubeEdge/KubeEdge/releases/download/ ${VERSION}/KubeEdge-${VERSION}-${OS}-${ARCH}.tar.gz" --output KubeEdge-${VERSION}-${OS}-${ARCH}.tar.gz && tar -xf KubeEdge-${VERSION}-${OS}-${ARCH}.tar.gz -C /etc
注意
通过cURL直接下载,由于网速问题,一般需要的时间比较久,失败的可能性较大。
- 第二种方式:在KubeEdge的已发布版本的仓库中下载。
进入KubeEdge的GitHub仓库的KubeEdge v1.0.0发布页面,下载kubeEdge-v1.0.0-linux-amd64.tar.gz,将下载的安装包上传到Kubernetes Master节点的/root目录,命令如下:
#tar -zxvf kubeEdge-v1.0.0-linux-amd64.tar.gz # mv kubeEdge-v1.0.0-linux-amd64 /etc/KubeEdge
3)在Kubernetes Master节点上生成证书。
生成的证书用于KubeEdge的Edge与Cloud端加密通信。证书生成命令如下:
#wget -L https://raw.GitHubusercontent.com/kubeEdge/kubeEdge/master/build/tools/certgen.sh #chmod +x certgen.sh bash -x ./certgen.sh genCertAndKey edge
注意
上述步骤执行成功之后,会在/etc/kubeEdge下生成ca和certs两个目录。
4)创建Device Model和Device CRD。
在Kubernetes Master节点上创建KubeEdge所需的Device Model和Device CRD。创建步骤如下:
#wget -L https://raw.GitHubusercontent.com/KubeEdge/KubeEdge/master/build/crds/devices/devices_v1alpha1_devicemodel.yaml #chmod +x devices_v1alpha1_devicemodel.yaml #kubectl create -f devices_v1alpha1_devicemodel.yaml #wget -L https://raw.GitHubusercontent.com/KubeEdge/KubeEdge/master/build/crds/devices/devices_v1alpha1_device.yaml #chmod +x devices_v1alpha1_device.yaml #kubectl create -f devices_v1alpha1_device.yaml
5)运行Cloud端。
在Kubernetes Master节点上运行KubeEdge的Cloud端,命令如下:
#cd /etc/KubeEdge/cloud #./CloudCore
注意
为了方便查看进程输出,本节采用了前台驻留进程的方式。除了上述方式外,我们还可以通过Systemd来查看。
(2)安装Edge部分
Edge端是KubeEdge运行在边缘设备上的部分。在Edge端运行之前,我们需要安装合适的容器运行时,包括Docker、Containerd和Cri-o。本节采用的容器运行时是Docker。
1)准备Edge端安装包。
因为证书问题,可以将Kubernetes Master节点上的/etc/kubeEdge直接复制到Edge节点的/etc下,命令如下:
#scp -r /etc/kubeEdge root@{ edge节点ip }:/etc
2)在Kubernetes Master节点上创建Edge节点的Node资源对象,命令如下:
# vi node.json { "kind": "Node", "apiVersion": "v1", "metadata": { "name": "edge-node", "labels": { "name": "edge-node", "node-role.kubernetes.io/edge": "" } } } # kubectl create -f node.json
3)Edge部分的配置。
配置内容包括Edge端连接Cloud端的IP;Edge端的Name与在Kubernetes Master上创建的Node的名称相对应。
①Edge端连接Cloud端的IP。
edgehub.websocket.url:IP修改成Kubernetes Master IP端口名。
edgehub.quic.url:IP修改成Kubernetes Master IP端口名。
②Edge端的Name与在Kubernetes Master上创建的Node的名称相对应。
controller:node-id与在Kubernetes Master上创建的Node的名称相对应。
edged:hostname-override与在Kubernetes Master上创建的Node的名称相对应。
4)运行Edge端,命令如下:
#cd /etc/kubeEdge/edge #./edgecore
(3)验证KubeEdge是否正常运行
KubeEdge部署成功后,在Kubernetes Master节点通过Kubectl工具查看其运行状态,具体如图1-15所示。
图1-15 集群节点运行状态
5. 部署EdgeX Foundry
EdgeX Foundry是一套可以用KubeEdge部署到边缘的IoT SaaS平台。它可以采集、存储IoT设备的数据并将其导出到云数据中心,同时通过向终端设备下发指令对终端设备进行控制。
(1)准备镜像
本节以容器的形式部署EdgeX Foundry,需要在KubeEdge管理的边缘计算节点上准备edgex-ui-go、edgex-vault、edgex-mongo、support-scheduler-go、support-notifications-go、support-logging-go、core-command-go、core-metadata-go、core-data-go、export-distro-go、export-client-go、edgex-vault-worker-go、edgex-vault和edgex-volume共14个镜像。
有两种方法获取这些镜像。
1)直接在DockerHub上下载这些镜像。
2)根据EdgeX Foundry源码仓库中的makefile文件构建这些镜像。
(2)准备部署EdgeX Foundry组件所需的yaml文件
需要在前面部署的Kubernetes Master节点上准备与每个镜像对应的yaml文件,对其进行部署。绝大多数镜像需要通过Deployment进行部署,少数镜像需要通过Job进行部署,有些镜像还需要通过Service对外暴露服务,这些yaml文件没有固定的标准。目前,EdgeX Foundry官方还没有提供相关yaml文件,建议根据具体场景进行编写。
(3)通过yaml文件部署EdgeX Foundry
至此,我们已经拥有Kubernetes Master节点,并将Master节点作为云端控制节点,将KubeEdge管理的节点作为边缘计算节点的云、边协同的集群。同时,在KubeEdge管理的节点上已准备好部署EdgeX Foundry所需的镜像,在Kubernetes Master节点上准备好运行EdgeX Foundry镜像所需的yaml文件。接下来,只需在Kubernetes Master节点上通过kubectl命令创建yaml文件中描述的资源对象即可,具体命令如下:
#kubectl create -f {文件名}.yaml
yaml文件中描述的资源对象都创建好了,意味着EdgeX Foundry的部署结束。至于EdgeX Foundry是否部署成功,我们可以通过如下命令进行验证:
#kubectl get pods –all-namespace
从图1-16可知,部署的EdgeX Foundry相关组件都已正常运行。
图1-16 EdgeX Foundry组件运行状态
最后,通过在浏览器里访问edgex-ui-go(即在浏览器访问http://{EdgeX Foundry所运行主机的IP}:4000)进入EdgeX Foundry的登录页面,具体如图1-17所示。
图1-17 EdgeX Foundry的登录页面
在图1-17中输入EdgeX Foundry对应的Name/Password,就可以成功进入EdgeX Foundry的控制台,具体如图1-18所示。
图1-18 EdgeX Foundry控制台
至此,我们已经拥有由两个节点组成的,包含云、边、端的完整边缘计算系统。接下来介绍边缘计算系统的管理,以及在该边缘计算系统上部署应用。
1.3.2 系统管理
通过以上对云、边、端三部分的梳理,我们了解到边缘计算系统的管理可分为集群管理和应用管理。
1. 集群管理
集群管理是对集群级别的资源进行管理,这些资源主要包括Node、NameSpace。下面通过对上述对象的增、删、改、查进行说明。
(1)对Node的操作
1)创建Node,命令如下:
# kubectl create -f {node定义文件}.ymal
2)删除Node,命令如下:
# kubectl delete -f {node定义文件}.ymal #kubectl delete node {node名字}
3)修改Node,命令如下:
#kubectl apply -f {修改过的node定义文件}.yaml #kubectl edit node {node名字}
4)查看Node,命令如下:
- 查看集群的Node列表:
#kubectl get nodes
- 查看指定Node的具体定义:
#kubectl describe node {node名字}
(2)对NameSpace的操作
1)创建NameSpace,命令如下:
# kubectl create -f {namespace定义文件}.ymal # kubectl create namespace {namespace名字}
2)删除NameSpace,命令如下:
# kubectl delete -f {namespace定义文件}.ymal #kubectl delete namespace {namespace名字}
3)修改NameSpace,命令如下:
#kubectl apply -f {修改过的namespace定义文件}.yaml #kubectl edit namespace {namespace名字}
4)查看NameSpace。
- 查看集群的NameSpace列表,命令如下:
#kubectl get namespace
- 查看指定NameSpace的具体定义,命令如下:
#kubectl describe namespace {namespace名字}
集群级别的资源一般不需要用户对其进行创建、修改或者删除,只是在用户需要时对其进行查看。
2. 应用管理
应用管理主要是对应用相关的资源进行管理,这些资源包括Deployment、ReplicaSet、Pod、Service Endpoint、Service Acount、Secret、Persistent Volume、Persistent Volume Claim。对这些应用相关资源的操作,与集群相关资源的操作比较相似,我们可以参考集群管理对指定资源进行增、删、改、查。
需要说明一点,应用相关的资源一般需要用户创建和管理,也就是说掌握对应用相关的资源的增、删、改、查是有必要的。