主頁 >  其他 > 應用現代化中的彈性伸縮

應用現代化中的彈性伸縮

2023-05-19 09:05:01 其他

作者:馬偉,青云科技容器顧問,云原生愛好者,目前專注于云原生技術,云原生領域技術堆疊涉及 Kubernetes、KubeSphere、KubeKey 等,

2019 年,我在給很多企業部署虛擬化,介紹虛擬網路和虛擬存盤,

2023 年,這些企業都已經上了云原生了,對于高流量的 Web 應用程式,實時資料分析,大規模資料處理、移動應用程式等業務,容器比虛擬機更適合,因為它輕量級,快速回應,可輕松移植,并具有很強的彈性伸縮能力,

為什么需要彈性伸縮呢?

  • 峰值負載應對:促銷活動、節假日購物季或突發事件根據需求快速擴展資源,保證應用可用性和性能,
  • 提高資源利用率:根據實際資源負載動態調整資源規模,避免基礎設施資源浪費,降低 TCO,
  • 應對故障和容錯:多實體部署和快速替換,提高業務連續性和可用性,
  • 跟隨需求變化:匹配前端的業務需求及壓力,快速調整規模,提高事件應對能力,滿足需求和期望,

Horizontal Pod Autoscaling

Kubernetes 自身提供一種彈性伸縮的機制,包括 Vertical Pod Autoscaler (VPA)和 Horizontal Pod Autoscaler (HPA),HPA 根據 CPU 、記憶體利用率增加或減少副本控制器的 pod 數量,它是一個擴縮資源規模的功能特性,

HPA 依賴 Metrics-Server 捕獲 CPU、記憶體資料來提供資源使用測量資料,也可以根據自定義指標(如 Prometheus)進行擴縮,

由上圖看出,HPA 持續監控 Metrics-Server 的指標情況,然后計算所需的副本數動態調整資源副本,實作設定目標資源值的水平伸縮,

但也有一定局限性:

  • 無外部指標支持,如不同的事件源,不同的中間件/應用程式等,業務端的應用程式變化及依賴是多樣的,不只是基于 CPU 和記憶體擴展,
  • 無法 1->0,應用程式總有 0 負載的時候,此時不能不運行作業負載嗎?

所以就有了Kubernetes-based Event-Driven Autoscaling(KEDA)!

KEDA

KEDA 基于事件驅動進行自動伸縮,什么是事件驅動?我理解是對系統上的各種事件做出反應并采取相應行動(伸縮),那么 KEDA 就是一個 HPA+多種觸發器,只要觸發器收到某個事件被觸發,KEDA 就可以使用 HPA 進行自動伸縮了,并且,KEDA 可以 1-0,0-1!

架構

KEDA 自身有幾個組件:

  • Agent: KEDA 激活和停止 Kubernetes 作業負載(keda-operator 主要功能)
  • Metrics: KEDA 作為一個 Kubernetes 指標服務器,向 Horizontal Pod Autoscaler 提供豐富的事件資料,從源頭上消費事件,(keda-operator-metrics-apiserver 主要作用),
  • Admission Webhooks: 自動驗證資源變化,以防止錯誤配置,
  • Event sources: KEDA 更改 pod 數量的外部事件/觸發源,如 Prometheus、Kafka,
  • Scalers: 監視事件源,獲取指標并根據事件觸發伸縮,
  • Metrics adapter:從 Scalers 獲取指標并發送給 HPA,
  • Controller: 根據 Adapter 提供的指標進行操作,調諧到 ScaledObject 中指定的資源狀態,Scaler 根據 ScaledObject 中設定的事件源持續監視事件,發生任何觸發事件時將指標傳遞給 Metrics Adapter,Metrics Adapter 調整指標并提供給 Controller 組件,Controller 根據 ScaledObject 中設定的縮放規則擴大或縮小 Deployment,

總的來說,KEDA 設定一個 ScaledObject,定義一個事件觸發器,可以是來自訊息佇列的訊息、主題訂閱的訊息、存盤佇列的訊息、事件網關的事件或自定義的觸發器,基于這些事件來自動調整應用程式的副本數量或處理程式的資源配置,以根據實際負載情況實作彈性伸縮,

