マイクロサービスでは、サービス間の通信にRate Limitを設けることで、一部のサービスが過負荷となっても他のサービスに影響を与えないようにすることが一般的です。
IstioではRate Limitの手段として幾つか選択肢がありますが、より細かな制御を行いたい場合には、EnvoyFilterを使います。
EnvoyFilterとは?
EnvoyFilterはIstioで提供されているカスタムリソース定義(CRD)の一つで、Envoyプロキシの挙動を詳細に制御することができます。Rate Limitの設定以外にも、HTTPリクエストやレスポンスのヘッダーの操作、トラフィックのルーティングの調整などが可能です。
処理フローは以下のようになります。
(外部からのリクエストはIstio Ingress Gatewayを介します)
リクエストはRate Limit ServiceにてPolicyに適合しているか判定され、OKならアプリへ転送、NGなら429 Too Many Requestsが返されます。
制限の適用範囲としては、メッシュ全体を対象とするGlobalと、Pod単位を対象とするLocalの2種類があります。
Istio Bookinfoのratingsに対するRate Limit設定
具体的な設定例として、IstioのサンプルアプリケーションであるBookinfoに対して、ratingsサービスへの制限をかけます。(Local Rate Limit)
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: ratings-ratelimit
namespace: default
spec:
workloadSelector:
labels:
app: ratings
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
portNumber: 8080
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.local_ratelimit
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit"
stat_prefix: http_local_rate_limiter
token_bucket:
max_tokens: 10
tokens_per_fill: 10
fill_interval: 60s
この設定では、ratingsサービス(workloadSelector.labels.app: ratings
)に対して、1分間に最大10回のリクエストを許可します。