KubeEdge 1.1 部署

本文介紹瞭如何在兩臺 ubuntu 16.04 64 bit 雙核 CPU 虛擬機上從源碼開始部署 KubeEdge 1.1.0 集羣的過程,雲端 Kubernetes 版本爲 1.17.0,Golang 版本爲1.12.4。本文具有一定實踐參考意義。

一、概述

1.1 環境

雲端:ubuntu 16.04 64 bit,用戶名爲 ubuntu。IP 爲 192.168.0.102。
邊緣端:同上,IP 爲 192.168.0.140。
KubeEdge部署涉及兩端:

  • 雲端
    docker, kubernetes 集羣和 KubeEdge 雲端核心模塊。
  • 邊緣端
    docker, mqtt 和 KubeEdge 邊緣端核心模塊。

1.2 依賴

依賴組件(含工具、編譯器)及版本:

  • golang
    版本 1.12.14,到 https://studygolang.com/dl 下載。編譯源碼需要,如果不編譯,則無須安裝。需要指出的是,KubeEdge 對 golang 版本有兼容性,根據當前官方要求,需要使用 1.12 版本 golang,因爲不管是最新代碼,還是已發佈的 1.1.0 版本,都不支持 1.13 版本 golang。
  • k8s 版本
    1.17,具體部署參考其它文章。根據當前官方文檔,只支持 1.16 版本,但本文部署的是 1.17,亦無問題。
  • mosquitto
    1.6.8, 到 https://mosquitto.org/download/ 下載。
  • KubeEdge 相關的(雲端、邊緣端)
    v1.1.0, 到 https://github.com/kubeedge/kubeedge/releases 下載。
    注意,github並不是一直都十分穩定,所以下載可能會較耗時。

1.3 方法論

最權威的莫過於 KubeEdge 官方安裝文檔:https://docs.kubeedge.io/en/latest/setup/setup.html 。該文檔從源碼編譯到安裝,均有涉及。然作爲初學者,個人認爲官方的文檔還不夠細緻。網上也有很多安裝部署教程,雖然方法不同,但目的是一樣的。這裏根據筆者經驗簡述如下:

  • 步步爲營
    根據官方文檔安裝,先產生證書,再編譯源碼得到雲端和邊緣端核心程序。再修改配置文件,最後運行。

  • 事預則立
    下載官方編譯好的二進制文件(cloudcore、edgecore),或者自行編譯源碼得到這兩個二進制文件。準備好配置文件(並做適應性修改)。然後再運行。本文采用此方式。先準備好所有的文件,並統一放置到部署工程目錄。

需要注意的是,KubeEdge 官方文檔只涉及 KubeEdge 有關的部署,KubeEdge 還要依賴 docker 和 kubernetes(邊緣端還要依賴 mosquitto)。而這些需要實踐者額外進行,爲減少篇幅,本文不過多涉及,但給出部署文章鏈接。

二、準備

2.1 創建部署文件目錄

創建部署工程目錄

# mkdir ~/kubeedge

創建子目錄:

# cd ~/kubeedge
# mkdir cloud edge certs yamls src

作用:
cloud:雲端相關文件,包括 cloudcore 和配置文件。
edge:邊緣端相關文件,包括 edgecore 和配置文件。
certs:證書文件。
yamls:一些 yamls 文件。
src:源碼目錄(不創建克隆代碼時自動創建)。

2.2 KubeEdge 二進制

** 本文使用的 KubeEdge 是從源碼編譯得到。**

2.2.1 官方編譯好的文件

到 https://github.com/kubeedge/kubeedge/releases 下載官方編譯好的二進制。壓縮包名稱爲 kubeedge-v1.1.0-linux-amd64.tar.gz 。
也可以通過編譯源碼得到,方法參考文後。
另外,除了編譯好的二進制外,還需要下載源碼,地址爲: https://github.com/kubeedge/kubeedge 。因爲部分配置文件只在倉庫源碼中才可找到(當然,也可以直接在 github 倉庫上找到對應的文件下載)。

2.2.2 KubeEdge 源碼編譯

1、Golang 環境搭建
下載好 golang,並解壓:

# mkdir ~/tools
# tar xf go1.12.14.linux-amd64.tar.gz -C ~/tools

在 ~/.bashrc 文件最後添加:

export PATH=$PATH:/home/ubuntu/tools/go/bin
export GOROOT=/home/ubuntu/kubeedge
export GOPATH=/home/ubuntu/kubeedge

執行 source ~/.bashrc 生效。驗證:

# ubuntu@ubuntu:~/kubeedge$ go version
go version go1.12.14 linux/amd64

2、克隆倉庫:

# git clone https://github.com/kubeedge/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge

