- 深入理解邊緣計(jì)算:云、邊、端工作原理與源碼分析
- 崔廣章
- 4003字
- 2021-06-24 11:28:37
1.3 邊緣計(jì)算系統(tǒng)的部署與管理
本節(jié)對(duì)邊緣計(jì)算系統(tǒng)的部署采用兩個(gè)節(jié)點(diǎn)的形式,即將邊緣計(jì)算系統(tǒng)的云部分Kubernetes部署在云控制節(jié)點(diǎn),邊緣部分KubeEdge和端部分EdgeX Foundry部署在邊緣計(jì)算節(jié)點(diǎn)。這樣做的目的是讓讀者能夠快速部署邊緣計(jì)算系統(tǒng)。通過操作已運(yùn)行的系統(tǒng),讀者可對(duì)本書要講的邊緣計(jì)算系統(tǒng)有一個(gè)感性認(rèn)識(shí)。
1.3.1 系統(tǒng)部署
本節(jié)將對(duì)邊緣計(jì)算系統(tǒng)部署所需要的主機(jī)環(huán)境和部署Docker、Kubernetes、KubeEdge和EdgeX Foundry的相關(guān)步驟進(jìn)行說明。
1. 主機(jī)環(huán)境
表1-4是部署邊緣計(jì)算系統(tǒng)的兩臺(tái)主機(jī)的詳細(xì)配置,該環(huán)境包含兩個(gè)節(jié)點(diǎn),即云控制節(jié)點(diǎn)和邊緣計(jì)算節(jié)點(diǎn)。
表1-4 部署邊緣計(jì)算系統(tǒng)主機(jī)配置

2. 部署Docker
本節(jié)Docker的安裝步驟適合CentOS 7.7 64位操作系統(tǒng),具體安裝步驟如下。其他操作系統(tǒng)請(qǐng)讀者參考Docker官網(wǎng)相關(guān)安裝文檔。
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時(shí)需要的倉(cāng)庫(kù)鏈接,命令如下:
# 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相關(guān)包,命令如下:
# yum list docker-ce --showduplicates | sort -r
5)啟動(dòng)Docker,命令如下:
# systemctl start docker
6)查看Docker運(yùn)行狀態(tài),確認(rèn)Docker已經(jīng)正常運(yùn)行,命令如下:
# systemctl status docker
如果輸出類似圖1-12的信息,說明Docker已經(jīng)正常運(yùn)行。

圖1-12 Docker運(yùn)行狀態(tài)
3. 部署Kubernetes
下面介紹Kubernetes16.5的部署。本書的邊緣計(jì)算系統(tǒng)中只需要部署Kubernetes Master節(jié)點(diǎn),并將其作為邊緣計(jì)算系統(tǒng)的云控制中心。為了讓Kubernetes的部署得更完整,下面將部署Kubernetes Node節(jié)點(diǎn)的步驟包含了進(jìn)來。
(1)安裝Kubernetes Master節(jié)點(diǎn)
1)在需要運(yùn)行Kubelet的節(jié)點(diǎn)上關(guān)閉Swap分區(qū),命令如下:
# swapoff -a
2)關(guān)閉防火墻,命令如下:
# systemctl disable firewalld && systemctl stop firwalld
3)關(guān)閉SELinux,命令如下:
# setenforce 0
4)下載所需的二進(jìn)制文件和鏡像壓縮包并解壓。
服務(wù)二進(jìn)制文件是Kubernetes GitHub上發(fā)布的編譯好的Kubernetes版本,包括各組件的二進(jìn)制和鏡像。進(jìn)入Kubernetes發(fā)布(release)頁(yè)面,點(diǎn)擊某個(gè)已發(fā)布版本的changelog,如CHANGELOG-1.16.5.md,下載其中的服務(wù)二進(jìn)制壓縮包。下載完成的安裝包如下所示:
[root@all-in-one~]# ls kubernetes-server-linux-amd64.tar.gz
解壓安裝包命令:
# tar -zxvf Kubernetes-server-linux-amd64.tar.gz
通過上述命令解壓后,我們會(huì)看到類似圖1-13的內(nèi)容。

