一、KubeEdge介紹
KubeEdge 是一個開源的系統(tǒng),可將本機容器化應(yīng)用編排和管理擴展到邊緣端設(shè)備。 它構(gòu)建在Kubernetes之上,為網(wǎng)絡(luò)和應(yīng)用程序提供核心基礎(chǔ)架構(gòu)支持思恐,并在云端和邊緣端部署應(yīng)用,同步元數(shù)據(jù)立镶。100%兼容K8S API壁袄,可以使用K8S API原語管理邊緣節(jié)點和設(shè)備。KubeEdge 還支持 MQTT 協(xié)議媚媒,允許開發(fā)人員編寫客戶邏輯嗜逻,并在邊緣端啟用設(shè)備通信的資源約束。
1缭召、優(yōu)勢
kubernetes + 容器的組合大大提高了用戶創(chuàng)建部署應(yīng)用的效率栈顷。kubernetes 可以把 n 臺主機整合成一個集群,用戶在 master 節(jié)點上通過編寫一個 yaml 或者 json 格式的配置文件嵌巷,也可以通過命令等請求 Kubernetes API 創(chuàng)建應(yīng)用萄凤,就直接將應(yīng)用部署到集群上的各個節(jié)點上,該配置文件中還包含了用戶想要應(yīng)用程序保持的狀態(tài)搪哪,從而生成用戶想要的環(huán)境靡努。
Kubernetes 作為容器編排的標準,自然會想把它應(yīng)用到邊緣計算上晓折,即通過 kubernetes 在邊緣側(cè)部署應(yīng)用惑朦,但是 kubernetes 在邊緣側(cè)部署應(yīng)用時遇到了一些問題,例如:
- 邊緣側(cè)設(shè)備沒有足夠的資源運行一個完整的 Kubelet
- 一些邊緣側(cè)設(shè)備是 ARM 架構(gòu)的漓概,然而大部分的 Kubernetes 發(fā)行版并不支持 ARM 架構(gòu)
- 邊緣側(cè)網(wǎng)絡(luò)很不穩(wěn)定漾月,甚至可能完全不通,而 kubernetes 需要實時通信胃珍,無法做到離線自治
- 很多邊緣設(shè)備都不支持TCP/IP 協(xié)議
- Kubernetes 客戶端(集群中的各個Node節(jié)點)是通過 list-watch 去監(jiān)聽 Master 節(jié)點的 apiserver 中資源的增刪改查梁肿,list-watch 中的 watch 是調(diào)用資源的 watch API 監(jiān)聽資源變更事件,基于 HTTP 長連接實現(xiàn)觅彰,而維護一個 TCP 長連接開銷較大吩蔑。從而造成可擴展性受限。
為了解決包含但不限于以上 Kubernetes 在物聯(lián)網(wǎng)邊緣場景下的問題填抬,從而產(chǎn)生了KubeEdge 哥纫。對應(yīng)以上問題:
- KubeEdge 保留了 Kubernetes 的管理面,重新開發(fā)了節(jié)點 agent,大幅度優(yōu)化讓邊緣組件資源占用更低很多
- KubeEdge 可以完美支持 ARM 架構(gòu)和 x86 架構(gòu)
- KubeEdge 有離線自治功能蛀骇,可以看 MetaManager 組件的介紹
- KubeEdge 豐富了應(yīng)用和協(xié)議支持,目前已經(jīng)支持和計劃支持的有:MQTT读拆、BlueTooth擅憔、OPC UA、Modbus等檐晕。
- KubeEdge 通過底層優(yōu)化的多路復(fù)用消息通道優(yōu)化了云邊的通信的性能暑诸,可以看 EdgeHub 組件的介紹
2、介紹
2.1 應(yīng)用場景辟灰、特點等
上圖是 華為云IEF 的應(yīng)用場景个榕,Kubeedge 就是源于這個產(chǎn)品,它基于 KubeEdge 和 Kubernetes 生態(tài)構(gòu)建芥喇,將云原生的技術(shù)應(yīng)用到邊緣計算西采。IEF 通過納管邊緣節(jié)點,將云端AI應(yīng)用继控、函數(shù)計算等能力下發(fā)到邊緣節(jié)點(EdgeNode)械馆,將公有云能力延伸到靠近設(shè)備的一端,使得邊緣節(jié)點擁有云端相同能力武通,能夠?qū)崟r處理終端設(shè)備計算需求霹崎。
KubeConShanghai2018——KubeEdge開源首秀
KubeEdge 向左,K3S 向右
KubeEdge實現(xiàn)原理
2.2 架構(gòu)
KubeEdge 由以下組件構(gòu)成:
2.1.1 云邊通信
- CloudHub: CloudHub 是一個 Web Socket 服務(wù)端冶忱,用于大量的 edge 端基于 websocket 或者 quic 協(xié)議連接上來尾菇。負責監(jiān)聽云端的變化, 緩存并發(fā)送消息到 EdgeHub。
- EdgeHub: 是一個 Web Socket 客戶端囚枪,負責將接收到的信息轉(zhuǎn)發(fā)到各edge端的模塊處理派诬;同時將來自個edge端模塊的消息通過隧道發(fā)送到cloud端。提供可靠和高效的云邊信息同步眶拉。
2.1.2 云上部分
- EdgeController: 用于控制 Kubernetes API Server 與邊緣的節(jié)點千埃、應(yīng)用和配置的狀態(tài)同步。
- DeviceController: DeviceController 是一個擴展的 Kubernetes 控制器忆植,管理邊緣設(shè)備放可,確保設(shè)備信息、設(shè)備狀態(tài)的云邊同步朝刊。
2.1.3 邊緣部分
- MetaManager: MetaManager 模塊后端對應(yīng)一個本地的數(shù)據(jù)庫(sqlLite)耀里,所有其他模塊需要與 cloud 端通信的內(nèi)容都會被保存到本地 DB 種一份,當需要查詢數(shù)據(jù)時拾氓,如果本地 DB 中存在該數(shù)據(jù)冯挎,就會從本地獲取,這樣就避免了與 cloud 端之間頻繁的網(wǎng)絡(luò)交互咙鞍;同時房官,在網(wǎng)絡(luò)中斷的情況下趾徽,本地的緩存的數(shù)據(jù)也能夠保障其穩(wěn)定運行(比如你的智能汽車進入到?jīng)]有無線信號的隧道中),在通信恢復(fù)之后翰守,重新同步數(shù)據(jù)孵奶。是邊緣節(jié)點自治能力的關(guān)鍵;
- Edged: 是運行在邊緣節(jié)點的代理蜡峰,用于管理容器化的應(yīng)用程序了袁。算是個重新開發(fā)的輕量化 Kubelet,實現(xiàn) Pod湿颅,Volume载绿,Node 等 Kubernetes 資源對象的生命周期管理
- EventBus: EventBus 是一個與 MQTT 服務(wù)器(mosquitto)交互的 MQTT 客戶端,為其他組件提供訂閱和發(fā)布功能油航。
- ServiceBus: ServiceBus是一個運行在邊緣的HTTP客戶端崭庸,接受來自云上服務(wù)的請求,與運行在邊緣端的HTTP服務(wù)器交互劝堪,提供了云上服務(wù)通過HTTP協(xié)議訪問邊緣端HTTP服務(wù)器的能力冀自。
- DeviceTwin: DeviceTwin 負責存儲設(shè)備狀態(tài)并將設(shè)備狀態(tài)同步到云,它還為應(yīng)用程序提供查詢接口秒啦。
二熬粗、kubEedge部署
1、先決條件
1.1 修改節(jié)點名稱
hostnamectl set-hostname master
1.2 安裝 docker
#關(guān)閉防火墻和selinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#關(guān)閉swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
yum install yum-utils device-mapper-persistent-data lvm2
### Add Docker repository.
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## Install Docker CE.
yum update && yum install docker-ce-18.06.2.ce
## Create /etc/docker directory.
mkdir /etc/docker
# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker
systemctl daemon-reload
systemctl restart docker
1.3 安裝 kubeadm/kubectl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
systemctl enable kubelet && systemctl start kubelet
1.4 初始化 Kubernetes
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version $(kubeadm version -o short) \
--pod-network-cidr=10.244.0.0/16
集群初始化如果遇到問題余境,可以使用
kubeadm reset
命令進行清理然后重新執(zhí)行初始化驻呐。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安裝Pod網(wǎng)絡(luò)插件(CNI)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在完成 Kubernetes master 的初始化后, 我們需要暴露 Kubernetes apiserver 的 http 端口8080用于與 cloudcore/kubectl 交互芳来。請按照以下步驟在 Kubernetes apiserver 中啟用 http 端口含末。這樣可以在邊緣節(jié)點執(zhí)行 kubectl get nodes -s 192.169.0.10:8080
等命令,就像在 master 節(jié)點上一樣即舌。
vi /etc/kubernetes/manifests/kube-apiserver.yaml
# Add the following flags in spec: containers: -command section
- --insecure-port=8080
- --insecure-bind-address=0.0.0.0
1.5 克隆KubeEdge
git clone https://github.com/kubeedge/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge
cd $GOPATH/src/github.com/kubeedge/kubeedge
git checkout -b v1.0.0 v1.0.0
1.6 配置MQTT模式
KubeEdge 的邊緣部分在 deviceTwin 和設(shè)備之間使用 MQTT 進行通信佣盒。KubeEdge 支持3個 MQTT 模式:
- internalMqttMode: 啟用內(nèi)部 mqtt 代理。
- bothMqttMode: 同時啟用內(nèi)部和外部代理顽聂。
- externalMqttMode: 僅啟用外部代理肥惭。
可以使用 kubeedge/edge/conf/edge.yaml 中的 mode 字段去配置期望的模式。
使用 KubeEdge 的 mqtt 內(nèi)部或外部模式紊搪,您都需要確保在邊緣節(jié)點上安裝 mosquitto 或 emqx edge 作為 MQTT Broker蜜葱。
1.7 生成證書
KubeEdge 在云和邊緣之間基于證書進行身份驗證/授權(quán)。證書可以使用 openssl 生成耀石。請按照以下步驟生成證書牵囤。
$GOPATH/src/github.com/kubeedge/kubeedge/build/tools/certgen.sh genCertAndKey edge
證書和密鑰會分別自動生成在/etc/kubeedge/ca
和 /etc/kubeedge/certs
目錄下。
2、運行KubeEdge
2.1 運行Cloud
2.1.1 以二進制文件方式運行
- 構(gòu)建 Cloud
cd $GOPATH/src/github.com/kubeedge/kubeedge/cloud make # or `make cloudcore`
- 修改
$GOPATH/src/github.com/kubeedge/kubeedge/cloud/conf/controller.yaml
配置文件揭鳞,將cloudhub.ca
炕贵、cloudhub.cert
、cloudhub.key
修改為生成的證書路徑
- 移除
$GOPATH/src/github.com/kubeedge/kubeedge/cloud/conf/modules.yaml
中的模塊devicecontroller
汹桦,以免產(chǎn)生不必要的日志 - 創(chuàng)建 device model 和 device CRDs(可以不管)
cd $GOPATH/src/github.com/kubeedge/kubeedge/build/crds/devices kubectl create -f devices_v1alpha1_devicemodel.yaml kubectl create -f devices_v1alpha1_device.yaml
- 運行二進制文件
cd $GOPATH/src/github.com/kubeedge/kubeedge/cloud # run edge controller # `conf/` should be in the same directory as the cloned KubeEdge repository # verify the configurations before running cloud(cloudcore) ./edgecontroller
2.1.2 以 k8s deployment 方式運行
2.2 部署 Edge node
我們提供了一個示例 node.json 來在 Kubernetes 中添加一個節(jié)點鲁驶。
請確保在 Kubernetes 中添加了邊緣節(jié)點 edge-node。運行以下步驟以添加邊緣節(jié)點 edge-node舞骆。
- 編輯
$GOPATH/src/github.com/kubeedge/kubeedge/build/node.json
文件,將metadata.name
修改為edge node name - 部署node
kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/node.json
- 將證書文件傳輸?shù)絜dge node
scp -r /etc/kubeedge/ca root@172.31.0.175:/etc/kubeedge scp -r /etc/kubeedge/certs root@172.31.0.175:/etc/kubeedge
2.3 運行Edge
2.3.1 以二進制文件方式運行
-
構(gòu)建 Edge
cd $GOPATH/src/github.com/kubeedge/kubeedge/edge make # or `make edgecore`
KubeEdge 可以跨平臺編譯径荔,運行在基于ARM的處理器上督禽。
請點擊 Cross Compilation 獲得相關(guān)說明。 -
修改
$GOPATH/src/github.com/kubeedge/kubeedge/edge/conf/edge.yaml
配置文件- 將
edgehub.websocket.certfile
和edgehub.websocket.keyfile
替換為自己的證書路徑 - 將
edgehub.websocket.url
中的0.0.0.0
修改為 master node 的IP - 用 edge node name 替換 yaml文件中的
fb4eb70-2783-42b8-b3f-63e2fd6d242e
- 將
-
運行二進制文件
# run mosquitto mosquitto -d -p 1883 # or run emqx edge # emqx start # run edgecore # `conf/` should be in the same directory as the cloned KubeEdge repository # verify the configurations before running edge(edgecore) ./edge_core # or nohup ./edgecore > edgecore.log 2>&1 &
請使用具有root權(quán)限的用戶運行 edge总处。
2.3.2 以容器方式運行
-
拉出 Edgecore 的 docker 鏡像(本文使用的鏡像是從release-1.0創(chuàng)建的)狈惫。
docker pull kubeedge/edgecore:v1.0.0 docker tag kubeedge/edgecore:v1.0.0 kubeedge/edgecore:latest
-
使用容器部署 kubeedge 的邊緣節(jié)點:
-
cloudhub
中0.0.0.0
替換為運行云組件的 ip -
edgename
為創(chuàng)建的節(jié)點名稱 -
containername
為創(chuàng)建的容器名
cd $GOPATH/src/github.com/kubeedge/kubeedge/build/edge #檢查容器運行環(huán)境 ./run_daemon.sh prepare ./run_daemon.sh only_run_edge mqtt=0.0.0.0:1883 \ cloudhub=192.169.0.10:10000 \ edgename=edge-node3 \ image="kubeedge/edgecore:latest" \ containername=edge-node3
-
2.3.3 以 k8s deployment 方式運行
2.4 檢查狀態(tài)
在 Cloud 和 Edge 被啟動之后,通過如下的命令去檢查邊緣節(jié)點的狀態(tài)鹦马。
kubectl get nodes
請確保您創(chuàng)建的邊緣節(jié)點狀態(tài)是 ready胧谈。
三、部署應(yīng)用
像使用普通k8s一樣部署你的應(yīng)用到edge節(jié)點
示例:
kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml
提示: 目前對于邊緣端荸频,必須在 Pod 配置中使用 hostPort菱肖,不然 Pod 會一直處于 ContainerCreating 狀態(tài)。 hostPort 必須等于 containerPort 而且不能為 0旭从。
然后可以使用下面的命令檢查應(yīng)用程序是否正常運行稳强。
kubectl get pods