如果克隆速度慢,可以直接下載zip包,並解壓源碼到 $GOPATH/src/github.com/kubeedge/kubeedge,注意,這個目錄一定是源碼所在目錄。
3、檢測 gcc 版本:

# gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.

如果沒有安裝 gcc,則自行安裝。

編譯雲端:

# cd $GOPATH/src/github.com/kubeedge/kubeedge/
# make all WHAT=cloudcore

生成二進制 cloudcore 文件位於 cloud 目錄。拷貝 cloudcore 和同一目錄的配置文件(conf目錄)到部署工程目錄:

# cp -a cloud/cloudcore ~/kubeedge/cloud/
# cp -a cloud/conf/ ~/kubeedge/cloud/

編譯邊緣端:

cd $GOPATH/src/github.com/kubeedge/kubeedge
make all WHAT=edgecore

生成二進制 edgecore 文件位於 edge 目錄。拷貝二進制及配置文件到部署工程目錄:

# cp -a edge/edgecore ~/kubeedge/edge/
# cp -a edge/conf/ ~/kubeedge/edge/

2.3 生成證書

# $GOPATH/src/github.com/kubeedge/kubeedge/build/tools/certgen.sh genCertAndKey edge

# cp -a /etc/kubeedge/* ~/kubeedge/certs

ca 和 certs 分別位於 /etc/kubeedge/ca 和 /etc/kubeedge/certs 目錄,將其拷貝到部署工程目錄的 certs 目錄。注意,這是在雲端機器執行,所以雲端已經有了證書,拷貝到 certs 目錄,是爲了方便分發到邊緣節點。

2.4 拷貝設備模塊和設備CRD yaml 文件

