Citrix ADC ingress controller

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

Kubernetes展開では、Ingress Citrix ADCが提供するレート制限機能を使用して 、バックエンドサーバーまたはサービス上のリソースへの要求をレート制限できます。

Citrixでは、 レート制限CRDと呼ばれるKubernetes CustomResourceDefinition (CRD )を提供しています。このCRDは、Citrix ingress controller で使用して、イングレスデバイスとして使用されるCitrix ADCのレート制限構成を構成できます。

Kubernetes 環境でサービスへのリクエストをレート制限する以外に、API セキュリティのためにレート制限 CRD を使用することもできます。レート制限 CRD を使用すると、REST API リクエストを API サーバーまたは API サーバー上の特定の API エンドポイントに制限できます。API サーバーまたはエンドポイントへのリクエストをタイムスライスごとに許可された制限に照らして監視および追跡し、DDoS 攻撃などの攻撃から保護します。

レートリミット CRD を使用して、可観測性のためのロギングを有効にできます。ログはCitrix ADCに保存され、シェルコマンドを使用してログを確認することで表示できます。ファイルの場所は Syslog 設定に基づきます。例:/var/logs/ns.log

レートリミット CRD の定義

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

レート制限 CRD 属性

次の表に、Rate Limit CRD で提供されるさまざまな属性を示します。

CRD 属性 説明
servicename レート制限ポリシーを適用する Kubernetes サービスのリスト。
selector_keys トラフィックをフィルタリングして、スロットリングが適用および監視される API リクエストを識別するトラフィックセレクタキー。
  注:selector_keys はオプションの属性です。0、1 つまたは複数のセレクタキーを設定できます。複数のセレクタキーが設定されている場合、そのセレクタキーは論理 AND 式と見なされます。
  このバージョンの Rate Limit CRD には、 selector_keysbasic設定セクションを提供し、設定されている制限を監視および抑制するキーとして、一般的に使用される次のトラフィック特性を設定できます。
  path: 特定の API エンドポイントを参照する URL パスプレフィックスの配列。例:/api/v1/products/
  method: HTTP メソッドの配列。許可される値は、GET、PUT、POST、または削除です。
  header_name: 一意の API クライアントまたはユーザー識別子を持つ HTTP ヘッダー。たとえば、X-apikeyにはリクエストを送信する API クライアントを識別する一意の API キーが付属しています。
  per_client_ip: 一意のクライアント IP アドレスごとに受信した各 API リクエストに対して、設定されたしきい値を監視して適用できます。
req_threshold 指定されたタイムスライス (リクエストレート数) で許可されるリクエストの最大数。
timeslice マイクロ秒(10 秒の倍数)で指定された時間間隔。この間、設定された制限に対して要求が監視されます。指定しない場合、デフォルトは 1000 ミリ秒になります。
limittype 制限を適用するために使用するスロットリングアルゴリズムのタイプを構成できます。サポートされているアルゴリズムはバーストとスムースです。 デフォルトはバーストモードです
throttle_action これにより、設定されたしきい値を超えるためにスロットリングされるトラフィックに対して実行する必要のあるスロットルアクションを定義できます。
  定義できるスロットルアクションを次に示します。
  DROP: 設定されたトラフィック制限を超えるリクエストをドロップします
  RESET: 設定された制限を超えるリクエストの接続をリセットします
  REDIRECT:redirect_url設定されているにトラフィックをリダイレクトします。
  RESPOND: 標準の「429 リクエストが多すぎます」レスポンスで応答します。
redirect_url この属性はオプションの属性で、throttle_actionREDIRECTの値を使用して設定されている場合にのみ必要です 。
logpackets 監査ログを有効にします。
logexpression ログメッセージの形式と内容を定義するデフォルトの構文式を指定します。
loglevel 生成されるログメッセージの重大度を指定します。

レート制限 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
    

レートベースのポリシー設定の書き方

Citrix が提供する CRD を Kubernetes クラスターに展開したら、 レートベースのポリシー構成を.yamlファイルに定義できます。.yamlファイルのkindフィールドでratelimitを使用し、specセクションで、ポリシー設定の要件に基づいて、Rate limit CRD 属性を追加します。

.yaml ファイルを展開すると、Citrix イングレスコントローラーは Ingress Citrix ADC デバイスにレートベースのポリシー構成を適用します。

レート制限ポリシーの設定例をいくつか示します。

API リクエストを設定済みの API エンドポイントプレフィックスに制限する

Citrix ADCでレートベースのポリシーを定義して、一意のクライアント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
  req_threshold: 15
  timeslice: 60000
  throttle_action: "RESPOND"
  logpackets:
    logexpression: "http.req.url"
    loglevel: "INFORMATIONAL"
<!--NeedCopy-->

注:

異なるレート制限設定を必要とする異なるパスに対して、複数の Kubernetes オブジェクトを起動できます。

ポリシー設定を定義したら、以下のコマンドを使用して.yamlファイルを展開します。

root@master:~#kubectl create -f ratelimit-example1.yaml
ratelimit.citrix.com/throttle-req-per-clientip created

Citrix ingress controller は、Ingress Citrix ADC デバイスにポリシー構成を適用します。

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

Citrix ADC でレートベースのポリシーを定義して、API 要求(GET または POST)を、HTTP ヘッダーX-API-Keyを使用して識別された各 API クライアントからカレンダー 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"
  req_threshold: 5
  throttle_action: "RESPOND"
  logpackets:
    logexpression: "rate exceeded, you may want to configure higher limit"
    loglevel: "INFORMATIONAL"
<!--NeedCopy-->

ポリシー設定を定義したら、以下のコマンドを使用して.yamlファイルを展開します。

root@master:~#kubectl create -f ratelimit-example2.yaml
ratelimit.citrix.com/throttle-req-per-clientip created

Citrix ingress controller は、Ingress Citrix ADC デバイスにポリシー構成を適用します。

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