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