1.3 边缘计算系统的部署与管理

本节对边缘计算系统的部署采用两个节点的形式,即将边缘计算系统的云部分Kubernetes部署在云控制节点,边缘部分KubeEdge和端部分EdgeX Foundry部署在边缘计算节点。这样做的目的是让读者能够快速部署边缘计算系统。通过操作已运行的系统,读者可对本书要讲的边缘计算系统有一个感性认识。

1.3.1 系统部署

本节将对边缘计算系统部署所需要的主机环境和部署Docker、Kubernetes、KubeEdge和EdgeX Foundry的相关步骤进行说明。

1. 主机环境

表1-4是部署边缘计算系统的两台主机的详细配置,该环境包含两个节点,即云控制节点和边缘计算节点。

表1-4 部署边缘计算系统主机配置

022-01

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已经正常运行。

023-01

图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的内容。

024-01

图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所示。

026-01

图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所示。

031-01

图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相关组件都已正常运行。

032-01

图1-16 EdgeX Foundry组件运行状态

最后,通过在浏览器里访问edgex-ui-go(即在浏览器访问http://{EdgeX Foundry所运行主机的IP}:4000)进入EdgeX Foundry的登录页面,具体如图1-17所示。

032-02

图1-17 EdgeX Foundry的登录页面

在图1-17中输入EdgeX Foundry对应的Name/Password,就可以成功进入EdgeX Foundry的控制台,具体如图1-18所示。

033-01

图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。对这些应用相关资源的操作,与集群相关资源的操作比较相似,我们可以参考集群管理对指定资源进行增、删、改、查。

需要说明一点,应用相关的资源一般需要用户创建和管理,也就是说掌握对应用相关的资源的增、删、改、查是有必要的。