怎么自定義Istio指標實現(xiàn)Pod水平自動縮放以及自動伸縮SpringBoot

這篇文章主要介紹“怎么自定義Istio指標實現(xiàn)Pod水平自動縮放以及自動伸縮Spring Boot”,在日常操作中,相信很多人在怎么自定義Istio指標實現(xiàn)Pod水平自動縮放以及自動伸縮Spring Boot問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么自定義Istio指標實現(xiàn)Pod水平自動縮放以及自動伸縮Spring Boot”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

成都網(wǎng)站設計、做網(wǎng)站,成都做網(wǎng)站公司-成都創(chuàng)新互聯(lián)公司已向1000+企業(yè)提供了,網(wǎng)站設計,網(wǎng)站制作,網(wǎng)絡營銷等服務!設計與技術結合,多年網(wǎng)站推廣經(jīng)驗,合理的價格為您打造企業(yè)品質網(wǎng)站。

Pipeline的核心功能之一,Banzai Cloud的應用程序和devops容器管理平臺,是多維的并可以基于默認和自定義指標進行自動調節(jié)。 在我們引入自定義指標后,我們選擇了通過Prometheus適配器從Prometheus收集指標。 從那時起,我們的許多客戶開始使用Hoizontal Pod Autoscaling,他們中的大多數(shù)人只對基本的CPU和內存指標感到滿意。

我們一直都知道這不是一個理想的解決方案,我們一直在努力尋求更靈活的解決方案,以便:

  • 基于自定義Prometheus指標的擴展

  • 為更復雜的Prometheus查詢提供擴展支持

隨著我們的開源Istio operator的發(fā)布以及在Pipeline平臺上廣泛引入基于Istio的服務網(wǎng)格,我們也提供了根據(jù)自定義的Istio指標的自動縮放功能。 Prometheus現(xiàn)在提供網(wǎng)絡指標,延遲,故障率以及更多指標(默認情況下從Istio中刪除)。 我們的HPA operator根據(jù)這些指標決定是否擴展。

但是,在使用Prometheus Adapter時,我們的方法已不再可行,因此我們決定探索替代方案。

如果您錯過了我們關于Pipeline平臺所支持和自動化不同類型的自動縮放功能的系列博客,請查看這些早先的帖子:

  1. Autoscaling Kubernetes集群

  2. Vertical pod autoscaler

  3. 自定義指標上的水平自動縮放Kubernetes部署

  4. Horizontal Pod Autoscaler Kubernetes Operator

  5. 重新加載水平Pod自動調節(jié)器操作員

TL;DR

  • Pipeline及其HPA Operator中對重新設計的自定義指標支持的介紹。

  • 使用來自Prometheus的Istio指標自動調整Spring Boot部署的示例

  • 深入了解添加自定義指標后發(fā)生了什么

  • 切換到另一個自定義指標適配器,kube-metrics-adapter的介紹

重新支持自定義指標

由于上面列出的原因,我們決定使用另一個自定義指標適配器,kube-metrics-adapter。

kube-metrics-adapter是一種通用指標適配器,可以從多個來源收集和提供指標。對于每個源,都有一個Collector實現(xiàn);目前,我們對其Prometheus收集器最感興趣。

Prometheus Collector是一個通用收集器。它將Prometheus查詢映射到可由HPA控制器用于部署自動擴展的度量標準。它的方法不同于Prometheus Adapter,它具有預定義的規(guī)則集 - 包含針對Prometheus運行的查詢,用于將指標轉換為自定義指標 - 定期執(zhí)行。獲取所有匹配的指標標準(因為這些查詢必須是通用的并且定位所有pod和部署),并作為自定義指標進行轉換和公開。相比之下,“Prometheus collector”僅收集自定義查詢返回的指標結果,其定義因部署而異,并且僅針對單個部署/ pod或服務,從而減少了存儲的指標總數(shù)。該解決方案的一個缺點是,目前,用戶應該避免執(zhí)行性能不佳的查詢。

使用ISTIO自動伸縮Spring Boot應用