圖1-13 Kubernetes服務(wù)二進(jìn)制壓縮包解壓
通過圖1-13可知,壓縮包Kubernetes-server-linux-amd64.tar.gz解壓成文件夾kubernetes,所需的二進(jìn)制文件和鏡像都在kubernetes/server/bin目錄下。
5)把kubernetes/server/bin里的kubeadm、kubelet、kubectl三個(gè)二進(jìn)制文件復(fù)制到/usr/bin下,命令如下:
#cp kubernetes/server/bin/kubectl kubernetes/server/bin/kubeadm kubernetes/server/bin/kubelet /usr/bin
6)提前加載控制平面鏡像。
根據(jù)官方文檔中“Running kubeadm without an internet connection”小節(jié)內(nèi)容,Kubeadm在執(zhí)行kubeadm init過程中需要啟動(dòng)控制平面,因此需要在此之前將控制平面對(duì)應(yīng)版本的鏡像準(zhǔn)備好,包括Apiserver、Controller Manager、Scheduler和Kube-proxy組件鏡像,然后將kubernetes/server/bin中包含的鏡像壓縮包加載到Master節(jié)點(diǎn),命令如下:
#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變量需要提前導(dǎo)出,如v1.16.5。
8)下載Kubeadm配置文件,命令如下:
#mkdir -p /etc/systemd/system/Kubelet.service.d #curl -sSL
9)設(shè)置Kubelet開機(jī)自啟動(dòng),命令如下:
#systemctl enable Kubelet
10)初始化Master節(jié)點(diǎn),命令如下:
#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”的值與具體網(wǎng)絡(luò)方案有關(guān),這個(gè)值對(duì)應(yīng)后面的Calico網(wǎng)絡(luò)方案。如果安裝的是Flannel,則pod-network-cidr的值應(yīng)該是10.244.0.0/16。
注意
如果所有鏡像就緒,則kubeadm init步驟執(zhí)行時(shí)間只需幾分鐘。如果安裝過程中遇到錯(cuò)誤需要重試,則重試之前運(yùn)行kubeadm reset。
11)配置Kubectl。
由于下面安裝Pod網(wǎng)絡(luò)時(shí)使用了Kubectl,因此需要在此之前執(zhí)行如下配置。
- 如果后續(xù)流程使用root賬戶,則執(zhí)行:
#export KUBECONFIG=/etc/kubernetes/admin.conf
注意
為了方便,我們可以將該命令寫到<home>/.profifile下。
- 如果后續(xù)流程使用非root賬戶,則執(zhí)行:
# 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)設(shè)置Trait允許Pod調(diào)度到Master節(jié)點(diǎn)上,否則Master節(jié)點(diǎn)的狀態(tài)是不可用(not ready)。(該步驟為可選項(xiàng),如果是單節(jié)點(diǎn)集群則執(zhí)行此步。)
默認(rèn)在執(zhí)行kubeadm init過程中,通過執(zhí)行以下命令使Pod調(diào)度到Master節(jié)點(diǎn)上:
#kubectl taint nodes --all node-role.Kubernetes.io/master-
14)執(zhí)行到這一步,我們已經(jīng)有了一個(gè)單節(jié)點(diǎn)Kubernetes集群,可以運(yùn)行Pod。如果需要更多節(jié)點(diǎn)加入,可以把其他節(jié)點(diǎn)集合到集群。安裝就緒的單節(jié)點(diǎn)集群如圖1-14所示。