CRD

  • ScaledObjects:代表事件源(如 Rabbit MQ)和 Kubernetes, Deployment、StatefulSet 或任何定義 / 規模子資源的自定義資源之間的所需映射,
  • ScaledJobs:事件源和 Kubernetes Jobs 之間的映射,根據事件觸發調整 Job 規模,
  • TriggerAuthentications:觸發器的認證引數,
  • ClusterTriggerAuthentications:集群維度認證,

部署 KEDA

helm repo add kedacore https://kedacore.github.io/charts
helm repo update
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda

kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.10.1/keda-2.10.1.yaml

root@node-1:/# kubectl get all -n keda
NAME                                          READY   STATUS    RESTARTS   AGE
pod/keda-metrics-apiserver-7d89dbcb54-v22nl   1/1     Running   0          44s
pod/keda-operator-5bb9b49d7c-kh6wt            0/1     Running   0          44s

NAME                             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/keda-metrics-apiserver   ClusterIP   10.233.44.19   <none>        443/TCP,80/TCP   45s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/keda-metrics-apiserver   1/1     1            1           45s
deployment.apps/keda-operator            0/1     1            0           45s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/keda-metrics-apiserver-7d89dbcb54   1         1         1       45s
replicaset.apps/keda-operator-5bb9b49d7c            1         1         0       45s
root@node-1:/# kubectl get all -n keda
NAME                                          READY   STATUS    RESTARTS   AGE
pod/keda-metrics-apiserver-7d89dbcb54-v22nl   1/1     Running   0          4m8s
pod/keda-operator-5bb9b49d7c-kh6wt            1/1     Running   0          4m8s

NAME                             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/keda-metrics-apiserver   ClusterIP   10.233.44.19   <none>        443/TCP,80/TCP   4m9s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/keda-metrics-apiserver   1/1     1            1           4m9s
deployment.apps/keda-operator            1/1     1            1           4m9s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/keda-metrics-apiserver-7d89dbcb54   1         1         1       4m9s
replicaset.apps/keda-operator-5bb9b49d7c
# kubectl get crd | grep keda
clustertriggerauthentications.keda.sh                     2023-05-11T09:26:06Z
scaledjobs.keda.sh                                        2023-05-11T09:26:07Z
scaledobjects.keda.sh                                     2023-05-11T09:26:07Z
triggerauthentications.keda.sh                            2023-05-11T09:26:07Z

KubeSphere 部署 KEDA

kubectl edit cc -n kubesphere-system (kubesphere 3.4+)
spec:
···
  autoscaling:
    enabled: true
···

擴展作業負載 CRD

ScaledObject 資源定義,詳情引數請看 :https://keda.sh/docs/2.10/concepts/scaling-deployments/,

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: {scaled-object-name}
spec:
  scaleTargetRef:
    apiVersion:    {api-version-of-target-resource}  # Optional. Default: apps/v1
    kind:          {kind-of-target-resource}         # Optional. Default: Deployment
    name:          {name-of-target-resource}         # Mandatory. Must be in the same namespace as the ScaledObject
    envSourceContainerName: {container-name}         # Optional. Default: .spec.template.spec.containers[0]
  pollingInterval:  30                               # Optional. Default: 30 seconds
  cooldownPeriod:   300                              # Optional. Default: 300 seconds
  idleReplicaCount: 0                                # Optional. Default: ignored, must be less than minReplicaCount
  minReplicaCount:  1                                # Optional. Default: 0
  maxReplicaCount:  100                              # Optional. Default: 100
  fallback:                                          # Optional. Section to specify fallback options
    failureThreshold: 3                              # Mandatory if fallback section is included
    replicas: 6                                      # Mandatory if fallback section is included
  advanced:                                          # Optional. Section to specify advanced options
    restoreToOriginalReplicaCount: true/false        # Optional. Default: false
    horizontalPodAutoscalerConfig:                   # Optional. Section to specify HPA related options
      name: {name-of-hpa-resource}                   # Optional. Default: keda-hpa-{scaled-object-name}
      behavior:                                      # Optional. Use to modify HPA's scaling behavior
        scaleDown:
          stabilizationWindowSeconds: 300
          policies:
          - type: Percent
            value: 100
            periodSeconds: 15
  triggers:
  # {list of triggers to activate scaling of the target resource}


查看 KEDA Mterics Server 暴露的指標

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1"

Demo

KEDA 目前支持 53 種 Scalers,如 Kafka,Elasticsearch,MySQL,RabbitMQ,Prometheus 等等,
此處演示一個 Prometheus 和 Kafka 的例子,

