← 返回上一頁
Kubernetes

零程式碼改動!用 Easegress 為 Kubernetes Gateway API 加上熔斷、限流與重試

本頁目錄
Easegress 架構圖 - Cloud Native 流量編排系統

前言

之前聊過 Easegress 搭配 Kubernetes Gateway API 的基本玩法,這次想更進一步,分享一下怎麼在完全不動程式碼的前提下,光靠設定檔就能幫 K8s Gateway API 加上熔斷、限流、重試等進階功能。對我來說,這才是 Easegress 最吸引人的地方。

本文重點:不改任何一行程式碼,就讓 Kubernetes Gateway API 擁有彈力容錯(Resilience)的能力。

K8s Gateway API 為什麼需要被增強?

Easegress 本身就有很完整的彈性容錯機制,像是熔斷(Circuit Breaker)、限流(Rate Limiting)、重試(Retry)等等,這些都能有效保護後端服務。但如果你看目前 Kubernetes Gateway API 的標準規範,它主要聚焦在流量轉發、負載平衡、重新導向這些基本功能,對於後端服務的「保護」機制其實還沒有明確定義。

所以問題來了:怎麼讓 Gateway API 也具備這些保護能力?答案就是透過 Easegress 的擴充機制。

Easegress 架構一覽

先看一下 Easegress 整體的架構設計:

Easegress 架構圖 - Cloud Native 流量編排系統
Easegress 架構圖(來源:easegress-io/easegress GitHub)

關鍵機制:ExtensionRef

Kubernetes Gateway API 提供了一個叫做 ExtensionRef 的擴充點,讓你可以在 HTTPRoute 裡面引用叢集中的自訂資源。這就是 Easegress 跟 Gateway API 之間的「黏合劑」。以下是一個 HTTPRoute 設定範例:

欄位 說明
apiVersion gateway.networking.k8s.io/v1 Gateway API 版本
kind HTTPRoute 路由類型
filters.type ExtensionRef 使用擴充引用
extensionRef.group easegress.megaease.com Easegress 資源群組
extensionRef.kind FilterSpec 自訂資源種類
extensionRef.name rate-limiter 引用的限流器名稱

Easegress Gateway Controller 會辨識這些 ExtensionRef 設定,並自動轉換成對應的 Easegress 組態,讓 HTTPRoute 瞬間擁有限流能力。

透過 CRD 整合 Easegress 功能

為了讓 Easegress 的進階功能跟 Kubernetes 無縫整合,我們會用 Custom Resource Definition(CRD)來定義擴充資源。相比直接用 ConfigMap,CRD 的影響範圍更小、彈性也更好。

CRD 只保留三個核心屬性:

屬性 說明
name Filter 的名稱(所有 Easegress Filter 通用)
kind Filter 的類型(例如 RateLimiter、CircuitBreaker)
spec Filter 的具體 YAML 配置

這樣的設計兼顧了相容性與簡潔性。

實戰:限流器 + 響應修改器

接下來用兩個實際的 Filter 來示範:RateLimiter(限流器)ResponseAdaptor(響應修改器)

建立 FilterSpec 資源

限流器的設定:每 5 秒只允許 1 個請求通過。

設定項 意義
kind RateLimiter 限流器類型
limitRefreshPeriod 5000ms 限流重置週期
limitForPeriod 1 週期內允許請求數
url prefix / 套用到所有路徑

響應修改器的設定:在 HTTP 回應中加上自訂 Header。

設定項
kind ResponseAdaptor
header.add X-Eg-Response-Adaptor: "true"

在 HTTPRoute 中引用

建立 HTTPRoute 時,只需要在 filters 區塊用 ExtensionRef 分別引用上面建立的限流器和響應修改器,Easegress Gateway Controller 就會自動把對應的能力掛載進去。

測試驗證

在 minikube 環境中,把 Gateway 的連接埠對應到 nodePort 30081,然後用 curl 測試:

請求次序 HTTP 狀態碼 特殊 Header 說明
第一次請求 200 OK X-Eg-Response-Adaptor: true ResponseAdaptor 生效,正常回應
第二次請求(5 秒內) 429 Too Many Requests X-Eg-Rate-Limiter: too-many-requests RateLimiter 生效,請求被限流

結果很清楚:第一次請求正常回應且多了自訂 Header,第二次在限流週期內的請求直接被擋下回傳 429。

進階:熔斷器與重試策略

除了限流和響應修改,Easegress 當然也支援更進階的彈性容錯機制:

Filter 類型 關鍵設定 說明
CircuitBreaker(熔斷器) slidingWindowType: TIME_BASED, failureRateThreshold: 60, slidingWindowSize: 200 基於時間窗口的熔斷,失敗率超過 60% 就觸發
Retry(重試) maxAttempts: 3, waitDuration: 500ms 最多重試 3 次,每次間隔 500 毫秒

這些都可以透過同樣的 CRD + ExtensionRef 機制掛載到任何 HTTPRoute 上。

小結

透過 Easegress 的 Gateway Controller 搭配 Kubernetes Gateway API 的 ExtensionRef 擴充點,我們可以在不修改任何程式碼的情況下,輕鬆為 Gateway API 加上限流、熔斷、重試、響應修改等進階功能。這種做法的好處是:設定即功能,維護成本低,而且完全符合 Kubernetes 的聲明式管理哲學。

參考資源

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料