圖1-14 單節(jié)點(diǎn)集群負(fù)載
(2)安裝Kubernetes Node節(jié)點(diǎn)(可選)
1)關(guān)閉內(nèi)存Swap分區(qū):swapoff -a
。
2)安裝Docker。
3)安裝Kubeadm、Kubelet。
詳細(xì)內(nèi)容讀者可參考官網(wǎng)安裝Kubernetes Master節(jié)點(diǎn)的步驟。
將安裝Kubernetes Master節(jié)點(diǎn)時(shí)下載的服務(wù)二進(jìn)制壓縮包里包含的kubeadm、kubelet兩個(gè)二進(jìn)制文件復(fù)制到/usr/bin下。
4)準(zhǔn)備鏡像。
把安裝Kubernetes Master節(jié)點(diǎn)時(shí)下載的Kube-proxy、Pause鏡像轉(zhuǎn)移到該節(jié)點(diǎn)并加載。
5)為Kubelet和Kubeadm準(zhǔn)備配置文件,命令如下:
# 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)設(shè)置Kubelet開機(jī)自動(dòng)啟動(dòng),命令如下:
# systemctl enable Kubelet
7)將Node節(jié)點(diǎn)加入集群,命令如下:
# kubeadm join --token : --discovery-token-ca-cert-hash sha256:
注意
這條命令在Master節(jié)點(diǎn)執(zhí)行kubeadm init結(jié)束時(shí)會(huì)在Console上顯示。
4. 部署KubeEdge
在Kubernetes已經(jīng)安裝成功的基礎(chǔ)上安裝KubeEdge 1.1.0,將Kubernetes Master節(jié)點(diǎn)作為云控制節(jié)點(diǎn)。
(1)安裝Cloud部分
1)修改Kubernetes Master節(jié)點(diǎn)配置。
Cloud端是KubeEdge中與Kube-apiserver交互的組件,在本書中Cloud端與Kube-apiserver交互使用的是非安全端口,需要在Kubernetes Master節(jié)點(diǎn)上做如下修改:
#vi /etc/Kubernetes/manifests/kube-apiserver.yaml - --insecure-port=8080 - --insecure-bind-address=0.0.0.0
2)下載安裝包。可以通過兩種方式下載安裝包:通過cURL直接下載;在KubeEdge的已發(fā)布版本的倉(cāng)庫(kù)中下載。
- 第一種方式:通過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直接下載,由于網(wǎng)速問題,一般需要的時(shí)間比較久,失敗的可能性較大。
- 第二種方式:在KubeEdge的已發(fā)布版本的倉(cāng)庫(kù)中下載。
進(jìn)入KubeEdge的GitHub倉(cāng)庫(kù)的KubeEdge v1.0.0發(fā)布頁(yè)面,下載kubeEdge-v1.0.0-linux-amd64.tar.gz,將下載的安裝包上傳到Kubernetes Master節(jié)點(diǎn)的/root目錄,命令如下:
#tar -zxvf kubeEdge-v1.0.0-linux-amd64.tar.gz # mv kubeEdge-v1.0.0-linux-amd64 /etc/KubeEdge
3)在Kubernetes Master節(jié)點(diǎn)上生成證書。
生成的證書用于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
注意
上述步驟執(zhí)行成功之后,會(huì)在/etc/kubeEdge下生成ca和certs兩個(gè)目錄。
4)創(chuàng)建Device Model和Device CRD。
在Kubernetes Master節(jié)點(diǎn)上創(chuàng)建KubeEdge所需的Device Model和Device CRD。創(chuàng)建步驟如下:
#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)運(yùn)行Cloud端。
在Kubernetes Master節(jié)點(diǎn)上運(yùn)行KubeEdge的Cloud端,命令如下:
#cd /etc/KubeEdge/cloud #./CloudCore
注意
為了方便查看進(jìn)程輸出,本節(jié)采用了前臺(tái)駐留進(jìn)程的方式。除了上述方式外,我們還可以通過Systemd來查看。
(2)安裝Edge部分
Edge端是KubeEdge運(yùn)行在邊緣設(shè)備上的部分。在Edge端運(yùn)行之前,我們需要安裝合適的容器運(yùn)行時(shí),包括Docker、Containerd和Cri-o。本節(jié)采用的容器運(yùn)行時(shí)是Docker。
1)準(zhǔn)備Edge端安裝包。
因?yàn)樽C書問題,可以將Kubernetes Master節(jié)點(diǎn)上的/etc/kubeEdge直接復(fù)制到Edge節(jié)點(diǎn)的/etc下,命令如下:
#scp -r /etc/kubeEdge root@{ edge節(jié)點(diǎn)ip }:/etc
2)在Kubernetes Master節(jié)點(diǎn)上創(chuàng)建Edge節(jié)點(diǎn)的Node資源對(duì)象,命令如下:
# 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部分的配置。
配置內(nèi)容包括Edge端連接Cloud端的IP;Edge端的Name與在Kubernetes Master上創(chuàng)建的Node的名稱相對(duì)應(yīng)。
①Edge端連接Cloud端的IP。
edgehub.websocket.url:IP修改成Kubernetes Master IP端口名。
edgehub.quic.url:IP修改成Kubernetes Master IP端口名。
②Edge端的Name與在Kubernetes Master上創(chuàng)建的Node的名稱相對(duì)應(yīng)。
controller:node-id與在Kubernetes Master上創(chuàng)建的Node的名稱相對(duì)應(yīng)。
edged:hostname-override與在Kubernetes Master上創(chuàng)建的Node的名稱相對(duì)應(yīng)。
4)運(yùn)行Edge端,命令如下:
#cd /etc/kubeEdge/edge #./edgecore
(3)驗(yàn)證KubeEdge是否正常運(yùn)行
KubeEdge部署成功后,在Kubernetes Master節(jié)點(diǎn)通過Kubectl工具查看其運(yùn)行狀態(tài),具體如圖1-15所示。

