KubeEdge詳解

一、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端。提供可靠和高效的云邊信息同步眶拉。

如何配置通信協(xié)議

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 模式:

  1. internalMqttMode: 啟用內(nèi)部 mqtt 代理。
  2. bothMqttMode: 同時啟用內(nèi)部和外部代理顽聂。
  3. externalMqttMode: 僅啟用外部代理肥惭。

可以使用 kubeedge/edge/conf/edge.yaml 中的 mode 字段去配置期望的模式。

使用 KubeEdge 的 mqtt 內(nèi)部或外部模式紊搪,您都需要確保在邊緣節(jié)點上安裝 mosquittoemqx 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.certcloudhub.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.certfileedgehub.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 以容器方式運行
  • 拉出 Edgecoredocker 鏡像(本文使用的鏡像是從release-1.0創(chuàng)建的)狈惫。

    docker pull kubeedge/edgecore:v1.0.0
    docker tag kubeedge/edgecore:v1.0.0 kubeedge/edgecore:latest
    
  • 使用容器部署 kubeedge 的邊緣節(jié)點:

    • cloudhub0.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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市和悦,隨后出現(xiàn)的幾起案子退疫,更是在濱河造成了極大的恐慌,老刑警劉巖鸽素,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒繁,死亡現(xiàn)場離奇詭異,居然都是意外死亡馍忽,警方通過查閱死者的電腦和手機棒坏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舵匾,“玉大人俊抵,你說我怎么就攤上這事∽荩” “怎么了徽诲?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我谎替,道長偷溺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任钱贯,我火速辦了婚禮挫掏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秩命。我一直安慰自己尉共,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布弃锐。 她就那樣靜靜地躺著袄友,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霹菊。 梳的紋絲不亂的頭發(fā)上剧蚣,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音旋廷,去河邊找鬼鸠按。 笑死,一個胖子當著我的面吹牛饶碘,可吹牛的內(nèi)容都是我干的目尖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼熊镣,長吁一口氣:“原來是場噩夢啊……” “哼卑雁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绪囱,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤测蹲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鬼吵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扣甲,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年齿椅,在試婚紗的時候發(fā)現(xiàn)自己被綠了琉挖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡涣脚,死狀恐怖示辈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遣蚀,我是刑警寧澤矾麻,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布纱耻,位于F島的核電站,受9級特大地震影響险耀,放射性物質(zhì)發(fā)生泄漏弄喘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一甩牺、第九天 我趴在偏房一處隱蔽的房頂上張望蘑志。 院中可真熱鬧,春花似錦贬派、人聲如沸急但。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羊始。三九已至,卻和暖如春查描,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柏卤。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工冬三, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缘缚。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓勾笆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桥滨。 傳聞我的和親對象是個殘疾皇子窝爪,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359