本頁說明如何搭配應用程式負載平衡器使用自訂指標。您可以根據應用程式或基礎架構需求專屬的指標,而非 Google Cloud的標準使用率或以速率為準的指標,設定負載平衡器的流量分配行為。定義負載平衡器的自訂指標,可彈性地將應用程式要求轉送至最適合工作負載的後端執行個體和端點。
如果是 GKE,您也可以使用來自所執行服務或應用程式的自訂指標。詳情請參閱「公開自訂指標」。
負載平衡器會根據自訂指標值做出下列決策:
- 選取要接收流量的後端虛擬機器 (VM) 執行個體群組或網路端點群組。
- 選取要接收流量的 VM 執行個體或端點。
以下列舉幾種自訂指標的用途:
根據與應用程式最相關的自訂指標,而非區域親和性或網路延遲等預設條件,做出負載平衡決策,盡量充分運用全域運算容量。
如果應用程式的後端處理延遲時間通常以秒為單位,您可以根據自訂指標 (而非網路延遲時間) 平衡要求負載,更有效率地運用全域運算容量。
盡量提高運算效率:根據部署作業特有的指標組合,做出負載平衡決策。舉例來說,假設您的要求處理時間和運算需求差異很大,在這種情況下,如果只根據每秒要求數率進行負載平衡,就會導致負載分配不均。在這種情況下,您可能需要定義自訂指標,根據要求率和 CPU/GPU 使用率的組合平衡負載,以最有效率地使用運算叢集。
根據與應用程式需求最相關的自訂指標自動調度後端資源。舉例來說,您可以定義自動調度資源政策,在設定的自訂指標超過 80% 時,自動調度後端執行個體。方法是使用以流量為準的自動調度資源指標 (
autoscaling.googleapis.com|gclb-capacity-fullness
)。詳情請參閱根據負載平衡器流量自動調度資源。
支援的負載平衡器和後端
下列應用程式負載平衡器支援自訂指標:
- 全域外部應用程式負載平衡器
- 區域性外部應用程式負載平衡器
- 跨區域內部應用程式負載平衡器
- 區域性內部應用程式負載平衡器
自訂指標支援下列後端類型:
- 代管執行個體群組
- 區域性網路端點群組 (含
GCE_VM_IP_PORT
端點) - 混合式連線 NEG
自訂指標的運作方式
如要讓負載平衡器根據自訂指標決定流量分配方式,請先找出最適合特定應用程式的指標。瞭解要使用的指標後,請設定後端,開始向負載平衡器穩定回報這些指標。 Google Cloud 可讓您在後端傳送至負載平衡器的每個 HTTP 回應標頭中回報指標。這些指標會封裝在自訂 HTTP 回應標頭中,且必須遵循開放式要求費用彙整 (ORCA) 標準。
指標可設定於兩個層級:
- 在後端服務層級,影響後端 (MIG 或 NEG) 選取作業
- 在後端層級,影響 VM 執行個體或端點選取作業
以下各節說明自訂指標的運作方式。
判斷哪些自訂指標會影響負載平衡決策
判斷哪些自訂指標會影響負載平衡決策,是高度主觀的行為,取決於應用程式的需求。舉例來說,如果應用程式的後端處理延遲時間是以秒為單位,您可能需要根據其他自訂指標 (而非標準網路延遲時間) 進行負載平衡要求。
決定要使用的指標後,您還必須為每個指標設定最高用量門檻。舉例來說,如果您想使用記憶體用量做為指標,也必須為每個後端判斷記憶體用量上限閾值。
舉例來說,如果您設定名為 example-custom-metric
的指標,並將使用率上限閾值設為 0.8,負載平衡器就會動態調整後端之間的流量分配,盡可能讓後端回報的 example-custom-metric
指標低於 0.8。
您可以使用兩種自訂指標:
預留指標。有五個預留的指標名稱,這些名稱之所以預留,是因為對應至 ORCA API 中的頂層預先定義欄位。
orca.cpu_utilization
orca.mem_utilization
orca.application_utilization
orca.eps
orca.rps_fractional
mem_utilization
、cpu_utilization
和application_utilization
指標的值應介於0.0 - 1.00
範圍內,但如果資源用量超出預算,則可能超過1.00
。具名指標。這些是應用程式專屬的指標,您可以使用 ORCA
named_metrics
欄位指定,格式如下:orca.named_metrics.METRIC_NAME
所有使用者定義的自訂指標都會使用這個
named_metrics
對應指定,格式為名稱/值組合。為
CUSTOM_METRICS
平衡模式定義的具名指標必須包含0 - 100
範圍內的值。為負載平衡地區政策定義的具名指標沒有預期範圍。WEIGHTED_ROUND_ROBIN
必要指標
如要讓負載平衡器使用自訂指標選取後端 VM 執行個體群組或網路端點群組,您必須在傳送至負載平衡器的 ORCA 負載報表中,指定一或多個下列使用率指標。orca.named_metrics
是使用者定義指標的地圖,格式為名稱/值組合。
orca.cpu_utilization
orca.application_utilization
orca.mem_utilization
orca.named_metrics
此外,如要讓負載平衡器使用自訂指標,進一步影響後端 VM 執行個體或端點的選取作業,您必須在傳送至負載平衡器的 ORCA 負載報表中,提供所有下列指標。負載平衡器會使用根據這些回報指標計算出的權重,將負載指派給個別後端。
orca.rps_fractional
(每秒要求數)orca.eps
(每秒錯誤數)- 使用率指標,優先順序如下:
orca.application_utilization
orca.cpu_utilization
orca.named_metrics
地圖中的使用者定義指標
限制和規定
每個後端最多可有兩個自訂指標。不過,您最多可以對三個自訂指標執行
dryRun
測試。如果提供兩項指標,負載平衡器會分別處理。 舉例來說,如果您定義兩個維度:
custom-metric-util1
和custom-metric-util2
,負載平衡器會分別處理這兩個維度。如果後端在custom-metric-util1
方面以高使用率運作,負載平衡器會避免將流量傳送至這個後端。一般來說,負載平衡器會盡量讓所有後端以大致相同的飽和度運作。完整度的計算方式為currentUtilization
/maxUtilization
。在這種情況下,負載平衡器會使用這兩項指標回報的較高飽和度值,做出負載平衡決策。每個後端服務最多可有兩個自訂指標。不過,您最多可以對三個自訂指標執行
dryRun
測試。這項限制不包括必要指標orca.eps
和orca.rps_fractional
。這項限制也與後端層級設定的指標無關。保留指標和具名指標可以同時使用。舉例來說,單一負載報表可以同時提供
orca.cpu_utilization = 0.5
和自訂指標 (例如orca.named_metrics.queue_depth_util = 0.2
)。自訂指標名稱不得包含受管制、敏感、可識別或其他機密資訊,以免機構外部人士看到。
自訂指標規格可用的編碼
JSON
載入報告的 JSON 編碼範例:
endpoint-load-metrics-json: JSON {"cpu_utilization": 0.3, "mem_utilization": 0.8, "rps_fractional": 10.0, "eps": 1, "named_metrics": {"custom-metric-util": 0.4}}.
二進位 Protobuf
如果是可辨識通訊協定緩衝區的程式碼,這會是二進位序列化 base64 編碼的 OrcaLoadReport protobuf,位於
endpoint-load-metrics-bin
或endpoint-load-metrics: BIN
中。原生 HTTP
endpoint-load-metrics
中以半形逗號分隔的鍵/值組合。這是 OrcaLoadReport 的扁平化文字表示法:endpoint-load-metrics: TEXT cpu_utilization=0.3, mem_utilization=0.8, rps_fractional=10.0, eps=1, named_metrics.custom_metric_util=0.4
gRPC
根據 gRPC 規格,指標必須使用
endpoint-load-metrics-bin
金鑰,透過尾端中繼資料提供。
回報自訂指標的後端設定
決定負載平衡器要使用的指標後,請設定後端,在 ORCA 負載報表中編譯所需的自訂指標,並在傳送至負載平衡器的每個 HTTP 回應標頭中回報這些指標的值。
舉例來說,如果您選擇 orca.cpu_utilization
做為後端的自訂指標,後端就必須在傳送給負載平衡器的每個回應中,向負載平衡器回報目前的 CPU 使用率。如需操作說明,請參閱本頁的「向負載平衡器回報指標」一節。
支援自訂指標的負載平衡器設定
如要讓負載平衡器使用後端回報的自訂指標值來決定流量分配,請將每個後端的平衡模式設為 CUSTOM_METRICS
,並將後端服務負載平衡區域政策設為 WEIGHTED_ROUND_ROBIN
。
CUSTOM_METRICS
平衡模式。後端服務中的每個後端都必須設定為使用CUSTOM_METRICS
平衡模式。如果後端設定為CUSTOM_METRICS
平衡模式,負載平衡器會根據為每個自訂指標設定的使用率上限門檻,將流量導向後端。每個後端都可以指定要回報的一組不同指標。如果每個後端都設定多個自訂指標,負載平衡器會嘗試分配流量,讓所有指標都維持在設定的最高使用率限制以下。
系統會根據您選擇的負載平衡演算法,在後端之間進行負載平衡;舉例來說,預設
WATERFALL_BY_REGION
演算法會盡量讓所有後端以相同的飽和度運作。WEIGHTED_ROUND_ROBIN
負載平衡地區政策。後端服務的負載平衡地區政策必須設為WEIGHTED_ROUND_ROBIN
。完成這項設定後,負載平衡器也會根據自訂指標,在後端選取最適合的執行個體或端點來處理要求。
設定自訂指標
如要讓應用程式負載平衡器使用自訂指標,請執行下列操作:
- 決定要使用的自訂指標。
- 設定後端,向負載平衡器回報自訂指標。您必須建立資料串流,以便傳送至負載平衡器,用於負載平衡。這些指標必須編譯並編碼至 ORCA 負載報表,然後使用 HTTP 回應標頭向負載平衡器回報。
- 設定負載平衡器,以使用後端回報的自訂指標值。
決定自訂指標
這個步驟非常主觀,取決於應用程式的需求。決定要使用的指標後,您還必須為每個指標設定最高用量門檻。舉例來說,如果您想使用記憶體用量做為指標,也必須為每個後端判斷記憶體用量上限閾值。
繼續設定負載平衡器之前,請務必先詳閱自訂指標的運作方式一節,瞭解可用的自訂指標類型 (保留和具名),以及指標選取條件。
設定後端,向負載平衡器回報指標
使用 ORCA 標準時,自訂指標會做為應用程式後端每個 HTTP 回應的一部分,回報給負載平衡器。
使用 Google Kubernetes Engine 時,您也可以選擇使用負載平衡器的自訂指標。
本節說明如何在 ORCA 負載報告中編譯自訂指標,並在傳送至負載平衡器的每個 HTTP 回應標頭中回報這些指標。
舉例來說,如果您使用 HTTP 文字編碼,標頭必須以以下格式回報指標。
endpoint-load-metrics: TEXT BACKEND_METRIC_NAME_1=BACKEND_METRIC_VALUE_1,BACKEND_METRIC_NAME_2=BACKEND_METRIC_VALUE_2
無論使用哪種編碼格式,建立載入報表時,請務必從指標名稱中移除 orca.
前置字串。
以下程式碼片段說明如何將兩個自訂指標 (customUtilA
和 customUtilB
) 附加至 HTTP 標頭。這段程式碼片段會顯示原生 HTTP 文字編碼和 Base64 編碼。請注意,為求簡單,這個範例只會硬式編碼 customUtilA
和 customUtilB
的值。負載平衡器會收到您判斷會影響負載平衡的指標值。
...
type OrcaReportType int
const (
OrcaText OrcaReportType = iota
OrcaBin
)
type HttpHeader struct {
key string
value string
}
const (
customUtilA = 0.2
customUtilB = 0.4
)
func GetBinOrcaReport() HttpHeader {
report := &pb.OrcaLoadReport{
NamedMetrics: map[string]float64{"customUtilA": customUtilA, "customUtilB": customUtilB}}
out, err := proto.Marshal(report)
if err != nil {
log.Fatalf("failed to serialize the ORCA proto: %v", err)
}
return HttpHeader{"endpoint-load-metrics-bin", base64.StdEncoding.EncodeToString(out)}
}
func GetHttpOrcaReport() HttpHeader {
return HttpHeader{
"endpoint-load-metrics",
fmt.Sprintf("TEXT named_metrics.customUtilA=%.2f,named_metrics.customUtilB=%.2f",
customUtilA, customUtilB)}
}
func GetOrcaReport(t OrcaReportType) HttpHeader {
switch t {
case OrcaText:
return GetHttpOrcaReport()
case OrcaBin:
return GetBinOrcaReport()
default:
return HttpHeader{"", ""}
}
}
...
設定負載平衡器以使用自訂指標
如要讓負載平衡器在選取後端時使用這些自訂指標,請將每個後端的平衡模式設為 CUSTOM_METRICS
。此外,如要讓自訂指標也影響端點選取作業,請將負載平衡地區政策設為 WEIGHTED_ROUND_ROBIN
。
本節所述步驟假設您已部署負載平衡器,並使用區域 NEG 後端。不過,您可以使用這裡示範的相同 --custom-metrics
標記,透過 gcloud compute backend-services update
指令更新任何現有後端。
將後端新增至後端服務時,您可以將後端的平衡模式設為
CUSTOM_METRICS
。您可以使用--custom-metrics
旗標指定自訂指標和門檻,以用於負載平衡決策。gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --network-endpoint-group=NEG_NAME \ --network-endpoint-group-zone=NEG_ZONE \ [--global | region=REGION] \ --balancing-mode=CUSTOM_METRICS \ --custom-metrics='name="BACKEND_METRIC_NAME_1",maxUtilization=MAX_UTILIZATION_FOR_METRIC_1' \ --custom-metrics='name="BACKEND_METRIC_NAME_2",maxUtilization=MAX_UTILIZATION_FOR_METRIC_2'
更改下列內容:
BACKEND_SERVICE_NAME
:後端服務的名稱NEG_NAME
:區域或混合式 NEG 的名稱NEG_ZONE
:建立 NEG 的可用區REGION
:區域性負載平衡器建立所在的區域BACKEND_METRIC_NAME
:這裡使用的自訂指標名稱必須與後端 ORCA 報表回報的自訂指標名稱相符MAX_UTILIZATION_FOR_METRIC
:負載平衡演算法必須針對每項指標達成的最高使用率
舉例來說,如果後端回報兩個自訂指標 (如「設定後端,向負載平衡器回報指標」一節所示),您可以使用下列指令,設定負載平衡器使用這些指標:
customUtilA
customUtilB
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --network-endpoint-group=NEG_NAME \ --network-endpoint-group-zone=NEG_ZONE \ [--global | region=REGION] \ --balancing-mode=CUSTOM_METRICS \ --custom-metrics='name="customUtilA",maxUtilization=0.8' \ --custom-metrics='name="customUtilB",maxUtilization=0.9'
或者,您也可以在結構化 JSON 檔案中提供自訂指標清單:
{ "name": "METRIC_NAME_1", "maxUtilization": MAX_UTILIZATION_FOR_METRIC_1, "dryRun": true } { "name": "METRIC_NAME_2", "maxUtilization": MAX_UTILIZATION_FOR_METRIC_2, "dryRun": false }
然後將 JSON 格式的指標檔案附加至後端,如下所示:
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --network-endpoint-group=NEG_NAME \ --network-endpoint-group-zone=NEG_ZONE \ [--global | region=REGION] \ --balancing-mode=CUSTOM_METRICS \ --custom-metrics-file='BACKEND_METRIC_FILE_NAME'
如要測試指標是否會回報,但不想實際影響負載平衡器,可以在設定指標時將
dryRun
旗標設為true
,如下所示:gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --network-endpoint-group=NEG_NAME \ --network-endpoint-group-zone=NEG_ZONE \ [--global | region=REGION] \ --balancing-mode=CUSTOM_METRICS \ --custom-metrics 'name="BACKEND_METRIC_NAME",maxUtilization=MAX_UTILIZATION_FOR_METRIC,dryRun=true'
如果將指標的
dryRun
設為true
,系統會將指標回報給 Monitoring,但負載平衡器不會實際使用該指標。如要還原這項設定,請將
dryRun
旗標設為false
,然後更新後端服務。gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \ --network-endpoint-group=NEG_NAME \ --network-endpoint-group-zone=NEG_ZONE \ [--global | region=REGION] \ --balancing-mode=CUSTOM_METRICS \ --custom-metrics 'name="BACKEND_METRIC_NAME",maxUtilization=MAX_UTILIZATION_FOR_METRIC_,dryRun=false'
如果所有自訂指標都設為
dryRun
,則將平衡模式設為CUSTOM_METRICS
或將負載平衡地區政策設為WEIGHTED_ROUND_ROBIN
,對負載平衡器沒有影響。true
如要設定負載平衡器,使其根據自訂指標選取端點,請將後端服務負載平衡區域政策設為
WEIGHTED_ROUND_ROBIN
。舉例來說,如果您已為後端服務設定適當的後端,請按照下列步驟設定負載平衡區域性政策:
gcloud compute backend-services update BACKEND_SERVICE_NAME \ [--global | region=REGION] \ --custom-metrics='name=BACKEND_SERVICE_METRIC_NAME,dryRun=false' \ --locality-lb-policy=WEIGHTED_ROUND_ROBIN
如先前所示,您也可以在後端服務層級的結構化 JSON 檔案中,提供自訂指標清單。使用
--custom-metrics-file
欄位將指標檔案附加至後端服務。