邊緣計(jì)算的一體化調(diào)度方案探索
Part 01 邊緣計(jì)算方案的概念界定
圖1
如上圖1所示,在《AI邊緣計(jì)算技術(shù)白皮書》[5]中提出的邊緣計(jì)算體系定義中,以云數(shù)據(jù)中心為核心,將邊緣計(jì)算劃分為三個(gè)層級:
- 云邊緣:部署在云服務(wù)的CDN節(jié)點(diǎn)或者是各個(gè)地市的分布式數(shù)據(jù)中心當(dāng)中的云計(jì)算資源,是與現(xiàn)有云計(jì)算業(yè)務(wù)最為接近的一種邊緣計(jì)算形態(tài)??梢蕴峁┖瘮?shù)計(jì)算、AI智能服務(wù)、云渲染等邊緣云服務(wù)。
- 移動邊緣:伴隨著5G通信的發(fā)展而出現(xiàn)的新興邊緣計(jì)算形態(tài),由于5G網(wǎng)絡(luò)具備的大帶寬、低時(shí)延特點(diǎn),可以通過5G基站+終端實(shí)現(xiàn)最佳的邊緣位置布放,但要實(shí)現(xiàn)云計(jì)算能力在5G基站的布放,需要針對基站做較大的改造,而且由于基站空間和配電的限制,無法布放大規(guī)模的計(jì)算能力。
- 物邊緣:終端自身具備計(jì)算能力,如智能手機(jī)、VR頭顯設(shè)備、智能攝像頭等,由于在終端本地處理計(jì)算請求,雖然響應(yīng)時(shí)延低和穩(wěn)定性能達(dá)到最優(yōu),但受限于功耗、物理資源等因素,一般僅完成簡單計(jì)算任務(wù)。
綜合比較以上三個(gè)邊緣計(jì)算不同層級的特性,可以看出物邊緣就是利用了用戶終端的算力來處理簡單的事務(wù),無法擴(kuò)展算力以滿足云渲染、大數(shù)據(jù)分析、AI智能服務(wù)等重算力場景的需求;而移動邊緣也有空間和配電的先天限制,無法擴(kuò)展太多的算力來給用戶終端提供重算力的云計(jì)算服務(wù)。云邊緣既具備云計(jì)算中心的重算力儲備特點(diǎn),又貼近用戶終端進(jìn)行部署,應(yīng)該作為拓展用戶終端算力的首選解決方案。
Part 02 邊緣計(jì)算一體化調(diào)度的主要技術(shù)路線
在單一云中心節(jié)點(diǎn)的基礎(chǔ)上增加了多個(gè)邊緣云節(jié)點(diǎn)后(如下圖2),應(yīng)用服務(wù)的運(yùn)維管理復(fù)雜度會成倍增加,而且多個(gè)邊緣節(jié)點(diǎn)之間的負(fù)載均衡、請求轉(zhuǎn)發(fā)也更為復(fù)雜。為了解決以上問題,Kubernetes、Openstack、微軟、華為等國內(nèi)外開源社區(qū)和軟件廠商都紛紛推出了自己的邊緣云架構(gòu)解決方案。
圖2
綜合比較了各大廠商提出的云邊緣解決方案,可以歸納兩種不同的技術(shù)路線:
基于云原生的方案:基于目前已廣泛應(yīng)用的云原生容器化管理架構(gòu)如Kubernetes和K3s,在其基礎(chǔ)上拓展出跨公網(wǎng)的容器化應(yīng)用下發(fā)、統(tǒng)一監(jiān)控、負(fù)載均衡、接口轉(zhuǎn)發(fā)等適配邊緣云架構(gòu)的功能,代表性的方案為KubeEdge[1]、Kubernetes Federation[2]。
基于云計(jì)算IAAS的方案:依托Openstack等云計(jì)算管理平臺,在云計(jì)算的基礎(chǔ)設(shè)施層面拓展邊緣云的資源管理、應(yīng)用打包和下發(fā)、負(fù)載均衡等功能,其功能范圍覆蓋了物理硬件管理-虛擬化-容器化的全流程,代表性的工具為StarlingX[3]、EdgeGallery[4]。
Part 03 Nacos的服務(wù)發(fā)現(xiàn)
3.1 KubeEdge
KubeEdge是基于kubernetes之上將容器化應(yīng)用的編排能力拓展到邊緣主機(jī)或邊緣設(shè)備,在云端和邊緣端提供網(wǎng)絡(luò)通信,應(yīng)用部署、元數(shù)據(jù)同步等功能。最早是由華為開源并捐獻(xiàn)給Kubernetes社區(qū)的。
KubeEdge的優(yōu)勢包括:
- 便捷部署:開發(fā)者可以開發(fā)http或mqtt協(xié)議的應(yīng)用,運(yùn)行在云端和邊緣端。
- kubernetes原生支持:可以通過kubernetes管理和監(jiān)控邊緣設(shè)備和邊緣節(jié)點(diǎn),原有的各種應(yīng)用編排可以無縫移植到KubeEdge中。
KubeEdge作為一個(gè)云-邊一體化調(diào)度的開源解決方案,也將自己的核心模塊分為了云側(cè)和邊緣側(cè)兩類,分別部署在中心云節(jié)點(diǎn)和邊緣云節(jié)點(diǎn),其核心的模塊如下表1所示。
表1
從以上表格不難看出,KubeEdge新增的模塊是比較多的,而且這些模塊都必須通過命令行的方式到集群的宿主機(jī)上執(zhí)行很多的命令行才能安裝,其安裝和配置的復(fù)雜度相對于純粹的云原生應(yīng)用還是要高出許多。
3.2 Kubernetes Federation
Kubernetes Federation通常又被稱為K8s聯(lián)邦,Kubernetes在1.3版本之后,增加了“集群聯(lián)邦”Federation的功能。這個(gè)功能使企業(yè)能夠快速有效的、低成本的跨區(qū)跨域、甚至在不同的云平臺上運(yùn)行集群,還可以按照地理位置創(chuàng)建一個(gè)復(fù)制機(jī)制,將多個(gè)kubernetes集群進(jìn)行復(fù)制,即使遇到某個(gè)區(qū)域連接中斷或某個(gè)數(shù)據(jù)中心故障,也會保持最關(guān)鍵的服務(wù)運(yùn)行。
該方案的主要優(yōu)點(diǎn)包括:
- 基于原生kubernetes,各個(gè)擴(kuò)展的基礎(chǔ)模塊都可以復(fù)用集群原有的API,且能在社區(qū)獲得較好的技術(shù)支持。
- 真正的與基礎(chǔ)設(shè)施無關(guān),相關(guān)擴(kuò)展工具的安裝都是通過容器化的方式實(shí)現(xiàn)。
- 相較于之前提到的KubeEdge,Kubernetes Federation主要是擴(kuò)展了Type Configuration、Schedule、MutiClusterDNS三個(gè)組件,如下表2所示。
表2
Kubernetes Federation跨公網(wǎng)的多級群聯(lián)邦調(diào)度機(jī)制,其實(shí)就是一個(gè)依托于MutiClusterDNS多級群服務(wù)發(fā)現(xiàn)的一種分布式Kubernetes集群調(diào)度體系如下圖3所示:
圖3
3.3 StarlingX
StarlingX準(zhǔn)確的說是一個(gè)軟件棧,他包含了打包、編譯、安裝配置、Openstack、WindRiver的MTCE平臺,以及WindRiver針對電信云開發(fā)的VIM等等。StarlinX的部署應(yīng)用需要從物理機(jī)虛擬化開始逐一安裝相關(guān)工具,因此其邊緣節(jié)點(diǎn)資源調(diào)度的能力很強(qiáng)。但由于跟底層硬件和虛擬化等軟件耦合較為驗(yàn)證,業(yè)內(nèi)也主要是九州、風(fēng)河等云服務(wù)廠商在使用,普通的應(yīng)用系統(tǒng)開發(fā)廠商要應(yīng)用該軟件棧的開發(fā)和改造成本會很大。
3.4 EdgeGallery
同樣是提供了從虛擬化到容器化的一整套軟件棧以支持邊緣計(jì)算的一體化調(diào)度,且將APP開發(fā)、測試、認(rèn)證以及上線的技術(shù)流程全打通,和StartlingX不同的是,該開源項(xiàng)目的各個(gè)模塊可以拆分開來按需進(jìn)行部署,由于該開源項(xiàng)目出現(xiàn)時(shí)間較晚,且發(fā)行的版本很少,目前還未見到有廠商應(yīng)用的示例。
綜合對比目前主要的一些邊緣計(jì)算解決方案,對于普通的應(yīng)用服務(wù)廠商來說基于云原生路線的KubeEdge和Kubernetes Federation相較于基于云計(jì)算的StartlingX和EdgeGallery具有更高的易用性和更低的實(shí)施成本,而對于已經(jīng)通過Kubernetes進(jìn)行了容器化部署的廠商,選擇Kubernetes Federation平臺切換成本最?。ㄈ缦卤?)。
圖片
Part 04 Kubernetes Federation的使用
4.1 環(huán)境初始化
1)下載kubefedctl命令行并下載
https://github.com/kubernetes-sigs/kubefed/releases/tag/v0.3.1
2)將kubefed-0.3.1.tgz、kubefedctl-0.3.1-linux-amd64.tgz兩個(gè)文件上傳到主機(jī)群的master節(jié)點(diǎn),并執(zhí)行以下命令:
tar -xvf kubefedctl-0.3.1-linux-amd64.tgz
mv kubefedctl /usr/local/bin/
tar -xvf kubefed-0.3.1.tgz
kubectl create namespace kube-federation-system
helm install --name kubefed --namespace kube
federation-system kubefed
3)查看并確認(rèn)kubefed的po全部都啟動成功了
圖片
4.2 將邊緣節(jié)點(diǎn)的集群添加到聯(lián)邦中
1)查看各個(gè)邊緣集群的config信息
cat $HOME/.kube/config
2)將各個(gè)集群的信息添加到中心集群的$HOME/.kube/config配置文件當(dāng)中
vi $HOME/.kube/config
3)通過kubefedctl命令行工具將自己群加入聯(lián)邦
kubefedctl join clusterName --cluster-context clusterName --host-cluster-context local --v=2
kubectl -n kube-federation-system get kubefedclusters
如果想要退出聯(lián)邦,可以執(zhí)行命令:
kubefedctl unjoin zj --host-cluster-cnotallow=host
4.3 配置聯(lián)邦化的namespace和yaml配置文件
1)創(chuàng)建聯(lián)邦化的namespace
kubectl create namespace vrfederation
vi vrfederation.yaml
添加以下內(nèi)容:
apiVersion: types.kubefed.io/v1beta1
kind: FederatedNamespace
metadata:
name: vrfederation
namespace: vrfederation
spec:
placement:
clusters:
- name: local
- name: cddev
由于采用應(yīng)用商店部署只能看到登錄賬號所屬項(xiàng)目的命名空間,所以還必須強(qiáng)制指定各個(gè)集群中的projectid:
overrides:
- clusterName: cddev
clusterOverrides:
- path: "/metadata/labels"
op: "add"
value:
field.cattle.io/projectId: p-64g94
- path: "/metadata/annotations"
op: "add"
value:
field.cattle.io/projectId: local:p-64g94
- clusterName: local
clusterOverrides:
- path: "/metadata/labels"
op: "add"
value:
field.cattle.io/projectId: p-6rt82
- path: "/metadata/annotations"
op: "add"
value:
field.cattle.io/projectId: local:p-6rt82
2)創(chuàng)建聯(lián)邦化的deployment
vi test.yaml
添加以下內(nèi)容:
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: test-deployment
namespace: vrfederation
spec:
template:
metadata:
labels:
app: nginx-test
spec:
replicas: 1
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- image: nginx:1.17
name: nginx-test
placement:
clusters:
- name: local
- name: cddev
overrides:
- clusterName: cddev
clusterOverrides:
- path: "/spec/replicas"
value: 3
- path: "/spec/template/spec/containers/0/image"
value: "nginx:1.14.0-alpine"
- path: "/metadata/annotations"
op: "add"
value:
foo: bar
- path: "/metadata/annotations/foo"
op: "remove"
3)查看各個(gè)集群當(dāng)中容器部署的情況
ubectl --context cddev -n vrfederation get deployments
4.4 跨集群的service和ingress配置
1)創(chuàng)建聯(lián)邦化的service
apiVersion: types.kubefed.io/v1beta1
kind: FederatedService
metadata:
labels:
app: federated-svc
name: federated-svc
namespace: vrfederation
spec:
template:
spec:
type: LoadBalancer
ports:
- name: http
port: 80
selector:
app: nginx
placement:
clusters:
- name: cddev
- name: local
kubectl --context cddev -n vrfederation get svc
2)創(chuàng)建聯(lián)邦化的ingress
apiVersion: types.kubefed.io/v1beta1
kind: FederatedIngress
metadata:
name: test-ingress
namespace: vrfederation
spec:
template:
spec:
backend:
serviceName: federated-svc
servicePort: 80
placement:
cluster:
- name: local
- name: cddev
---
apiVersion: multiclusterdns.kubefed.io/v1alpha1
kind: IngressDNSRecord
metadata:
name: test-ingress
namespace: vrfederation
spec:
hosts:
- www.vr.wellmaxwang.top
recordTTL: 600
完成以上配置,就可以在內(nèi)網(wǎng)環(huán)境配置出可供驗(yàn)證的Kubernetes聯(lián)邦集群,對于跨公網(wǎng)的聯(lián)邦則需要進(jìn)一步配置公網(wǎng)的DNS和Externel DNS服務(wù)來進(jìn)行跨公網(wǎng)的服務(wù)發(fā)現(xiàn)。
Part 05 總結(jié)
從筆者所在的分布式直播項(xiàng)目實(shí)踐情況來看,Kubernetes Federation作為Kubernetes社區(qū)主推的云原生邊緣計(jì)算一體化調(diào)度解決方案,對于普通的應(yīng)用服務(wù)廠商將單中心的應(yīng)用改造為云邊協(xié)同的應(yīng)用,是一個(gè)高效且開發(fā)成本最低的一種方案。但對于云服務(wù)提供商來說,StarlingX也許能更好地分配不同節(jié)點(diǎn)的云計(jì)算算力,所以具體選擇哪一種邊緣計(jì)算的一體化調(diào)度方案還是需要根據(jù)自己項(xiàng)目的實(shí)際情況而定。