- 深入理解邊緣計算:云、邊、端工作原理與源碼分析
- 崔廣章
- 4003字
- 2021-06-24 11:28:37
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。對這些應用相關資源的操作,與集群相關資源的操作比較相似,我們可以參考集群管理對指定資源進行增、刪、改、查。
需要說明一點,應用相關的資源一般需要用戶創建和管理,也就是說掌握對應用相關的資源的增、刪、改、查是有必要的。