官术网_书友最值得收藏!

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ī)配置

022-01

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)行。

023-01

圖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)容。

024-01

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

026-01

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

031-01

圖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)行。

032-01

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

032-02

圖1-17 EdgeX Foundry的登錄頁(yè)面

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

033-01

圖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)的資源的增、刪、改、查是有必要的。

主站蜘蛛池模板: 搜索| 沧源| 台南县| 板桥市| 吉林市| 重庆市| 宜都市| 汤阴县| 汉川市| 讷河市| 万盛区| 华容县| 穆棱市| 阳曲县| 罗田县| 吴忠市| 阳山县| 石家庄市| 辛集市| 霍邱县| 玛纳斯县| 安泽县| 新竹县| 海淀区| 娄烦县| 大理市| 西城区| 宁强县| 凤凰县| 苍溪县| 博白县| 丁青县| 桃园市| 翼城县| 伊宁县| 南和县| 忻城县| 内乡县| 顺昌县| 东辽县| 微博|