自動調整範例應用程式 - Go¶
Knative Serving 修訂版本自動調整功能的展示。
先決條件¶
- 已安裝 Knative Serving 的 Kubernetes 叢集。
- 已安裝
hey
負載產生器 (go install github.com/rakyll/hey@latest
)。 -
複製此儲存庫,並移至範例目錄
git clone -b "release-1.16" https://github.com/knative/docs knative-docs cd knative-docs
部署服務¶
-
部署 範例 Knative 服務
kubectl apply -f docs/serving/autoscaling/autoscale-go/service.yaml
-
取得服務的 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
載入服務¶
-
向自動調整應用程式發出請求,以查看它消耗的一些資源。
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.
-
傳送 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 內建了兩個自動調整器類別
kpa.autoscaling.knative.dev
,這是先前描述的基於並行的自動調整器 (預設),以及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 分鐘)。
其他實驗¶
-
傳送 60 秒的流量,並維持 100 個並行請求。
hey -z 60s -c 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=100&prime=10000&bloat=5"
-
傳送 60 秒的流量,並以短請求 (10 毫秒) 維持 100 qps。
hey -z 60s -q 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=10"
-
傳送 60 秒的流量,並以長請求 (1 秒) 維持 100 qps。
hey -z 60s -q 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?sleep=1000"
-
傳送 60 秒的流量,並帶有大量的 CPU 使用率 (~1 個 CPU/秒/請求,總共 100 個 CPU)。
hey -z 60s -q 100 \ "http://autoscale-go.default.1.2.3.4.sslip.io?prime=40000000"
-
傳送 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