圖1-15 集群節(jié)點(diǎn)運(yùn)行狀態(tài)
5. 部署EdgeX Foundry
EdgeX Foundry是一套可以用KubeEdge部署到邊緣的IoT SaaS平臺(tái)。它可以采集、存儲(chǔ)IoT設(shè)備的數(shù)據(jù)并將其導(dǎo)出到云數(shù)據(jù)中心,同時(shí)通過向終端設(shè)備下發(fā)指令對(duì)終端設(shè)備進(jìn)行控制。
(1)準(zhǔn)備鏡像
本節(jié)以容器的形式部署EdgeX Foundry,需要在KubeEdge管理的邊緣計(jì)算節(jié)點(diǎn)上準(zhǔn)備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個(gè)鏡像。
有兩種方法獲取這些鏡像。
1)直接在DockerHub上下載這些鏡像。
2)根據(jù)EdgeX Foundry源碼倉(cāng)庫(kù)中的makefile文件構(gòu)建這些鏡像。
(2)準(zhǔn)備部署EdgeX Foundry組件所需的yaml文件
需要在前面部署的Kubernetes Master節(jié)點(diǎn)上準(zhǔn)備與每個(gè)鏡像對(duì)應(yīng)的yaml文件,對(duì)其進(jìn)行部署。絕大多數(shù)鏡像需要通過Deployment進(jìn)行部署,少數(shù)鏡像需要通過Job進(jìn)行部署,有些鏡像還需要通過Service對(duì)外暴露服務(wù),這些yaml文件沒有固定的標(biāo)準(zhǔn)。目前,EdgeX Foundry官方還沒有提供相關(guān)yaml文件,建議根據(jù)具體場(chǎng)景進(jìn)行編寫。
(3)通過yaml文件部署EdgeX Foundry
至此,我們已經(jīng)擁有Kubernetes Master節(jié)點(diǎn),并將Master節(jié)點(diǎn)作為云端控制節(jié)點(diǎn),將KubeEdge管理的節(jié)點(diǎn)作為邊緣計(jì)算節(jié)點(diǎn)的云、邊協(xié)同的集群。同時(shí),在KubeEdge管理的節(jié)點(diǎn)上已準(zhǔn)備好部署EdgeX Foundry所需的鏡像,在Kubernetes Master節(jié)點(diǎn)上準(zhǔn)備好運(yùn)行EdgeX Foundry鏡像所需的yaml文件。接下來,只需在Kubernetes Master節(jié)點(diǎn)上通過kubectl命令創(chuàng)建yaml文件中描述的資源對(duì)象即可,具體命令如下:
#kubectl create -f {文件名}.yaml
yaml文件中描述的資源對(duì)象都創(chuàng)建好了,意味著EdgeX Foundry的部署結(jié)束。至于EdgeX Foundry是否部署成功,我們可以通過如下命令進(jìn)行驗(yàn)證:
#kubectl get pods –all-namespace
從圖1-16可知,部署的EdgeX Foundry相關(guān)組件都已正常運(yùn)行。