Prometheus & KEDA

部署一個 Web 應用,使用 Prometheus 監控 Web 應用 http 請求指標,

為尋求演示效果,此處部署了一個有點擊,互動的 Demo APP,地址如下:https://github.com/livewyer-ops/keda-demo/blob/v1.0.0/examples/keda/,

部署成功后通過 NodePort 訪問:

進入 KubeSphere 專案,新建一個自定義伸縮:

設定最小副本數為 1,最大副本數為 10,輪詢間隔 5 秒,等待時間為 1 分鐘:

KubeSphere 支持 Cron、Prometheus,和自定義觸發器:

觸發器設定 Prometheus,設定請求為 30s 內的增長率總和,當閾值大于 3 時事件驅動觸發縮放:

設定一些其他設定,如資源洗掉后是否恢復指本來的副本數,以及擴縮策略設定:

現在并發訪問 Web App:

可以在自定義監控看到監控指標的變化:

Web App 的副本數開始橫向擴展:

最終擴展到 ScaledObject 中定義的 10 個副本:

在訪問停止后,可以看到監控指標的數值在慢慢變小:

Deployment 開始縮容:

Kafka & KEDA

KEDA 使用 Kafka 事件源演示的整體拓撲如下:

Kafka 使用 Demo 代碼:https://github.com/ChamilaLiyanage/kafka-keda-example.git,

部署 Kafka

打開 KubeSphere 應用商店,查看 DMP 資料庫中心:

選擇 Kafka,進行安裝:

安裝好 Kafka 后,創建一個測驗的 Kafka Topic,Topic 磁區設定為 5,副本設定為 1:

創建 Kafka Producer 服務:

向主題發送訂單:

創建 Consumer 服務:

發送新訂單看 Consumer 服務是否消費:

現在可以來做自動伸縮了,創建一個 ScaledObject,設定最小副本數為 0,最大為 10,輪詢間隔為 5s,Kafka LagThreshold 為 10:

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-scaledobject
  namespace: default
  labels:
    deploymentName: kafka-consumer-deployment # Required Name of the deployment we want to scale.
spec:
  scaleTargetRef:
    deploymentName: kafka-consumer-deployment # Required Name of the deployment we want to scale.
  pollingInterval: 5
  minReplicaCount: 0   #Optional Default 0
  maxReplicaCount: 10  #Optional Default 100
  triggers:
  - type: kafka
    metadata:
      # Required
      BootstrapeServers: radondb-kafka-kafka-external-bootstrap.demo:9092 # Kafka bootstrap server host and port
      consumerGroup: order-shipper  # Make sure that this consumer group name is the same one as the one that is consuming topics
      topic: test
      lagThreshold: "10" # Optional. How much the stream is lagging on the current consumer group

創建自定義伸縮:

現在,讓我們向佇列提交大約 100,000 條訂單訊息,看看自動縮放的實際效果,你會看到隨著佇列中多余訊息的增長,將會產生更多的 kafka-consumer pod,

NAMESPACE   NAME                      REFERENCE                   TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
demo        keda-hpa-kafka-consumer   Deployment/kafka-consumer   5/10 (avg)   1         10        1          2m35s

此處我們看到最大到 5 個副本,沒有到 10 個副本,因為默認最大副本數不會超過 Kafka 主題磁區數量,上面設定了磁區為 5,可以激活 allowIdleConsumers: true 來禁用這個默認行為,
重新編輯自定義伸縮后,最大副本變化成 10:

在無訊息消費時,副本變化為 0:

結尾

到這里本篇就結束了,對此有需求或感興趣的小伙伴可以操練起來了,

本文由博客一文多發平臺 OpenWrite 發布!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552844.html

標籤:其他

上一篇:常用的表格檢測識別方法-表格區域檢測方法(上)

下一篇:返回列表

