NetScalerを使用したKubernetesでのレート制限

最終公開日 : Oct 02, 2026
Kubernetesデプロイメントでは、イングレスNetScalerが提供するレート制限機能を使用して、バックエンドサーバーまたはサービス上のリソースへのリクエストをレート制限できます。
NetScalerは、レート制限CRDと呼ばれるKubernetesのCustomResourceDefinitions (CRD) を提供します。これはNetScaler Ingress Controllerと組み合わせて使用​​して、イングレスデバイスとして使用されるNetScaler上でレート制限設定を構成できます。
Kubernetes環境内のサービスへのリクエストをレート制限するだけでなく、APIセキュリティのためにもレート制限CRDを使用できます。レート制限CRDを使用すると、APIサーバーまたはAPIサーバー上の特定のAPIエンドポイントへのREST APIリクエストを制限できます。これは、APIサーバーまたはエンドポイントへのリクエストを、タイムスライスあたりの許可された制限に対して監視および追跡し、DDoS攻撃などの攻撃から保護します。
レート制限CRDで可観測性のためのロギングを有効にできます。ログはNetScalerに保存され、シェルコマンドを使用してログを確認することで表示できます。ファイルの場所はsyslog設定に基づいています。例: /var/logs/ns.log。

レート制限CRDの定義

レート制限CRDの仕様は、NetScaler Ingress ControllerのGitHubリポジトリのratelimit-crd.yamlで入手できます。レート制限CRDは、APIゲートウェイとして機能するイングレスNetScaler上でレート制限ポリシーを定義するために必要なさまざまなオプションの属性を提供します。

レート制限CRDの属性

注:
NetScaler Ingress Controller 4.2.26以降のリリースでは、ratelimit CRDスキーマの属性は、ratelimits仕様の下に更新されました。また、新しいレート制限属性が導入されました。以前のリリースでは、ratelimit CRDスキーマはspecの下に直接定義されていました。
次の表に、レート制限CRDで提供されるさまざまな属性を示します。
CRD属性 説明
ingressclass イングレスクラスを指定します。これにより、指定されたイングレスクラスに関連付けられたイングレスコントローラーのみがリソースを処理します。そうでない場合、クラスター内のすべてのコントローラーがこのリソースを処理します。
servicenames レート制限ポリシーを適用するKubernetesサービスのリスト。
selector_keys スロットリングが適用され監視されるAPIリクエストを識別するためにトラフィックをフィルタリングするトラフィックセレクターキー。
注: selector_keys はオプションの属性です。セレクターキーを0個、1個、または複数設定できます。複数のセレクターキーが設定されている場合、それらは論理AND式として扱われます。
このバージョンのレート制限CRDでは、selector_keys は basic 設定セクションを提供し、設定された制限が監視およびスロットリングされるキーとして、以下の一般的に使用されるトラフィック特性を設定できます。
path: 特定のAPIエンドポイントを参照するURLパスプレフィックスの配列。例: /api/v1/products/。
method: HTTPメソッドの配列。許可される値は、GET、PUT、POST、DELETE、HEAD、OPTIONS、TRACE、CONNECT、PATCH、または UNKNOWN_METHOD です。
header_name: 一意のAPIクライアントまたはユーザー識別子を持つHTTPヘッダー。例: X-apikey。これは、リクエストを送信するAPIクライアントを識別する一意のAPIキーとともに提供されます。
per_client_ip: 一意のクライアントIPアドレスごとに受信される各APIリクエストに対して、設定されたしきい値を監視および適用できます。
ratelimits 制限と、制限を超過した場合に実行するアクションを定義するレート制限設定のリスト。この属性は、制限が適用されるトラフィックのみを選択する selector_keys とは別です。各エントリでサポートされる属性については、ratelimits attributes を参照してください。
streams 可観測性のためのトラフィック分析と追跡を収集するために使用されるストリーム識別子設定のリスト。各ストリーム識別子でサポートされる属性については、Stream identifier attributes を参照してください。
注:
ratelimits または streams の少なくともいずれか1つを指定する必要があります。