我選擇了流行的spotguides,基于MySQL的Sprint Boot 應用,以便在MySQL服務器旁,快速啟動一個輕量級Web應用程序容器。 我使用Banzai Pipeline Beta,它支持在六個云提供商中或在本地快速啟動Kubernetes集群。 Prometheus & Grafana Monitoring以及Istio是默認功能,可以通過UI開關輕松打開(Pipeline處理其余部分)。 在這個例子中,我將在Google Cloud上啟動一個Kubernetes集群,并打開Monitoring and Service Mesh,并在其上部署Spring Boot Spotguide。 群集創(chuàng)建是我們的spotguide向導的一部分,但是,因為Service MeshPipeline中的一個相對較新的功能,我們不能(迄今為止)從spotguide的流程中啟用它, 所以我們必須事先創(chuàng)建集群。

我在這個視頻中記錄了這些步驟:

一旦你的Spring Boot容器MySQL服務器啟動并運行,你就可以從Spotguid 總覽打開演示程序。這是一個演示應用程序,是典型的Spring Web應用程序。我們已經(jīng)創(chuàng)建了一個GitHub代碼庫,你可以在里面找到示意代碼(就像我們的其他spotguides一樣)。默認情況下,應用程序URL將僅返回運行狀況檢查狀態(tài),該狀態(tài)連接到Kubernetes活動和準備情況檢查。然后,JVM指標將暴露給Prometheus,并且repo將集成到我們的CI/CD流中,因此,一旦您提交業(yè)務邏輯,它將自動部署到集群。在這里閱讀更多關于我們的spotguides。

您可以從群集列表或詳細信息頁面下載Kubernetes配置,以便稍后從本地計算機獲取對群集的kubectl訪問權限。

我正在使用hey工具(go get -u github.com/rakyll/hey)來生成針對Spring應用程序的負載;下面的命令將每秒發(fā)出50個請求,總計10000個請求:

hey -n 10000 -q 50 https://spring-boot-custom-metrics-demo.sancyx5g25.sancyx.beta.banzaicloud.io/actuator/health/kubernetes

現(xiàn)在,打開監(jiān)控(我們的Spotguide摘要或群集詳細信息頁面中提供的鏈接)以查看可用的指標并確定您的Prometheus查詢。 因為我們啟用了Service Mesh,所有網(wǎng)絡通信都將通過Envoy代理,將指標發(fā)送到Istio遙測服務,該服務由Prometheus抓取。

我將基于我的示例,查詢基于istio_requests_total指標,該指標與Spring容器相關:

sum(rate(istio_requests_total{destination_service="spring-boot-custom-metrics-demo-spotguide-spring-boot.default.svc.cluster.local",destination_service_name="spring-boot-custom-metrics-demo-spotguide-spring-boot",destination_service_namespace="default",destination_workload="spring-boot-custom-metrics-demo-spotguide-spring-boot"}[1m]))

請務必添加相應的標簽過濾器,以便專門選擇與您的pod/部署相關的指標。

從部署列表頁面上的Horizontal Pod Autoscaler菜單中選擇spring-boot-custom-metrics-demo-spotguide-spring-boot部署,以訪問HPA Edit頁面。 在那里,您可以通過輸入自定義指標或查詢的名稱來設置cpu,內存和自定義指標。

現(xiàn)在,如果您在更長的時間內生成另一個負載(50個請求/秒),則應在屬于部署的HPA中增加副本計數(shù):

hey -n 50000 -q 50 https://spring-boot-custom-metrics-demo.sancyx5g25.sancyx.beta.banzaicloud.io/actuator/health/kubernetes

...

kubectl get hpa

NAME                                                   REFERENCE                                                 TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
spring-boot-custom-metrics-demo-spotguide-spring-boot   Deployment/spring-boot-custom-metrics-demo-spotguide-spring-boot   245866m/40   1         10        7          80s

加載結束后,副本數(shù)將慢慢減少到默認的最小值:

kubectl get hpa

NAME                                                   REFERENCE                                                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
spring-boot-custom-metrics-demo-spotguide-spring-boot   Deployment/spring-boot-custom-metrics-demo-spotguide-spring-boot   266m/40   1         10        1          32m

背后的場景