標籤雲
其他(159302) Python(38156) JavaScript(25435) Java(18070) C(15228) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7197) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4573) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1938) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 應用現代化中的彈性伸縮

    作者:馬偉,青云科技容器顧問,云原生愛好者,目前專注于云原生技術,云原生領域技術堆疊涉及 Kubernetes、KubeSphere、KubeKey 等。 2019 年,我在給很多企業部署虛擬化,介紹虛擬網路和虛擬存盤。 2023 年,這些企業都已經上了云原生了。對于高流量的 Web 應用程式,實時數 ......

    uj5u.com 2023-05-19 09:05:01 more
  • 常用的表格檢測識別方法-表格區域檢測方法(上)

    表格檢測識別一般分為三個子任務:表格區域檢測、表格結構識別和表格內容識別。本章將圍繞這三個表格識別子任務,從傳統方法、深度學習方法等方面,綜述該領域國內國外的發展歷史和最新進展,并提供幾個先進的模型方法。 ......

    uj5u.com 2023-05-19 09:03:36 more
  • 華為Atlas 200I DK A2開箱!

    摘要:Atlas 200I DK A2是Atlas 200DK之后的一款產品,從2022年一直醞釀至今,終于在2023年5月6日-7日昇騰AI開發者峰會2023正式發布。 本文分享自華為云社區《首發!華為Atlas 200I DK A2開箱!》,作者:張輝。 Atlas 200I DK A2是Atl ......

    uj5u.com 2023-05-19 08:57:45 more
  • GPT大語言模型Vicuna本地化部署實踐(效果秒殺Alpaca)

    Vicuna-13B的推理效果據說達到了ChatGPT的90%以上的能力,優于LLaMA-13B和Alpaca-13B的效果。同時Vicuna的訓練成本也很低,所以嘗試本地化部署一下Vicuna-7B,看看效果如何,說干就干。 ......

    uj5u.com 2023-05-19 08:57:36 more
  • ChatGPT新玩法來了,微信聊天機器人

    前言 上一篇文章中說了ChatGPT是什么,然后怎么注冊使用。 傳送門:花了1塊錢體驗一把最近很火的ChatGPT 但是實際操作下來還是有不少小伙伴跟我一樣遇到各種坑。 沒有魔法工具 OpenAI的服務在你的國家無法使用(最多的問題) 注冊不上國外手機號 注冊上手機號了,但是收不到驗證碼(等了20分 ......

    uj5u.com 2023-05-19 08:51:54 more
  • 華為Atlas 200I DK A2開箱!

    摘要:Atlas 200I DK A2是Atlas 200DK之后的一款產品,從2022年一直醞釀至今,終于在2023年5月6日-7日昇騰AI開發者峰會2023正式發布。 本文分享自華為云社區《首發!華為Atlas 200I DK A2開箱!》,作者:張輝。 Atlas 200I DK A2是Atl ......

    uj5u.com 2023-05-19 08:49:46 more
  • GPT大語言模型Vicuna本地化部署實踐(效果秒殺Alpaca)

    Vicuna-13B的推理效果據說達到了ChatGPT的90%以上的能力,優于LLaMA-13B和Alpaca-13B的效果。同時Vicuna的訓練成本也很低,所以嘗試本地化部署一下Vicuna-7B,看看效果如何,說干就干。 ......

    uj5u.com 2023-05-19 08:49:15 more
  • SRE方法論之擁抱風險

    一、系統不可能100%可靠 系統不可能100%可靠,人都不可能100%健康,更何況我們人類創造的系統?所以,任何軟體系統都不應該一味地追求 100%可靠。事實證明,可靠性超過一定值后,再提高可靠性對于一項服務來說,結果可能會更差而不是更好!極端的可靠性會帶來成本的大幅提升:比如過分追求穩定性限制了新 ......

    uj5u.com 2023-05-19 08:49:02 more
  • 更專業省心的來了,你沒必要研究UE4和Unity官方推流了!

    在當今互聯網時代,所有的內容制作者都希望盡可能觸達到更多的目標受眾,那就需要全平臺發布內容并且可以輕松跨平臺分享,包括手機、平板電腦、個人電腦以及互動式螢屏,用戶能暢快的獲得高質量的體驗。需求催生了一種新的“云渲染”方案,將龐大負載的“渲染”放到云端強大算力的服務器去執行,前端僅僅是展示和互動。
    本... ......

    uj5u.com 2023-05-19 08:43:46 more
  • 應用現代化中的彈性伸縮

    作者:馬偉,青云科技容器顧問,云原生愛好者,目前專注于云原生技術,云原生領域技術堆疊涉及 Kubernetes、KubeSphere、KubeKey 等。 2019 年,我在給很多企業部署虛擬化,介紹虛擬網路和虛擬存盤。 2023 年,這些企業都已經上了云原生了。對于高流量的 Web 應用程式,實時數 ......

    uj5u.com 2023-05-19 08:32:20 more