ratelimits 属性

次の表に、ratelimits リストの各エントリで構成できる属性を示します。req_threshold 属性は必須です。
CRD 属性 説明
req_threshold 指定されたタイムスライスで許可されるリクエストの最大数(リクエストレート)。この属性は必須です。
timeslice 設定された制限に対してリクエストが監視される、ミリ秒単位(10の倍数)で指定された時間間隔。指定しない場合、デフォルトは1000ミリ秒です。
limittype 制限を適用するために使用するスロットリングアルゴリズムのタイプを設定できます。サポートされているアルゴリズムは BURSTY と SMOOTH です。デフォルトは SMOOTH です。
mode 制限が適用されるメトリック。許可される値は REQUEST_RATE、CONNECTION、および TOKEN_RATE です。AI バックエンドのトークンベースのレート制限を適用するには、TOKEN_RATE を使用します。
alertsintimeslice タイムスライス内で発生させるアラートの数。
throttle_action 設定されたしきい値を超過してスロットルされたトラフィックに対して実行する必要があるスロットルアクションを定義できます。
定義できるスロットルアクションは次のとおりです。
DROP: 設定されたトラフィック制限を超過したリクエストをドロップします。
RESET: 設定された制限を超過したリクエストの接続をリセットします。
REDIRECT: トラフィックを設定されたredirect_urlにリダイレクトします。
RESPOND: 標準の「429 Too many requests」応答で応答します。
NOOP: 設定された制限を超過したリクエストに対してアクションを実行しません。
redirect_url この属性はオプションの属性であり、throttle_actionが値REDIRECTで設定されている場合にのみ必要です。
logpackets 監査ログを有効にします。これにはlogexpressionとloglevelの属性が含まれており、logpacketsが使用される場合、これら両方が必須です。
logexpression ログメッセージの形式と内容を定義するデフォルト構文式を指定します。
loglevel 生成されるログメッセージの重大度レベルを指定します。

ストリーム識別子属性

次の表に、streams リストの各エントリで構成できる属性を示します。sort 属性は必須です。
CRD属性 説明
interval リクエスト数、帯域幅、応答時間などのセッション統計を計算する際に使用するデータの分数。サポートされる範囲は1~10080です。
sampleCount 評価のためにリクエストを選択するサンプルのサイズ。すべてのリクエストを評価するには、サンプル数を1に設定します。サポートされる範囲は1~65535です。
sort 指定された統計列で、保存されたレコードを降順にソートします。許可される値は、REQUESTS (デフォルト)、CONNECTIONS、RESPTIME、BANDWIDTH、RESPTIME_BREACHES、TOKENS、および NONE です。この属性は必須です。
snmpTrap ストリーム識別子のSNMPトラップを有効または無効にします。許可される値は ENABLED と DISABLED です。
appflowLog ストリーム識別子のAppFlow®ロギングを有効または無効にします。許可される値は ENABLED と DISABLED です。
trackAckOnlyPackets ACKのみのパケットを追跡します。パケットレート制限が使用されている場合にのみ適用されます。許可される値はENABLEDとDISABLEDです。
trackTransactions 設定されたしきい値を超えるトランザクションを追跡します。許可される値はRESPTIME、TOKENS、およびNONEです。TOKENSに設定されている場合、トランザクションしきい値属性は適用されません。
maxTransactionThreshold 追跡されるメトリックのトランザクションごとの最大値。最小値は0です。
minTransactionThreshold 追跡されるメトリックのトランザクションごとの最小値。最小値は0です。
acceptanceThreshold 違反しないトランザクションの総トランザクションに対する比率をパーセンテージで表したもの。最大6桁の小数点以下がサポートされています。
breachThreshold 間隔で計算された違反トランザクションのしきい値。最小値は0です。
log 識別子で収集されたオブジェクトがログに記録される場所。許可される値はSYSLOGとNONEです。
logInterval 収集されたオブジェクトをログに記録する時間間隔(分)。ストリーム識別子の間隔以上である必要があります。サポートされる範囲は1~10080です。
logLimit ログ間隔でログに記録されるオブジェクトの最大数。サポートされる範囲は1~1000です。