圖1-16 EdgeX Foundry組件運(yùn)行狀態(tài)
最后,通過在瀏覽器里訪問edgex-ui-go(即在瀏覽器訪問http://{EdgeX Foundry所運(yùn)行主機(jī)的IP}:4000)進(jìn)入EdgeX Foundry的登錄頁(yè)面,具體如圖1-17所示。

圖1-17 EdgeX Foundry的登錄頁(yè)面
在圖1-17中輸入EdgeX Foundry對(duì)應(yīng)的Name/Password,就可以成功進(jìn)入EdgeX Foundry的控制臺(tái),具體如圖1-18所示。

圖1-18 EdgeX Foundry控制臺(tái)
至此,我們已經(jīng)擁有由兩個(gè)節(jié)點(diǎn)組成的,包含云、邊、端的完整邊緣計(jì)算系統(tǒng)。接下來介紹邊緣計(jì)算系統(tǒng)的管理,以及在該邊緣計(jì)算系統(tǒng)上部署應(yīng)用。
1.3.2 系統(tǒng)管理
通過以上對(duì)云、邊、端三部分的梳理,我們了解到邊緣計(jì)算系統(tǒng)的管理可分為集群管理和應(yīng)用管理。
1. 集群管理
集群管理是對(duì)集群級(jí)別的資源進(jìn)行管理,這些資源主要包括Node、NameSpace。下面通過對(duì)上述對(duì)象的增、刪、改、查進(jìn)行說明。
(1)對(duì)Node的操作
1)創(chuàng)建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)對(duì)NameSpace的操作
1)創(chuàng)建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名字}
集群級(jí)別的資源一般不需要用戶對(duì)其進(jìn)行創(chuàng)建、修改或者刪除,只是在用戶需要時(shí)對(duì)其進(jìn)行查看。
2. 應(yīng)用管理
應(yīng)用管理主要是對(duì)應(yīng)用相關(guān)的資源進(jìn)行管理,這些資源包括Deployment、ReplicaSet、Pod、Service Endpoint、Service Acount、Secret、Persistent Volume、Persistent Volume Claim。對(duì)這些應(yīng)用相關(guān)資源的操作,與集群相關(guān)資源的操作比較相似,我們可以參考集群管理對(duì)指定資源進(jìn)行增、刪、改、查。
需要說明一點(diǎn),應(yīng)用相關(guān)的資源一般需要用戶創(chuàng)建和管理,也就是說掌握對(duì)應(yīng)用相關(guān)的資源的增、刪、改、查是有必要的。
- 圖表細(xì)說電子工程師速成手冊(cè)(第2版)
- 5G網(wǎng)絡(luò)技術(shù)與業(yè)務(wù)應(yīng)用
- 元器件應(yīng)用電路全掌握(雙色版)
- 電子產(chǎn)品零部件檢測(cè)與選用技能演練
- 大話移動(dòng)通信
- 艦船尾跡的電磁成像機(jī)理及特征提取技術(shù)
- 如影隨形:無(wú)處不在的無(wú)線電波
- 通信電子線路
- 移動(dòng)通信技術(shù)及應(yīng)用
- WCDMA網(wǎng)絡(luò)測(cè)試與優(yōu)化教程
- 競(jìng)賽中學(xué)電路
- LED照明設(shè)計(jì)與應(yīng)用
- 現(xiàn)代通信原理
- 三菱FX系列PLC數(shù)據(jù)通信及測(cè)控應(yīng)用
- INSTANT Wireshark Starter