應用程式負載平衡器的自訂指標

本頁說明如何搭配應用程式負載平衡器使用自訂指標。您可以根據應用程式或基礎架構需求專屬的指標,而非 Google Cloud的標準使用率或以速率為準的指標,設定負載平衡器的流量分配行為。定義負載平衡器的自訂指標,可彈性地將應用程式要求轉送至最適合工作負載的後端執行個體和端點。

如果是 GKE,您也可以使用來自所執行服務或應用程式的自訂指標。詳情請參閱「公開自訂指標」。

負載平衡器會根據自訂指標值做出下列決策:

  1. 選取要接收流量的後端虛擬機器 (VM) 執行個體群組或網路端點群組。
  2. 選取要接收流量的 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_utilizationcpu_utilizationapplication_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 (每秒錯誤數)
  • 使用率指標,優先順序如下:
    1. orca.application_utilization
    2. orca.cpu_utilization
    3. orca.named_metrics 地圖中的使用者定義指標

限制和規定

  • 每個後端最多可有兩個自訂指標。不過,您最多可以對三個自訂指標執行 dryRun 測試

    如果提供兩項指標,負載平衡器會分別處理。 舉例來說,如果您定義兩個維度:custom-metric-util1custom-metric-util2,負載平衡器會分別處理這兩個維度。如果後端在 custom-metric-util1 方面以高使用率運作,負載平衡器會避免將流量傳送至這個後端。一般來說,負載平衡器會盡量讓所有後端以大致相同的飽和度運作。完整度的計算方式為 currentUtilization / maxUtilization。在這種情況下,負載平衡器會使用這兩項指標回報的較高飽和度值,做出負載平衡決策。

  • 每個後端服務最多可有兩個自訂指標。不過,您最多可以對三個自訂指標執行 dryRun 測試。這項限制不包括必要指標 orca.epsorca.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-binendpoint-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。完成這項設定後,負載平衡器也會根據自訂指標,在後端選取最適合的執行個體或端點來處理要求。

設定自訂指標

如要讓應用程式負載平衡器使用自訂指標,請執行下列操作:

  1. 決定要使用的自訂指標。
  2. 設定後端,向負載平衡器回報自訂指標。您必須建立資料串流,以便傳送至負載平衡器,用於負載平衡。這些指標必須編譯並編碼至 ORCA 負載報表,然後使用 HTTP 回應標頭向負載平衡器回報。
  3. 設定負載平衡器,以使用後端回報的自訂指標值。

決定自訂指標

這個步驟非常主觀,取決於應用程式的需求。決定要使用的指標後,您還必須為每個指標設定最高用量門檻。舉例來說,如果您想使用記憶體用量做為指標,也必須為每個後端判斷記憶體用量上限閾值。

繼續設定負載平衡器之前,請務必先詳閱自訂指標的運作方式一節,瞭解可用的自訂指標類型 (保留和具名),以及指標選取條件。

設定後端,向負載平衡器回報指標

使用 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. 前置字串。

以下程式碼片段說明如何將兩個自訂指標 (customUtilAcustomUtilB) 附加至 HTTP 標頭。這段程式碼片段會顯示原生 HTTP 文字編碼和 Base64 編碼。請注意,為求簡單,這個範例只會硬式編碼 customUtilAcustomUtilB 的值。負載平衡器會收到您判斷會影響負載平衡的指標值。

...
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 指令更新任何現有後端。

  1. 將後端新增至後端服務時,您可以將後端的平衡模式設為 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:負載平衡演算法必須針對每項指標達成的最高使用率

    舉例來說,如果後端回報兩個自訂指標 (如「設定後端,向負載平衡器回報指標」一節所示),您可以使用下列指令,設定負載平衡器使用這些指標:customUtilAcustomUtilB

    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

  2. 如要設定負載平衡器,使其根據自訂指標選取端點,請將後端服務負載平衡區域政策設為 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 欄位將指標檔案附加至後端服務。

後續步驟