レート制限CRDを展開する

レート制限CRDを展開するには、以下を実行します。
  1. CRD (ratelimit-crd.yaml) をダウンロードします。
  2. 次のコマンドを使用してレート制限CRDを展開します。
    kubectl create -f ratelimit-crd.yaml
    例:
    root@master:~# kubectl create -f ratelimit-crd.yaml

    customresourcedefinition.apiextensions.k8s.io/ratelimits.citrix.com created

    root@master:~# kubectl get crd

    NAME CREATED AT
    ratelimits.citrix.com 2019-08-27T01:06:30Z

レートベースのポリシー構成の記述方法

KubernetesクラスターにNetScalerが提供するCRDを展開した後、レートベースのポリシー構成を.yamlファイルで定義できます。.yamlファイルでは、kindフィールドでratelimitを使用し、specセクションでポリシー構成の要件に基づいてレート制限CRD属性を追加します。
.yamlファイルを展開すると、NetScaler Ingress ControllerはIngress NetScalerデバイスにレートベースのポリシー構成を適用します。
以下は、レート制限ポリシー構成のいくつかの例です。

構成されたAPIエンドポイントプレフィックスへのAPIリクエストを制限する

NetScalerで、各一意のクライアントIPアドレスから構成されたAPIエンドポイントプレフィックスへのAPIリクエストを1分あたり15リクエストに制限するレートベースのポリシーを定義したいシナリオを考えてみましょう。ratelimit-example1.yamlという名前の.yamlファイルを作成し、適切なCRD属性を使用してレートベースのポリシーを次のように定義します。
apiVersion: citrix.com/v1beta1
kind: ratelimit
metadata:
  name: throttle-req-per-clientip
spec:
  servicenames:
    - frontend
  selector_keys:
   basic:
    path:
     - "/api/v1/products"
     - "/api/v1/orders/"
    per_client_ip: true
  ratelimits:
    - req_threshold: 15
      timeslice: 60000
      throttle_action: "RESPOND"
      logpackets:
        logexpression: "http.req.url"
        loglevel: "INFORMATIONAL"
注:
異なるレート制限設定を必要とする異なるパスに対して、複数のKubernetesオブジェクトを起動できます。
ポリシー設定を定義したら、次のコマンドを使用して.yamlファイルをデプロイします。
root@master:~#kubectl create -f ratelimit-example1.yaml
ratelimit.citrix.com/throttle-req-per-clientip created
NetScaler Ingress Controllerは、Ingress NetScalerデバイスにポリシー設定を適用します。

カレンダーAPIへのAPIリクエストを制限する

NetScalerでレートベースのポリシーを定義し、HTTPヘッダーX-API-Keyを使用して識別される各APIクライアントからのAPIリクエスト(GETまたはPOST)をカレンダーAPIに対して5つに制限するシナリオを考えてみましょう。ratelimit-example2.yamlという名前の.yamlファイルを作成し、適切なCRD属性を使用してレートベースのポリシーを次のように定義します。
apiVersion: citrix.com/v1beta1
kind: ratelimit
metadata:
  name: throttle-calendarapi-perapikey
spec:
  servicenames:
    - frontend
  selector_keys:
    basic:
      path:
        - "/api/v1/calender"
      method:
        - "GET"
        - "POST"
      header_name: "X-API-Key"
  ratelimits:
    - req_threshold: 5
      throttle_action: "RESPOND"
      logpackets:
        logexpression: "rate exceeded, you may want to configure higher limit"
        loglevel: "INFORMATIONAL"
ポリシー設定を定義したら、次のコマンドを使用して.yamlファイルをデプロイします。
root@master:~#kubectl create -f ratelimit-example2.yaml
ratelimit.citrix.com/throttle-req-per-clientip created
NetScaler Ingress Controllerは、Ingress NetScalerデバイスにポリシー設定を適用します。