cp $GOPATH/src/github.com/kubeedge/kubeedge/build/crds/devices/* ~/kubeedge/yamls 

2.5 拷貝 node.js

cp $GOPATH/src/github.com/kubeedge/kubeedge/build/node.json ~/kubeedge/cloud

釋義:node.js 爲節點的配置信息,需要在雲端機器執行,作用是將邊緣端加入集羣(但實際上只是讓 k8s 知道有這個節點,還不是真正意義上的加入)。

2.6 配置雲端節點

打開配置文件 ~/kubeedge/cloud/conf/controller.yaml,修改兩處 kubeconfig 的路徑,注意,這個路徑不能含變量、~ 等,否則會提示:

create kube client failed with error: stat $HOME/.kube/config: no such file or directory  
start unix domain socket server

官方默認爲kubeconfig: "/root/.kube/config",本文改爲 kubeconfig: "/home/ubuntu/.kube/config"

2.7 配置邊緣節點

打開配置文件 ~/kubeedge/edge/conf/edge.yaml。
修改服務IP。將url: wss://0.0.0.0:10000url: 127.0.0.1:10001分別用雲端IP替換,改爲url: wss://192.168.0.102:10000url: 192.168.0.102:10001
將 cgroup-driver 的值改爲 systemd,即cgroup-driver: systemd。因爲雲端的 k8s 也是使用 systemd,爲統一起見,進行修改。
注:發佈的v1.1.0版本,該文件的節點名稱爲fb4ebb70-2783-42b8-b3ef-63e2fd6d242e,需改爲edge-node。master 倉庫中的配置文件已是edge-node

至此,KubeEdge 雲端和邊緣端的二進制文件和配置已準備、修改完畢。未提及的使用官方默認配置。

2.8 mqtt

mqtt 只有邊緣端需要
如果邊緣端爲 ubuntu 系統,直接使用源安裝:

add-apt-repository ppa:mosquitto-dev/mosquitto-ppa // 添加源
apt-get update // 更新
apt-get install mosquitto // 安裝

也可以使用源碼編譯。

2.9 Docker 和 kubernetes

Docker 安裝可參考這裏,kubernetes 安裝可參考這裏。需要指出的是,kubernetes 只部署 master 即可,node 無須部署。但必須安裝網絡插件(此處存疑,如果不安裝,狀態不是 Ready)。

三、部署

前面已經準備好了文件,直接部署就方便很多。注意,需要將證書和邊緣端和文件拷貝到邊緣機器上。方式多種,建議使用 scp 命令。前提是安裝了 SSH 協議。拷貝(也稱爲分發)示例:

ssh 192.168.0.140 "mkdir -p /etc/kubeedge ~/kubeedge/edge"
scp -r ~/kubeedge/certs/* 192.168.0.140:/etc/kubeedge
scp -r ~/kubeedge/edge/* 192.168.0.140:~/kubeedge/edge/

釋義:
將證書拷貝到邊緣端機器的 /etc/kubeedge 目錄。將邊緣端文件拷貝到 ~/kubeedge/edge/ 目錄。
筆者配置了 SSH 允許 root 登陸,並添加了公鑰。所以無須輸入密碼。如無此方式,可手動拷貝。

3.1 雲端

進入部署工程目錄:

cd ~/kubeedge

3.1.1 部署 k8s 集羣

具體部署另見文章,這裏簡述如下:
創建集羣:

# kubeadm init --pod-network-cidr=10.244.0.0/16 \
  --image-repository registry.aliyuncs.com/google_containers

啓動網絡插件 flannel。

3.1.2 添加邊緣端到集羣

# kubectl apply -f cloud/node.json

查看節點狀態:

# kubectl get nodes  
NAME        STATUS     ROLES    AGE   VERSION
edge-node   NotReady   edge     9s    
ubuntu      Ready      master   15h   v1.17.0

從輸出信息看出,邊緣端未就緒。

3.1.3 創建設備模塊和設備CRD

# kubectl apply -f yamls

注意,yamls 目錄有2個 yaml 文件,此處指定目錄,會自動執行目錄所有文件。

3.1.4 運行雲端核心

# cd cloud
# ./cloudcore   // 建議先如此,方便觀察日誌

3.2 邊緣端

進入邊緣端機器的部署工程目錄:

# cd ~/kubeedge/edge

運行邊緣端核心:

# ./edgecore // 建議先如此,方便觀察日誌

運行 mqtt :

# mosquitto -d -p 1883

3.3 驗證

在雲端查看狀態:

# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
edge-node   Ready    edge     23s   v1.15.3-kubeedge-v1.1.0
ubuntu      Ready    master   1h    v1.17.0

雲端和邊緣端均爲 Ready 狀態。

在雲端部署一個應用:

# kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml

之後可以看到已經在邊緣端運行了 nginx 容器。查看 pod:

# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP       NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-77698bff7d-bwc94   1/1     Running   1          1m56s   <none>   edge-node   <none>           <none>

在邊緣端查看容器:

# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                NAMES
882570ac2dec        53f3fd8007f7         "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds                             k8s_nginx_nginx-deployment-77698bff7d-bwc94_default_4b4cdbcd-fcae-45d4-abb2-46ddd5c3c41e_1
183903d7816f        kubeedge/pause:3.1   "/pause"                 7 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp   k8s_POD_nginx-deployment-77698bff7d-bwc94_default_4b4cdbcd-fcae-45d4-abb2-46ddd5c3c41e_6

五、完善

爲了方便查看日誌,本文直接運行了雲端和邊緣端核心。爲了符合生產環境,需要將其添加到系統服務,參考官網文檔即可。要注意的是,核心程序和conf必須在同一目錄。
前文已經整理好了部署腳本和程序,需要更新時,只需替換其中的文件即可。證書生成一次後可重複使用,只要保證雲、邊緣兩者完全一致即可。
理論上應該使用腳本直接部署的,以筆者經驗,初步接觸者,不建議如此,還是一步一步來,但後續爲了提高效率,還是建議使用腳本——因爲部署過程基本上都是重複的工作。

六、後續

在 armv7 上實現邊緣端的部署。
研究多個邊緣端的應用場合。
研究不同系統的邊緣端應用場合(如一爲 x86,一爲 armv7)。
研究 KubeEdge 源碼(爲提高 Golang 水平)。
邊緣端信息中出現Failed to get host IP: failed to get network interface: eth0 err:route ip+net: no such network interface,暫未研究。

七、折騰

官方提供了一個 keadm 的部署工具,使用該工具部署時出現:

gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Error: failed to run 'sh -c cd /etc/kubeedge/ && tar -C /etc/kubeedge/ -xvzf kubeedge-v1.1.0-linux-amd64.tar.gz && cp /etc/kubeedge//kubeedge/edge/edgecore /usr/local/bin/.' because of error : exit status 2

跟蹤源碼,發現有部分路徑不符合條件,鑑於 Golang 才接觸一個月,放棄修改源碼。

在閱讀官方文檔時,遇到了一些理解上的問題(更多是自身原因)。文檔沒有序號,僅靠標題大小區分,所以頭幾次閱讀並不知道哪裏是哪裏。另外,這句話Please make sure edge-node is added in kubernetes.理解上出現偏差,我以爲是要將邊緣節點添加到 k8s 集羣中(即在邊緣端使用 kubeadm join 添加),實際上應該指部署 node.json 文件,將集羣中添加一個節點。

參考

  • 官方源碼倉庫: https://github.com/kubeedge/kubeedge
  • 壓縮包: https://github.com/kubeedge/kubeedge/releases
  • 官方安裝文檔:https://docs.kubeedge.io/en/latest/setup/setup.html
  • 一鍵安裝腳本: https://github.com/du2016/one-step-install-kubeedge
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章