讓我們深入了解使用Pipeline UI向部署添加自定義指標時幕后發(fā)生的情況。 這個流程非常類似于資源指標,您可能會從之前的一系列帖子中熟悉這些指標,但是現(xiàn)在,讓我們關注與自定義指標相關的API。

Pipeline UI使用HPA API創(chuàng)建/更新指標:

PUT {{pipeline_url}}/api/v1/orgs/:orgId/clusters/:clusterId/hpa

{
  "scaleTarget": "example-deployment-name",
  "minReplicas": 1,
  "maxReplicas": 10,
  "customMetrics": {
    "customMetricName": {
      "query": "sum({kubernetes_pod_name=~\"^example-deployment-name-pod.*\",__name__=~\"example-metric-name\"})",
      "targetAverageValue": "100"
    }
  }
}

如果要指定絕對值,可以使用targetValue而不是targetAverageValue。 不同之處在于,targetAverageValue使用當前pod副本計數(shù)對獲取的度量值進行平均。

Pipeline實際上做的是為您的部署添加以下注釋:

    hpa.autoscaling.banzaicloud.io/maxReplicas=10
    hpa.autoscaling.banzaicloud.io/minReplicas=1
    prometheus.customMetricName.hpa.autoscaling.banzaicloud.io/query=sum({kubernetes_pod_name=~\"^example-deployment-name-pod.*\",__name__=~\"example-metric-name\"})

所有這些都是通過HPA operator實現(xiàn)的,它根據(jù)部署注釋管理HPA資源。 Pipeline在群集創(chuàng)建完成后,通過一個post hook,部署HPA operator,然后,如果metrics.api尚未注冊,則部署kube-metrics-adaptermetrics-server。 此過程可能會有所不同,具體取決于您的云提供商和K8s版本,這些版本可能已安裝了某些功能。在我們的例子中,新創(chuàng)建的HPA對象將如下所示:

apiVersion: v1
items:
- apiVersion: autoscaling/v1
  kind: HorizontalPodAutoscaler
  metadata:
    annotations:
    ...
      autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Object","object":{"target":{"kind":"Pod","name":"example-deployment-name-customMetricName","apiVersion":"v1"},"metricName":"customMetricName","currentValue":"222m"}}]'
      autoscaling.alpha.kubernetes.io/metrics: '[{"type":"Object","object":{"target":{"kind":"Pod","name":"example-deployment-name-customMetricName","apiVersion":"v1"},"metricName":"customMetricName","targetValue":"40"}}]'
      metric-config.object.customMetricName.prometheus/per-replica: "true"
      metric-config.object.customMetricName.prometheus/query: sum({kubernetes_pod_name=~\"^example-deployment-name-pod.*\",__name__=~\"example-metric-name\"})
    ...
  spec:
    maxReplicas: 10
    minReplicas: 1
    scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: example-deployment-name
  status:
    currentReplicas: 1
    desiredReplicas: 1
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

請注意,自定義度量標準是Object類型,并綁定到名為example-deployment-name-customMetricName的Pod資源。 Kube-metrics-adapter也使用注釋查詢來獲取度量值,該值在以下端點公開/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/example-deployment-name -customMetricName/customMetricName,并且它正是HPA控制器將要查找的位置:

$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/customMetricName" | jq .
{
  "kind": "MetricValueList",
  "apiVersion": "custom.metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/customMetricName"
  },
  "items": [
    {
      "describedObject": {
        "kind": "Pod",
        "namespace": "default",
        "name": "example-deployment-name-customMetricName",
        "apiVersion": "v1"
      },
      "metricName": "customMetricName",
      "timestamp": "2019-03-13T20:23:32Z",
      "value": "222m"
    }
  ]
}

到此,關于“怎么自定義Istio指標實現(xiàn)Pod水平自動縮放以及自動伸縮Spring Boot”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

標題名稱:怎么自定義Istio指標實現(xiàn)Pod水平自動縮放以及自動伸縮SpringBoot
標題URL:http://www.muchs.cn/article32/gjgjpc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、網(wǎng)站營銷、定制網(wǎng)站、網(wǎng)站設計、面包屑導航網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設