免責聲明:該專案處於測試階段 - API 可能會發生變化。
Watermark Pod Autoscaler (WPA) 控制器是擴展 Horizontal Pod Autoscaler (HPA) 的自訂控制器。
Watermark Pod Autoscaler 控制器是上游 Horizontal Pod Autoscaler 控制器的替代控制器。
如果您想自動縮放某些應用程序,但是:
例如
apiVersion : datadoghq.com/v1alpha1
kind : WatermarkPodAutoscaler
[...]
spec :
algorithm : absolute
[...]
有兩個選項可以計算所需的副本數量:
控制器將使用來自外部average
value from the external metrics provider
/ current number of replicas
,並將其與水印進行比較。建議的副本數量是value from the external metrics provider
/ watermark
值(低或高取決於當前值)。
如果您使用不依賴副本數量的指標,則average
演算法非常適合。通常,ELB 收到的請求數量可以顯示我們想要有多少個 Web 伺服器,因為我們知道單一 Web 伺服器應該處理n
rq/s。新增副本不會增加或減少負載平衡器收到的請求數。
absolute
預設值是absolute
。應使用平均指標。建議的副本數計算為current number of replicas
* value from the external metrics provider
/ watermark
的值。
absolute
演算法是預設演算法,因為它代表最常見的用例。例如,如果您希望應用程式運行在 CPU 的 60% 到 80% 之間,而avg:cpu.usage
為 85%,則需要進行擴充。此指標必須與副本數量相關。
注意:在上游控制器中,僅使用math.Ceil
函數對建議的副本數進行舍入。
這意味著,如果閾值為 10,則外部指標提供程序的利用率需要達到 8.999,才能縮減一個副本。但是,利用率為 10.001 將使您擴展一份副本。
如果該值低於下水位線,WPA 控制器將使用math.Floor
。這確保了對稱行為。與其他縮放選項結合,可以更好地控制何時縮小規模。
若要使用 Watermark Pod Autoscaler,請將其部署在 Kubernetes 叢集中:
下載 Watermark Pod Autoscaler 專案 zip 檔案。原始碼可以在DataDog/watermarkpodautoscaler
中找到。
解壓縮項目,然後進入./watermarkpodautoscaler
資料夾。
定義您的命名空間和 Watermark Pod Autoscaler 控制器:
DD_NAMESPACE= " datadog "
DD_NAMEWPA= " wpacontroller "
建立命名空間:
kubectl create ns $DD_NAMESPACE
使用 Helm 安裝 Watermark Pod Autoscaler 控制器:
helm install $DD_NAMEWPA -n $DD_NAMESPACE ./chart/watermarkpodautoscaler
WatermarkPodAutoscaler 控制器隨附一個 kubectl 插件,提供一組幫助實用程式。有關專用文件頁面的更多資訊:docs/kubectl-plugin.md
在與目標部署相同的命名空間中建立 WPA。
Datadog Cluster Agent 將會擷取建立/更新/刪除事件。它解析 WPA 規範以提取從 Datadog 獲取的指標和範圍。
在此範例中,我們使用以下規格配置:
apiVersion : datadoghq.com/v1alpha1
kind : WatermarkPodAutoscaler
metadata :
name : example-watermarkpodautoscaler
spec :
downscaleForbiddenWindowSeconds : 60
downscaleDelayBelowWatermarkSeconds : 300
upscaleForbiddenWindowSeconds : 30
upscaleDelayAboveWatermarkSeconds : 30
scaleDownLimitFactor : 30
scaleUpLimitFactor : 50
minReplicas : 4
maxReplicas : 9
scaleTargetRef :
kind : " Deployment "
name : " some_app "
apiVersion : " apps/v1 "
metrics :
- external :
highWatermark : 400m
lowWatermark : 150m
metricName : custom.request_duration.max
metricSelector :
matchLabels :
kubernetes_cluster : mycluster
service : billing
short_image : billing-app
type : External
tolerance : " 0.01 "
支援External
和Resource
度量類型。 WPA 控制器使用與 HPA 相同的格式。更多資訊請點這裡。
從水印開始,在邊界( watermarkpodautoscaler.wpa_controller_value
和watermarkpodautoscaler.wpa_controller_high_watermark
watermarkpodautoscaler.wpa_controller_low_watermark
之間從紫色 Datadog 收集的指標值( watermarkpodautoscaler.wpa_controller_value )將指示控制器不要觸發縮放事件。它們被指定為Quantities
,因此您可以使用m | "" | k | M | G | T | P | E
輕鬆表示您要使用的值。
我們可以使用指標watermarkpodautoscaler.wpa_controller_restricted_scaling{reason:within_bounds}
來驗證它確實受到限制。注意:該指標被乘以 1000,以便更明確地表明在此期間控制器不會觸發任何縮放事件。
第二組配置選項與部署的擴充速度有關,由scaleDownLimitFactor
和scaleUpLimitFactor
控制。這些是 0 到 100 之間的整數 它們分別表示在給定當前副本數量的情況下縮小和放大的最大比率。
在這種情況下,如果我們有 10 個副本,建議副本數為 14(有關建議的更多詳細信息,請參閱演算法部分), scaleUpFactor
為 30 (%),則副本數上限為 13 個。
在下圖中,我們可以看到由指標watermarkpodautoscaler.wpa_controller_replicas_scaling_proposal
表示的建議副本數(紫色)與目前副本數相比過高。這將觸發升級上限邏輯,可以使用指標watermarkpodautoscaler.wpa_controller_restricted_scaling{reason:upscale_capping}
進行監控(注意:與上面相同,指標被相乘以使其更明確)。因此,副本的有效數量watermarkpodautoscaler.wpa_controller_replicas_scaling_effective
effective 將根據scaleUpLimitFactor
進行擴充。
在這個類似的範例中,我們避免過度縮減規模,並且可以使用同一組指標來保證僅縮減合理數量的副本。
值得注意的是,我們總是做出保守的擴展決策。
scaleUpLimitFactor
為 29%:如果我們有 10 個副本,建議為 13 個,我們將升級到 12 個。scaleDownLimitFactor
為29%時:如果我們有10個副本並且建議為7,我們將縮小到8。minReplicas
和maxReplicas
優先。請參閱優先順序部分。最後,最後一個可用選項是downscaleForbiddenWindowSeconds
和upscaleForbiddenWindowSeconds
。這些分別表示縮放事件之後在縮小和放大之前等待的時間(以秒為單位)。我們只保留最後一次縮放事件,並且不會將upscaleForbiddenWindowSeconds
與上次僅放大的時間進行比較。
在下面的範例中,我們可以看到,如果我們處於冷卻期,則建議的副本數將被忽略。縮減冷卻時間可以使用watermarkpodautoscaler.wpa_controller_transition_countdown{transition:downscale}
進行視覺化,並在下圖中以黃色表示。我們可以看到它明顯高於圖表中橘色的高檔冷卻時間( transition:upscale
)。一旦我們被建議擴展,我們只會在適當的冷卻窗口結束時擴展。這將重置兩個倒數計時。
為了避免突發縮放,您可以使用以下功能: downscaleDelayBelowWatermarkSeconds
和/或upscaleDelayAboveWatermarkSeconds
。這些選項指定為整數。在配置的持續時間內,指標必須保持在其各自的水位之上或之下。您可以追蹤 WPA 狀態還剩多少時間:
- lastTransitionTime: "2022-11-15T02:02:09Z"
message: Allow downscaling if the value stays under the Watermark
reason: Value below Low Watermark
status: "False"
type: BelowLowWatermark
或在控制器的日誌中:
{"level":"info","ts":1668481092517.446,"logger":"controllers.WatermarkPodAutoscaler","msg":"Will not scale: value has not been out of bounds for long enough","watermarkpodautoscaler":"datadog/example-watermarkpodautoscaler","wpa_name":"example-watermarkpodautoscaler","wpa_namespace":"datadog","time_left":3209}
注意:如果您使用具有此功能的多個指標,則使用指標的OR
來考慮以上/以下條件。
例如,假設您有一個 60 秒的upscaleDelay
,其中包含兩個指標:M1 和 M2。若 M1 維持在高水位線以上 40 秒[t0; t40]
,且 M2 高於其高水位線 30 秒,在最後 10 秒內與 M1 重疊, [t30; t60]
,這驗證了upscaleDelay
條件並允許放大事件。
當我們檢索外部指標的值時,我們首先將其與highWatermark
+ tolerance
總和以及lowWatermark
- tolerance
差進行比較。如果超出範圍,我們會計算建議的副本數量。然後,我們將此值與目前副本數進行比較,以根據minReplicas
和maxReplicas
潛在限制建議的副本數。最後,我們看看是否允許在給定downscaleForbiddenWindowSeconds
和upscaleForbiddenWindowSeconds
的情況下進行縮放。
為了更精細地控制可縮放目標的條件,您可以使用以下功能:
minAvailableReplicaPercentage
:指示控制器自動縮放目標所需可用副本的最小百分比。例如,如果設定為 50 並且目標後面的 pod 少於一半處於可用狀態,則控制器將不會縮放目標。
readinessDelaySeconds
:指定在擴充決策中考慮先前副本需要執行的時間。
如果滿足所有條件,則僅當dryRun
標誌未設為true
時,控制器才會將scaleTargetRef
中的目標物件縮放到建議的副本數。它將透過記錄來表明這一點:
{ "level" : " info " , "ts" : 1566327479.866722 , "logger" : " wpa_controller " , "msg" : " DryRun mode: scaling change was inhibited currentReplicas:8 desiredReplicas:12 " }
叢集代理程式針對 WPA 資源執行通知程序,與 HPA 類似,在建立/更新/刪除時將解析規格以從 Datadog 查詢指標。
預設情況下,群集代理程式不會執行 WPA 偵聽器。若要在叢集代理中啟用 WPA,請設定環境變數DD_EXTERNAL_METRICS_PROVIDER_WPA_CONTROLLER=true
並更新指派給叢集代理服務帳戶的 ClusterRole 以有權存取 WatermarkPodAutoscaler 物件:
[...]
- apiGroups : ["datadoghq.com"]
resources :
- watermarkpodautoscalers
verbs :
- get
- list
- watch
[...]
注意:若要使用 datadog helm 圖表在叢集代理程式中啟用 WPA,請將clusterAgent.metricsProvider.wpaController
設為true
。 ClusterRole 將會自動更新。
套用這些變更並建立 WPA 物件後,如果您在 Datadog Cluster Agent pod 中執行並執行agent status
您將能夠看到有關已解析的自動縮放器規範的更多具體詳細資訊(無論是水平還是水平)水印Pod 自動縮放器)。
* watermark pod autoscaler: default/example2-watermarkpodautoscaler
- name : example2-watermarkpodautoscaler
- namespace : default
- type : watermark
- uid : ff09b7d8-d99b-11e9-a8c1-42010a8001c4
Metric name : sinus
Labels :
- foo : bar
Value : 75.1297378540039
Timestamp : 15688259400
Valid : true
* horizontal pod autoscaler: default/nginxext
- name : nginxext
- namespace : default
- type : horizontal
- uid : 61ef3f6e-af32-11e9-a8c1-42010a8001c4
Metric name : docker.mem.rss
Labels :
- cluster-location : us-central1-a
- cluster-name : charly
Value : 263888700952
Timestamp : 15688259400
Valid : true
除了上述的指標之外,這些日誌還可以幫助您更好地了解 WPA 的正常運作。
每 15 秒,我們從 Datadog 檢索規格的metrics
部分中列出的指標。
{ "level" : " info " , "ts" : 1668484420515.7678 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Metrics from the External Metrics Provider " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "metrics" :[ 33959 ]}
{ "level" : " info " , "ts" : 1668484420515.8203 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Value is below lowMark " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "usage" : " 33959m " , "replicaCount" : 7 , "currentReadyReplicas" : 8 , "tolerance (%)" : 1 , "adjustedLM" : 34650 , "adjustedUsage" : 33959 }
{ "level" : " info " , "ts" : 1668484420515.8906 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Proposing replicas " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "proposedReplicas" : 7 , "metricName" : " datadogmetric@datadog:example-watermarkpodautoscaler-utilization-metric{map[kube_container_name:my-container service:my-target]} " , "reference" : " Deployment/datadog/example-watermarkpodautoscaler " , "metric timestamp" : " Tue, 15 Nov 2022 03:53:20 UTC " }
{ "level" : " info " , "ts" : 1668484420515.9324 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Normalized Desired replicas " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "desiredReplicas" : 7 }
{ "level" : " info " , "ts" : 1668484420515.946 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Cooldown status " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "backoffUp" : false , "backoffDown" : false , "desiredReplicas" : 7 , "currentReplicas" : 8 }
{ "level" : " info " , "ts" : 1668484420515.9563 , "logger" : " controllers.WatermarkPodAutoscaler " , "msg" : " Will not scale: value has not been out of bounds for long enough " , "watermarkpodautoscaler" : " datadog/example-watermarkpodautoscaler " , "wpa_name" : " example-watermarkpodautoscaler " , "wpa_namespace" : " datadog " , "time_left" : 2335 }
此處,目標部署中目前看到的副本數量為 6。然後,我們看到從外部指標提供者檢索到的原始值,並將其與高水位線和低水位線進行比較。根據比較結果,我們列印建議的副本數量。在本例中,它是五個。
如果想直接查詢External Metrics Provider,可以使用以下指令:
kubectl get --raw " /apis/external.metrics.k8s.io/v1beta1/namespaces// | jq ."
您也可以透過新增?labelSelector=key%3Dvalue
來選擇新增標籤選擇器。如果我們想在這種情況下檢索我們的指標,我們可以使用:
kubectl get --raw " /apis/external.metrics.k8s.io/v1beta1/namespaces// | jq .?labelSelector=key%3Dvalue%2Cotherkey%3Dothervalue%2Cshort_image%3Dimage "
如果您看到以下日誌:
{ "level" : " info " , "ts" : 1566397216.8918724 , "logger" : " wpa_controller " , "msg" : " failed to compute desired number of replicas based on listed metrics for Deployment/datadog/propjoe-green: failed to get external metric dd.propjoe.request_duration.max: unable to get external metric datadog/propjoe-green/&LabelSelector{MatchLabels:map[string]string{fooa: bar,},MatchExpressions:[],}: no metrics returned from external metrics API " }
然後您可以驗證外部指標提供者確實無法提供該指標。這可能是由於標籤中的拼字錯誤,或無法從 Datadog 取得指標(這可能是由於各種因素造成的:太稀疏、API 關閉、達到速率限制等)。您可以查看外部指標提供程序日誌以進行進一步調查。
然後我們驗證縮放速度上限和冷卻時間視窗。在縮放上限的情況下,您會看到類似以下內容:
{ "level" : " info " , "ts" : 1566327268.8839815 , "logger" : " wpa_controller " , "msg" : " Upscaling rate higher than limit of 50.0% up to 9 replicas. Capping the maximum upscale to 9 replicas " }
{ "level" : " info " , "ts" : 1566327268.884001 , "logger" : " wpa_controller " , "msg" : " Returning 9 replicas, condition: ScaleUpLimit reason the desired replica count is increasing faster than the maximum scale rate " }
{ "level" : " info " , "ts" : 1566327479.8845513 , "logger" : " wpa_controller " , "msg" : " -> after normalization: 9 " }
然後我們考慮冷卻時間。您將擁有指示上次縮放事件發生時間以及禁止下一次縮放事件的時間的日誌,直到:
{ "level" : " info " , "ts" : 1566327479.8845847 , "logger" : " wpa_controller " , "msg" : " Too early to downscale. Last scale was at 2019-08-20 18:57:44 +0000 UTC, next downscale will be at 2019-08-20 18:58:44 +0000 UTC, last metrics timestamp: 2019-08-20 18:57:59 +0000 UTC " }
{ "level" : " info " , "ts" : 1566327479.8846018 , "logger" : " wpa_controller " , "msg" : " Too early to upscale. Last scale was at 2019-08-20 18:57:44 +0000 UTC, next upscale will be at 2019-08-20 18:58:14 +0000 UTC, last metrics timestamp: 2019-08-20 18:57:59 +0000 UTC " }
{ "level" : " info " , "ts" : 1566327479.884608 , "logger" : " wpa_controller " , "msg" : " backoffUp: true, backoffDown: true, desiredReplicas 5, currentReplicas: 6 " }
最後,我們驗證部署是否已正確自動縮放:
{ "level" : " info " , "ts" : 1566327253.7887673 , "logger" : " wpa_controller " , "msg" : " Successful rescale of watermarkpodautoscaler, old size: 8, new size: 9, reason: cutom_metric.max{map[kubernetes_cluster:my-cluster service:my-service short_image:my-image]} above target " }
wpa.datadoghq.com/logs-attributes
在與基礎 WPA 物件關聯的日誌中新增額外的鍵值。例子: apiVersion: datadoghq.com/v1alpha1
kind: WatermarkPodAutoscaler
metadata:
annotations:
wpa.datadoghq.com/logs-attributes: '{"mywpa": "isgreat"}'
name: watermarkpodautoscaler-sinus
namespace: default
[...]
將產生:
{"level":"info","ts":1643642642091.062,"logger":"controllers.WatermarkPodAutoscaler","msg":"getReadyPodsCount","watermarkpodautoscaler":"default/watermarkpodautoscaler-sinus","mywpa":"isgreat","full podList length":2,"toleratedAsReadyPodCount":2,"incorrectly targeted pods":0}
如果我手動擴展部署會發生什麼?
在下一個協調循環中,將考慮新的副本數量來計算所需的副本數量。您可能會看到一條日誌,指出該資源已被其他人修改。但是,如果配置的副本數量超出範圍,控制器會將其縮小到可接受範圍內的副本數量。
如何暫時停用 WPA 以手動擴大/縮小我的部署?
建議的方法是將 WPA 設定為試運行模式,然後擴展到所需的副本數量。您可以使用以下補丁命令在試運行中設定 WPA:
kubectl patch wpa --type='json' -p='[{"op": "replace", "path": "/spec/dryRun", "value":true}]'
臨時覆蓋結束後,不要忘記將試運行模式設為false
以便 WPA 再次處於活動狀態。
控制器的佔地面積是多少?
根據我們的測試,它是叢集中部署數量的一個因素。
控制器是無狀態的嗎?
是的。
WPA 是否支援多個指標?
是的,WPA 可以根據多個指標進行擴展,並且工作原理與 HPA 類似。 WPA 單獨評估每個指標,並建議與需要最大數量的指標相關聯的副本數量。例如,如果 WPA 評估 metric1、metric2、metric3,並分別計算 10、20、30 個副本提案,則最終提案為 30。
由於我們觀察群集範圍內的所有 WPA 定義,因此我們使用群集角色。
一個有用的選項是模擬使用者來驗證權限。例如,若要驗證您是否有權作為 WPA 控制器的服務帳戶進行部署:
kubectl get deploy < your_deploy > --as system:serviceaccount:datadog:watermarkpodautoscaler -n < your_ns >
或者,查詢外部指標提供者:
kubectl get --raw " /apis/external.metrics.k8s.io/v1beta1/namespaces//metric --as system:serviceaccount::watermarkpodautoscaler
要求:
克隆儲存庫https://github.com/DataDog/watermarkpodautoscaler
後,設定一些環境變數:
export GO111MODULE=on
unset GOPATH
export PATH= $PATH : $( pwd ) /bin
然後,要安裝一些工具依賴項,請執行make install-tools
。
make install-tools
:安裝工具以使用操作員 SDK。make build
:在本地建置控制器。make generate
:執行多個操作員SDK產生器,產生控制器和通知者註冊的程式碼。make test
:運行單元測試。make validate
:執行常見的 Golang linter ( golangci-lint
)。make e2e
:在目前配置的 Kubernetes 叢集上執行端對端測試。make container
:使用operator SDK建構控制器Docker映像。make container-ci
:使用多階段 Dockerfile 建置控制器 Docker 映像。發布流程文件可在此處取得。
其中一些功能的靈感來自可設定 HPA 或 CHPA。儘管 CRD 的整體打包是透過營運商 SDK 完成的,但大部分程式碼結構也用於 Watermark Pod Autoscaler。