通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
上一篇我們講到了dapr提供的bindings,通過綁定可以讓我們的程序輕裝上陣,在極端情況下幾乎不需要集成任何sdk,僅需要通過httpclient+text.json即可完成對外部組件的調用,這樣只需要對外暴露一個輕量級的http服務器提供restapi即可作為一個云函數提供對外服務。上一篇我們同時也提到了在serverless框架下的函數還可以按需進行自動擴容縮容的,在極端情況下甚至可以將實例縮容至0,理想情況下serverless在無人訪問時不占用系統除磁盤外的任何資源,當有訪問時通過自動化擴容快速啟動應用實例提供服務,當請求增多/減少時又相應的進行自動化擴容/縮容,當請求完全沒有時再次縮容到0。那今天我們就看看我們如何通過dapr+prometheus+keda來實現一套自動化擴容縮容吧。
目錄:
一、通過Dapr實現一個簡單的基于.net的微服務電商系統
二、通過Dapr實現一個簡單的基于.net的微服務電商系統(二)——通訊框架講解
三、通過Dapr實現一個簡單的基于.net的微服務電商系統(三)——一步一步教你如何擼Dapr
四、通過Dapr實現一個簡單的基于.net的微服務電商系統(四)——一步一步教你如何擼Dapr之訂閱發布
通過Dapr實現一個簡單的基于.net的微服務電商系統(五)——一步一步教你如何擼Dapr之狀態管理
通過Dapr實現一個簡單的基于.net的微服務電商系統(六)——一步一步教你如何擼Dapr之Actor服務
通過Dapr實現一個簡單的基于.net的微服務電商系統(七)——一步一步教你如何擼Dapr之服務限流
通過Dapr實現一個簡單的基于.net的微服務電商系統(八)——一步一步教你如何擼Dapr之鏈路追蹤
通過Dapr實現一個簡單的基于.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權
通過Dapr實現一個簡單的基于.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權-百度版
通過Dapr實現一個簡單的基于.net的微服務電商系統(十)——一步一步教你如何擼Dapr之綁定
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample
二、通訊框架地址:https://github.com/sd797994/Oxygen-Dapr
照例得先嘮嘮這個擴容縮容機制到底是如何實現的熟悉k8sHPA機制的同學請跳過,k8s的HPA(Horizontal Pod Autoscaler),我們直接搬官方文檔定義吧:“Pod 水平自動擴縮(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自動擴縮 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數量。除了 CPU 利用率,也可以基于其他應程序提供的自定義度量指標?來執行自動擴縮。Pod 自動擴縮不適用于無法擴縮的對象,比如 DaemonSet。”,單靠HPA提供的CPU/MEM利用率來做自動擴縮容很難用于真實的生產環境,同時HPA只能作用于1->N,N->1的情況。而serverless需要涵蓋實例從0->N,N->0的情況,所以單靠HPA是無法滿足我們的訴求的。而這個時候就需要一款基于HPA擴展的k8s組件來為我們提供相應的服務。而Dapr選擇微軟自家的KEDA(已經開源并捐獻給了CNCF基金會)。注意KEDA并不是為了覆蓋HPA的功能,而是作為一個輕量化的組件集成在k8s里為hpa提供擴展服務。
除了keda,我們還需要一些指標,因為keda需要某些指標來作為其對pod的擴容和縮容的憑據,這部分指標目前恰好可以用dapr已經集成好的prometheus來提供。之前鏈路追蹤其實就是dapr+zipkin,而指標同樣也可以通過dapr+prometheus來完成。關于指標這部分在dapr的官方文檔里monitoring有詳細描述,使用起來和之前我們介紹的鏈路追蹤無太大差異,所以就不單開文章講解了,有訴求的同學可以直接訪問文檔來自行搭建。
好了,接下來我們開始搭建,不過照例還是先上流程圖。注意此圖僅僅是簡易示例,真實的調用鏈會涉及更多的細節,此處不展開:
?
?
首先我們需要將prometheus安裝進來,通過Dapr提供的指南,我們可以使用helm進行安裝。
kubectl create namespace dapr-monitoring helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install dapr-prom prometheus-community/prometheus -n dapr-monitoringtips:由于一個詭異的bug導致在windows平臺下的docker環境內無法啟動node-exporter,如果你不幸遇到了,可以使用這行代碼解決,具體的issuse在這里
kubectl patch ds dapr-prom-prometheus-node-exporter --type "json" -p '[{"op": "remove", "path" : "/spec/template/spec/containers/0/volumeMounts/2/mountPropagation"}]' -n dapr-monitoring檢查你的dapr-monitoring,確保所有pod都能啟動,接著我們需要公開prometheus-server用于訪問頁面。通過kubectl edit svc dapr-prom-prometheus-server -n dapr-monitoring 打開svc將spec.service.type從ClusterIP改為NodePort,如果你需要固定端口,再增加spec.ports.nodePort即可。保存文檔后我們再查詢kubectl get svc dapr-prom-prometheus-server -n dapr-monitoring 看看端口號是多少,然后訪問loalhost:port,如果出現以下頁面,則說明prometheus部署成功:
由于dapr會自動將指標寫入prometheus,當我們操作一下我們的電商demo之后,我們就可以從prometheus查詢到對應指標的情況了,以http請求數的情況為例:
?
prometheus先放一邊,接著我們安裝KEDA,依然參考dapr的文檔,不過接下來我們和官方文檔有一點出入,官方文檔演示的是通過component讓keda監聽kafka,通過流量指標來確定擴容/縮容訂閱器的。我們這里的演示是讓keda監聽prometheus的特定指標dapr_http_server_request_count來實現擴容/縮的。原理都一樣,即借助keda來實現。接下來依然是通過helm安裝keda。
helm repo add kedacore https://kedacore.github.io/charts helm repo update kubectl create namespace keda helm install keda kedacore/keda --namespace keda同樣安裝完畢后,觀察我們的keda,確保兩個pod都已經正確running之后,我們嘗試對我們的網關配置keda的ScaledObject來實現自動擴容/縮容:首先還是編寫一個ScaledObject,這是keda安裝后會自動在k8s里申明的CRD資源符
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata:name: prometheus-scaledobjectnamespace: dapreshop spec:scaleTargetRef:name: apigatewaypollingInterval: 15 #指定keda的采集頻次,單位秒minReplicaCount: 1 #指定默認規格maxReplicaCount: 10 #最大擴容規格triggers:- type: prometheusmetadata:serverAddress: http://dapr-prom-prometheus-server.dapr-monitoring.svc.cluster.local? #prometheus服務的svc用于keda采集指標metricName: dapr_http_server_request_count #具體的指標名query: sum(rate(dapr_http_server_request_count{app_id="apigateway"}[2m])) #這是prometheus特有的PromQL,這段query的意思是我們需要采集以2分鐘為一個維度對網關的請求平均訪問速率,這里不展開,大家可以搜PromQL中文文檔了解更多threshold: '3' #閾值當我們apply這個yaml之后,可以通過kubectl get so,hpa觀察我們的scaleobject和hpa的資源是否創建成功,一切OK后,我們通過postman的runner請求網關,看看hpa是否可以工作吧:
?
? 可以看到請求過來后,我們的指標已經被正確的收集到了,接著我們查詢一下網關的情況,可以看到已經被正確的擴容了:
當請求歸零后,過一段時間再次訪問會發現實例被縮容到了默認規格。這就是今天對dapr+keda實現動態擴容/縮容的介紹。當然要做到真正的云函數那樣的從0實例快速冷啟動還需要一個過程,冷啟動在傳統云商提供的云函數環境里是通過預熱池實現的,而本地化搭建要實現0實例冷啟動需要AOT的支持,至少就目前而言.netcore尚未支持AOT編譯成本地代碼的情況下還很遙遠。但是不能說沒有實現serverless冷啟動做這個就沒有意義,當我們在特定場景比如做活動需要動態擴容/縮容時,完全可以通過keda去實現。當請求稀少的夜間我們完全就可以將實例縮容到1份繼續運行,或者類似于dapr官方文檔示例那樣的訂閱器平時不需要運行時完全可以縮容到0個實例,等待消息來觸發擴容運行消費。
相關文章:
Dapr能否引領云原生中間件的未來?
云原生 | 阿里巴巴的Dapr實踐與探索
Dapr | 云原生的抽象與實現
Dapr 可視化指南
Dapr 知多少 | 分布式應用運行時
Dapr 正式發布 1.0
Dapr 交通流量控制示例
Dapr是如何簡化微服務的開發和部署
微軟開源微服務運行時Dapr,賦能云原生應用開發
YARP實現Dapr服務調用的反向代理
Dapr微服務應用開發系列0:概述
Dapr微服務應用開發系列1:環境配置
Dapr微服務應用開發系列2:Hello World與SDK初接觸
Dapr微服務應用開發系列3:服務調用構件塊
Dapr微服務應用開發系列4:狀態管理構件塊
Dapr微服務應用開發系列5:發布訂閱構建塊
Windows環境下Dapr入門
云原生 | .NET 5 with Dapr 初體驗
通過Dapr實現一個簡單的基于.net的微服務電商系統
通過Dapr實現一個簡單的基于.net的微服務電商系統(二)——通訊框架講解
通過Dapr實現一個簡單的基于.net的微服務電商系統(三)——一步一步教你如何擼Dapr
通過Dapr實現一個簡單的基于.net的微服務電商系統(四)——一步一步教你如何擼Dapr之訂閱發布
通過Dapr實現一個簡單的基于.net的微服務電商系統(五)——一步一步教你如何擼Dapr之狀態管理
通過Dapr實現一個簡單的基于.net的微服務電商系統(六)——一步一步教你如何擼Dapr之Actor服務
通過Dapr實現一個簡單的基于.net的微服務電商系統(七)——一步一步教你如何擼Dapr之服務限流
通過Dapr實現一個簡單的基于.net的微服務電商系統(八)——一步一步教你如何擼Dapr之鏈路追蹤
通過Dapr實現一個簡單的基于.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權
通過Dapr實現一個簡單的基于.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權-百度版
通過Dapr實現一個簡單的基于.net的微服務電商系統(十)——一步一步教你如何擼Dapr之綁定
WebAssembly + Dapr = 下一代云原生運行時?
dapr 應用開發 | 環境配置
乘風破浪,.Net Core遇見Dapr,為云原生而生的分布式應用運行時
Dapr案例之高德 Serverless 平臺建設及實踐
總結
以上是生活随笔為你收集整理的通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于虹软人脸识别,实现RTMP直播推流追
- 下一篇: 云原生ASP.NET Core程序的可监