跳到內容

自動調整範例應用程式 - Go

Knative Serving 修訂版本自動調整功能的展示。

先決條件

  1. 已安裝 Knative Serving 的 Kubernetes 叢集。
  2. 已安裝 hey 負載產生器 (go install github.com/rakyll/hey@latest)。
  3. 複製此儲存庫,並移至範例目錄

    git clone -b "release-1.16" https://github.com/knative/docs knative-docs
    cd knative-docs
    

部署服務

  1. 部署 範例 Knative 服務

    kubectl apply -f docs/serving/autoscaling/autoscale-go/service.yaml
    
  2. 取得服務的 URL (一旦 Ready)

    $ kubectl get ksvc autoscale-go
    NAME            URL                                                LATESTCREATED         LATESTREADY           READY   REASON
    autoscale-go    http://autoscale-go.default.1.2.3.4.sslip.io    autoscale-go-96dtk    autoscale-go-96dtk    True
    

載入服務

  1. 向自動調整應用程式發出請求,以查看它消耗的一些資源。

    curl "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5"
    
    Allocated 5 Mb of memory.
    The largest prime less than 10000 is 9973.
    Slept for 100.13 milliseconds.
    
  2. 傳送 30 秒的流量,並維持 50 個進行中請求。

    hey -z 30s -c 50 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5" \
      && kubectl get pods
    
    Summary:
      Total:        30.3379 secs
      Slowest:      0.7433 secs
      Fastest:      0.1672 secs
      Average:      0.2778 secs
      Requests/sec: 178.7861
    
      Total data:   542038 bytes
      Size/request: 99 bytes
    
    Response time histogram:
      0.167 [1]     |
      0.225 [1462]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.282 [1303]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.340 [1894]  |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.398 [471]   |■■■■■■■■■■
      0.455 [159]   |■■■
      0.513 [68]    |  0.570 [18]    |
      0.628 [14]    |
      0.686 [21]    |
      0.743 [13]    |
    
    Latency distribution:
      10% in 0.1805 secs
      25% in 0.2197 secs
      50% in 0.2801 secs
      75% in 0.3129 secs
      90% in 0.3596 secs
      95% in 0.4020 secs
      99% in 0.5457 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:   0.0007 secs, 0.1672 secs, 0.7433 secs
      DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs
      req write:    0.0001 secs, 0.0000 secs, 0.0045 secs
      resp wait:    0.2766 secs, 0.1669 secs, 0.6633 secs
      resp read:    0.0002 secs, 0.0000 secs, 0.0065 secs
    
    Status code distribution:
      [200] 5424 responses
    
    NAME                                             READY   STATUS    RESTARTS   AGE
    autoscale-go-00001-deployment-78cdc67bf4-2w4sk   3/3     Running   0          26s
    autoscale-go-00001-deployment-78cdc67bf4-dd2zb   3/3     Running   0          24s
    autoscale-go-00001-deployment-78cdc67bf4-pg55p   3/3     Running   0          18s
    autoscale-go-00001-deployment-78cdc67bf4-q8bf9   3/3     Running   0          1m
    autoscale-go-00001-deployment-78cdc67bf4-thjbq   3/3     Running   0          26s
    

分析

演算法

Knative Serving 自動調整基於每個 Pod 的平均進行中請求數 (並行)。系統具有預設的 目標並行數 100 (搜尋 container-concurrency-target-default),但是 我們對服務使用了 10。我們以 50 個並行請求載入服務,因此自動調整器建立了 5 個 Pod (50 個並行請求 / 目標 10 = 5 個 Pod)

緊急情況

自動調整器會在 60 秒的時間範圍內計算平均並行數,因此系統需要一分鐘的時間才能穩定在所需的並行數。但是,自動調整器還會計算 6 秒的緊急時間範圍,如果該時間範圍達到目標並行數的 2 倍,則會進入緊急模式。在緊急模式下,自動調整器會在較短且更敏感的緊急時間範圍內運作。一旦緊急狀況不再持續 60 秒,自動調整器就會返回初始的 60 秒穩定時間範圍。

                                                       |
                                  Panic Target--->  +--| 20
                                                    |  |
                                                    | <------Panic Window
                                                    |  |
       Stable Target--->  +-------------------------|--| 10   CONCURRENCY
                          |                         |  |
                          |                      <-----------Stable Window
                          |                         |  |
--------------------------+-------------------------+--+ 0
120                       60                           0
                     TIME

自訂

自動調整器支援透過註解進行自訂。Knative 內建了兩個自動調整器類別

  1. kpa.autoscaling.knative.dev,這是先前描述的基於並行的自動調整器 (預設),以及
  2. hpa.autoscaling.knative.dev,它會委派給 Kubernetes HPA,該 HPA 會根據 CPU 使用率自動調整。

以 CPU 調整的服務範例

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        # Standard Kubernetes CPU-based autoscaling.
        autoscaling.knative.dev/class: hpa.autoscaling.knative.dev
        autoscaling.knative.dev/metric: cpu
    spec:
      containers:
        - image: ghcr.io/knative/autoscale-go:latest

此外,可以在註解中指定自動調整器目標和縮放界限。具有自訂目標和縮放界限的服務範例

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        # Knative concurrency-based autoscaling (default).
        autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
        autoscaling.knative.dev/metric: concurrency
        # Target 10 requests in-flight per pod.
        autoscaling.knative.dev/target: "10"
        # Disable scale to zero with a min scale of 1.
        autoscaling.knative.dev/min-scale: "1"
        # Limit scaling to 100 pods.
        autoscaling.knative.dev/max-scale: "100"
    spec:
      containers:
        - image: ghcr.io/knative/autoscale-go:latest

注意

對於 hpa.autoscaling.knative.dev 類別的服務,autoscaling.knative.dev/target 指定 CPU 百分比目標 (預設為 "80")。

演示

觀看 Knative 自動調整器自訂的 Kubecon 演示 (32 分鐘)。

其他實驗

  1. 傳送 60 秒的流量,並維持 100 個並行請求。

    hey -z 60s -c 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5"
    
  2. 傳送 60 秒的流量,並以短請求 (10 毫秒) 維持 100 qps。

    hey -z 60s -q 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=10"
    
  3. 傳送 60 秒的流量,並以長請求 (1 秒) 維持 100 qps。

    hey -z 60s -q 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=1000"
    
  4. 傳送 60 秒的流量,並帶有大量的 CPU 使用率 (~1 個 CPU/秒/請求,總共 100 個 CPU)。

    hey -z 60s -q 100 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?prime=40000000"
    
  5. 傳送 60 秒的流量,並帶有大量的記憶體使用率 (1 gb/請求,總共 5 gb)。

    hey -z 60s -c 5 \
      "http://autoscale-go.default.1.2.3.4.sslip.io?bloat=1000"
    

清除

kubectl delete -f docs/serving/autoscaling/autoscale-go/service.yaml

延伸閱讀

自動調整開發人員文件

我們使用分析和 Cookie 來了解網站流量。為了這個目的,您使用我們網站的相關資訊會與 Google 分享。了解更多。