Connectivity Link を使用した Gateway ポリシーの設定およびデプロイ
OpenShift での API のセキュリティー、保護、接続
概要
はじめに リンクのコピーリンクがクリップボードにコピーされました!
Red Hat ドキュメントへのフィードバック
製品ドキュメントに関するご意見をお寄せください。
改善を提案するには、Jira 課題を作成し、変更案を説明してください。ドキュメントチームがご要望に迅速に対応できるよう、できるだけ詳細にご記入ください。
前提条件
- Red Hat カスタマーポータルのアカウントがある。このアカウントを使用すると、Red Hat Jira Software インスタンスにログインできます。アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- Create issue にアクセスします。
- Summary テキストボックスに、問題の簡単な説明を入力します。
Description テキストボックスに、次の情報を入力します。
- 問題が見つかったページの URL。
- 問題の詳細情報。他のフィールドは、そのままデフォルト値にできます。
- Reporter フィールドに Jira ユーザー名を入力します。
- Create をクリックして、Jira 課題をドキュメントチームに送信します。
フィードバックをご提供いただきありがとうございました。
第1章 Connectivity Link を使用した OpenShift 上の API のセキュリティー、保護、接続 リンクのコピーリンクがクリップボードにコピーされました!
このガイドでは、OpenShift で Connectivity Link を使用して、Kubernetes Gateway API をベースとするゲートウェイによって公開される API をセキュアにし、保護および接続する方法を説明します。ここで説明される内容は、単一の OpenShift クラスターにデプロイされたゲートウェイ、または共有 HTTPS リスナーのホスト名を持つ複数の OpenShift クラスターに分散されたゲートウェイに対応しています。このガイドでは、プラットフォームエンジニアとアプリケーション開発者のユーザーロールで、目標を達成するためにどのように Connectivity Link を使用できるかを説明します。
1.1. マルチクラスター環境で Connectivity Link が実行できること リンクのコピーリンクがクリップボードにコピーされました!
Connectivity Link は、単一または複数の OpenShift クラスターで活用できます。次の機能は、シングルクラスター環境だけでなく、複数のクラスター間でも機能するように設計されています。
-
マルチクラスター Ingress: Connectivity Link は、
DNSPolicyに定義されたストラテジーを使用してトラフィックをゲートウェイに誘導するために、DNS を使用してマルチクラスター Ingress 接続を提供します。 -
グローバル流量制御: Connectivity Link は、
RateLimitPolicyで定義された制限に基づいてカウンターに共有 Redis または Dragonfly ストアを使用するように設定した場合の、グローバルな流量制御ユースケースに対応しています。 -
グローバル認証: 外部認証プロバイダーを利用するように Connectivity Link
AuthPolicyを設定して、異なるクラスターが同じ API の認証および認可を同じように公開できます。 -
TLS 証明書の自動生成: cert-manager および ACME プロバイダー (Let's Encrypt など) との統合を使用して、Gateway リスナーホストに基づき TLS 証明書を自動的にプロビジョニングするように、
TLSPolicyを設定します。 - フェデレーションされたメトリクスストアとの統合: Connectivity Link には、ゲートウェイを可視化し、複数のクラスターをまたいでゲートウェイに到達するトラフィックを観測するためのダッシュボードとメトリクスのサンプルがあります。
1.2. ユーザーロールのワークフロー リンクのコピーリンクがクリップボードにコピーされました!
- プラットフォームエンジニア: このガイドでは、ゲートウェイのデプロイ方法を説明します。ゲートウェイは、セキュアな通信を提供し、保護され、アプリケーション開発チームが API をデプロイするために使用できる状態になっています。次に、Connectivity Link でさまざまな地理的リージョンのクラスターに対してゲートウェイを使用して、特定の地理的場所に配置されたゲートウェイに特定のトラフィックを誘導する方法を説明します。このアプローチでは、レイテンシーが減少し、負荷が分散されますが、グローバル流量制御と認証は保護され、セキュリティーが確保されます。
アプリケーション開発者: このガイドでは、アプリケーション API のデプロイを説明し、ゲートウェイレベルのグローバル認証および流量制御ポリシーをオーバーライドして、アプリケーションレベルの認証および流量制御要件を設定する方法を説明します。
注記OpenShift 可観測性スタックとユーザーワークロードモニタリングがデプロイされている場合にユーザーロールがゲートウェイを観測および監視する方法は、Connectivity Link 可観測性ガイド を参照してください。
1.3. デプロイメント管理ツール リンクのコピーリンクがクリップボードにコピーされました!
このガイドでは、わかりやすくするために kubectl コマンドを使用しますが、複数のクラスターでの作業は複雑になります。複数のクラスターにリソースをデプロイする場合は、Argo CD などのツールを使用して管理することが推奨されます。
第2章 Connectivity Link のインストールと権限を確認する リンクのコピーリンクがクリップボードにコピーされました!
このガイドでは、1 つ以上の OpenShift クラスターに Connectivity Link が正常にインストールされ、適切なユーザー権限があることを想定しています。
前提条件
- OpenShift への Connectivity Link のインストール の説明に従って、1 つ以上のクラスターで Connectivity Link のインストール手順を完了している。
-
kubectlまたはocコマンドがインストールされている。 - このガイドで使用する OpenShift namespace への書き込み権限がある。
- このガイドのサンプル用に、Amazon Route 53 と DNS ゾーンを備えた AWS アカウントがある。Google Cloud DNS と Microsoft Azure DNS もサポートされている。
オプション:
- マルチクラスター環境での流量制御のために、複数のクラスターに Connectivity Link をインストールし、アクセス可能な Redis ベースのデータストアを共有している。詳細は、OpenShift への Connectivity Link のインストール を参照してください。
- Observability の場合、Connectivity Link 可観測性ガイド で説明されているように、Thanos などの中央ストレージシステムにリモート書き込みするように、OpenShift ユーザーワークロードの監視を設定する必要があります。
第3章 Connectivity Link プラットフォームエンジニアのワークフロー リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、プラットフォームエンジニアとしてゲートウェイをデプロイする方法を説明します。ゲートウェイは、セキュアな通信を提供し、保護され、アプリケーション開発チームが使用できる状態になっています。また、複数の地理的リージョンの複数クラスターでこのゲートウェイを使用する方法も説明しています。
前提条件
- 2章Connectivity Link のインストールと権限を確認する を参照してください。
マルチクラスター環境では、特に除外されていない限り、クラスターごとに次のステップを個別に実行する必要があります。
3.1. ステップ 1 - 環境変数を設定する リンクのコピーリンクがクリップボードにコピーされました!
手順
次の環境変数 (便宜上使用する変数) を設定します。
export zid=change-to-your-DNS-zone-ID export rootDomain=demo.example.com export gatewayNS=api-gateway export gatewayName=external export devNS=toystore export AWS_ACCESS_KEY_ID=xxxx export AWS_SECRET_ACCESS_KEY=xxxx export AWS_REGION=us-east-1 export clusterIssuerName=lets-encrypt export EMAIL=foo@example.comこの例では、
zidは AWS Route 53 コンソールに表示されるホストされるゾーンの ID です。rootDomainは、Connectivity Link で使用する最上位の AWS Route 53 ドメインの名前です。注記便宜上、このガイドでは環境変数を使用します。環境変数の値がわかっている場合は、ニーズに合った方法で必要な
.yamlファイルを設定できます。
3.2. ステップ 2 - DNS プロバイダーシークレットを設定する リンクのコピーリンクがクリップボードにコピーされました!
DNS プロバイダーは、Connectivity Link が DNS 設定のセットアップに使用できる DNS ゾーンにアクセスするための認証情報を提供します。この認証情報で、管理するゾーンのみにアクセスできるようにする必要があります。
以下の Secret リソースを各クラスターに適用する必要があります。クラスターを追加する場合は、新しいクラスターに追加します。
手順
Gateway namespace が存在しない場合は、以下のように作成します。
kubectl create ns ${gatewayNS}Connectivity Link のインストール時に DNS プロバイダー認証情報のシークレットが作成されていない場合は、以下のように Gateway namespace にこのシークレットを作成します。
kubectl -n ${gatewayNS} create secret generic aws-credentials \ --type=kuadrant.io/aws \ --from-literal=AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ --from-literal=AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEYTLS 発行者を追加する前に、以下のように
cert-managernamespace に認証情報シークレットを作成する必要もあります。kubectl -n cert-manager create secret generic aws-credentials \ --type=kuadrant.io/aws \ --from-literal=AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ --from-literal=AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
3.3. ステップ 3 - TLS 発行者を追加する リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイとの通信をセキュアにするために、TLS 証明書の TLS 発行者を定義します。この例では Let's Encrypt を使用していますが、cert-manager でサポートされている任意の証明書発行者を使用できます。
手順
次のコマンドを入力して、TLS 発行者を定義します。この例では Let's Encrypt を使用しており、これをすべてのクラスターに適用する必要があります。
kubectl apply -f - <<EOF apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: ${clusterIssuerName} spec: acme: email: ${EMAIL} privateKeySecretRef: name: le-secret server: https://acme-v02.api.letsencrypt.org/directory solvers: - dns01: route53: hostedZoneID: ${zid} region: ${AWS_REGION} accessKeyIDSecretRef: key: AWS_ACCESS_KEY_ID name: aws-credentials secretAccessKeySecretRef: key: AWS_SECRET_ACCESS_KEY name: aws-credentials EOFClusterIssuerの準備が完了するまで待ちます。kubectl wait clusterissuer/${clusterIssuerName} --for=condition=ready=true
3.4. ステップ 4 - ゲートウェイを設定する リンクのコピーリンクがクリップボードにコピーされました!
Connectivity Link が 2 つ以上のクラスター間で DNS を使用してトラフィックのバランスを調整するには、共有ホストでゲートウェイを定義する必要があります。これは、root ドメインに基づき、ワイルドカードホスト名で HTTPS リスナーを使用して定義します。前述のように、これらのリソースをすべてのクラスターに適用する必要があります。
現在、ゲートウェイは同じ namespace からの HTTPRoute のみを受け入れるように設定されています。これにより、一般使用の準備が完了するまで、ゲートウェイを使用できるユーザーを制限できます。
手順
以下のコマンドを入力してゲートウェイを作成します。
kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: ${gatewayName} namespace: ${gatewayNS} labels: kuadrant.io/gateway: "true" spec: gatewayClassName: istio listeners: - allowedRoutes: namespaces: from: Same hostname: "*.${rootDomain}" name: api port: 443 protocol: HTTPS tls: certificateRefs: - group: "" kind: Secret name: api-${gatewayName}-tls mode: Terminate EOF次のとおり、ゲートウェイのステータスを確認します。
kubectl get gateway ${gatewayName} -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Accepted")].message}' kubectl get gateway ${gatewayName} -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Programmed")].message}'ゲートウェイは受け入れられ、プログラムされるはずです。これは、ゲートウェイが有効で、外部アドレスが割り当てられたことを意味します。
ただし、以下に示すとおり HTTPS リスナーのステータスを確認すると、不正な TLS 設定が原因でプログラムされていない、またはトラフィックを受け入れる準備ができていないことがわかります。
kubectl get gateway ${gatewayName} -n ${gatewayNS} -o=jsonpath='{.status.listeners[0].conditions[?(@.type=="Programmed")].message}'このような場合も、Connectivity Link は TLSPolicy を使用して有効な手段を提供できます。この点は、次のステップで説明しています。
3.4.1. オプション: Gateway インスタンスからメトリクスを収集するように設定する リンクのコピーリンクがクリップボードにコピーされました!
クラスターに Prometheus をセットアップしている場合は、Gateway Pod から直接メトリクスを収集するように PodMonitor を設定できます。この設定は、istio_requests_total などのメトリクスに必須です。ゲートウェイが実行されている namespace に、次の設定を追加する必要があります。
kubectl apply -f - <<EOF
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: istio-proxies-monitor
namespace: ${gatewayNS}
spec:
selector:
matchExpressions:
- key: istio-prometheus-ignore
operator: DoesNotExist
podMetricsEndpoints:
- path: /stats/prometheus
interval: 30s
relabelings:
- action: keep
sourceLabels: ["__meta_kubernetes_pod_container_name"]
regex: "istio-proxy"
- action: keep
sourceLabels:
["__meta_kubernetes_pod_annotationpresent_prometheus_io_scrape"]
- action: replace
regex: (\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})
replacement: "[\$2]:\$1"
sourceLabels:
[
"__meta_kubernetes_pod_annotation_prometheus_io_port",
"__meta_kubernetes_pod_ip",
]
targetLabel: "__address__"
- action: replace
regex: (\d+);((([0-9]+?)(\.|$)){4})
replacement: "\$2:\$1"
sourceLabels:
[
"__meta_kubernetes_pod_annotation_prometheus_io_port",
"__meta_kubernetes_pod_ip",
]
targetLabel: "__address__"
- action: labeldrop
regex: "__meta_kubernetes_pod_label_(.+)"
- sourceLabels: ["__meta_kubernetes_namespace"]
action: replace
targetLabel: namespace
- sourceLabels: ["__meta_kubernetes_pod_name"]
action: replace
targetLabel: pod_name
EOF
メトリクスの設定に関する詳細は、Connectivity Link 可観測性ガイド を参照してください。
3.5. ステップ 5 - ゲートウェイポリシーと HTTP ルートの設定 リンクのコピーリンクがクリップボードにコピーされました!
この時点で、ゲートウェイのデプロイは完了していますが、エンドポイントは公開されておらず、HTTPS リスナーはプログラムされていません。次に、CertificateIssuer を使用して HTTPS リスナー証明書をセットアップする TLSPolicy を設定できます。
保護されていないエンドポイントに対してデフォルトの HTTP 403 レスポンスをセットアップする AuthPolicy と、このゲートウェイによって公開されるエンドポイントをさらに保護するために意図的に低く指定されたデフォルトのグローバル制限を設定する RateLimitPolicy を定義します。
また、負荷分散ストラテジーが含まれる DNSPolicy と、ゲートウェイがバックエンドアプリケーション API と通信するための HTTPRoute も定義します。
3.5.1. TLS ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順
次のとおり、ゲートウェイの
TLSPolicyを設定します。kubectl apply -f - <<EOF apiVersion: kuadrant.io/v1 kind: TLSPolicy metadata: name: ${gatewayName}-tls namespace: ${gatewayNS} spec: targetRef: name: ${gatewayName} group: gateway.networking.k8s.io kind: Gateway issuerRef: group: cert-manager.io kind: ClusterIssuer name: ${clusterIssuerName} EOF次のとおり、TLS ポリシーがコントローラーによって受け入れられたことを確認します。
kubectl get tlspolicy ${gatewayName}-tls -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Accepted")].message}'
3.5.2. 認証ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順
次のとおり、ゲートウェイのデフォルトの deny-all
AuthPolicyを設定します。kubectl apply -f - <<EOF apiVersion: kuadrant.io/v1 kind: AuthPolicy metadata: name: ${gatewayName}-auth namespace: ${gatewayNS} spec: targetRef: group: gateway.networking.k8s.io kind: Gateway name: ${gatewayName} defaults: rules: authorization: "deny": opa: rego: "allow = false" EOF次のとおり、認証ポリシーがコントローラーによって受け入れられたことを確認します。
kubectl get authpolicy ${gatewayName}-auth -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Accepted")].message}'
3.5.3. 流量制御ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順
次のとおり、ゲートウェイのデフォルトの
RateLimitPolicyを設定します。kubectl apply -f - <<EOF apiVersion: kuadrant.io/v1 kind: RateLimitPolicy metadata: name: ${gatewayName}-rlp namespace: ${gatewayNS} spec: targetRef: group: gateway.networking.k8s.io kind: Gateway name: ${gatewayName} defaults: limits: "low-limit": rates: - limit: 2 window: 10s EOF注記クラスターによっては、
RateLimitPolicyが適用されるまでに数分間がかかる場合があります。この例では、制限が機能していることを示すために意図的に低く設定されています。流量制御が受け入れられたことを確認するには、以下のコマンドを入力します。
kubectl get ratelimitpolicy ${gatewayName}-rlp -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Accepted")].message}'
3.5.4. DNS ポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順
次のとおり、ゲートウェイの
DNSPolicyを設定します。kubectl apply -f - <<EOF apiVersion: kuadrant.io/v1 kind: DNSPolicy metadata: name: ${gatewayName}-dnspolicy namespace: ${gatewayNS} spec: targetRef: name: ${gatewayName} group: gateway.networking.k8s.io kind: Gateway providerRefs: - name: aws-credentials loadBalancing: weight: 120 geo: EU defaultGeo: true EOF注記DNSPolicyは、これまでの手順で定義した DNS プロバイダーSecretを使用します。この例のgeoはEUですが、必要に応じて変更できます。次のとおり、
DNSPolicyが受け入れられたことを確認します。kubectl get dnspolicy ${gatewayName}-dnspolicy -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Accepted")].message}'
3.5.5. HTTP ルートの作成 リンクのコピーリンクがクリップボードにコピーされました!
テストの目的で、このセクションでは、toystore アプリケーションがデプロイされていることを前提としています。詳細は、4章Connectivity Link アプリケーション開発者のワークフロー を参照してください。
手順
次のように
HTTPRouteを作成して Gateway をテストします。kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: test namespace: ${gatewayNS} labels: service: toystore spec: parentRefs: - name: ${gatewayName} namespace: ${gatewayNS} hostnames: - "test.${rootDomain}" rules: - backendRefs: - name: toystore port: 80 EOF次のとおり、ゲートウェイポリシーが適用されたことを確認します。
kubectl get dnspolicy ${gatewayName}-dnspolicy -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Enforced")].message}' kubectl get authpolicy ${gatewayName}-auth -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Enforced")].message}' kubectl get ratelimitpolicy ${gatewayName}-rlp -n ${gatewayNS} -o=jsonpath='{.status.conditions[?(@.type=="Enforced")].message}'次のとおり、HTTPS リスナーの準備が完了したことを確認します。
kubectl get gateway ${gatewayName} -n ${gatewayNS} -o=jsonpath='{.status.listeners[0].conditions[?(@.type=="Programmed")].message}'
3.6. ステップ 6 - 接続と deny-all 認証のテスト リンクのコピーリンクがクリップボードにコピーされました!
curl を使用して、エンドポイント接続と認証をテストできます。
手順
以下のコマンドを実行します。
curl -w "%{http_code}" https://$(kubectl get httproute test -n ${gatewayNS} -o=jsonpath='{.spec.hostnames[0]}')HTTP
403レスポンスが表示されるはずです。
3.7. ステップ 7 - 他の名 namespace のゲートウェイを開く リンクのコピーリンクがクリップボードにコピーされました!
この時点で、ゲートウェイを設定し、そのゲートウェイを Connectivity Link ポリシーで保護し、テストを完了しています。次に、他の namespace の他のチームが使用できるように、ゲートウェイを開くことができます。
手順
以下のコマンドを実行します。
kubectl patch gateway ${gatewayName} -n ${gatewayNS} --type='json' -p='[{"op": "replace", "path": "/spec/listeners/0/allowedRoutes/namespaces/from", "value":"All"}]'
3.8. ステップ 8 - 複数クラスターへのゲートウェイの拡張と地理的位置に基づくルーティングの設定 リンクのコピーリンクがクリップボードにコピーされました!
手順
このゲートウェイを複数のクラスターに分散するには、クラスターごとにこのセットアッププロセスを繰り返します。
デフォルトでは、これによりラウンドロビン DNS ストラテジーが実装され、複数のクラスターにトラフィックが均等に分散されます。現在の設定では、地理的位置に基づきクライアントにサービスを提供するように、ゲートウェイを簡単にセットアップできます。
このガイドでは複数のクラスターにゲートウェイインスタンスをデプロイしていると想定していますが、その場合の次のステップとして、認識可能なゲートウェイの地理的リージョンを使用して DNS コントローラーを更新します。
たとえば、北アメリカにクラスターが 1 つあり、EU に別のクラスターがある場合は、適切なポリシーを設定することで、位置に基づきトラフィックをゲートウェイに誘導できます。その場合は、北アメリカのクラスターに対し、DNSPolicy を作成して
loadBalancing:geoフィールドをUSに設定します。
第4章 Connectivity Link アプリケーション開発者のワークフロー リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、アプリケーション開発者が既存のゲートウェイレベルのポリシーをオーバーライドして、アプリケーションレベルのルーティング、認証、流量制御に関する要件を設定する方法を説明します。
前提条件
- Connectivity Link 環境がセットアップされ、3章Connectivity Link プラットフォームエンジニアのワークフロー の説明に従ってポリシーが設定されている。
4.1. ステップ 1: toystore アプリケーションをデプロイする リンクのコピーリンクがクリップボードにコピーされました!
手順
アプリケーションの名前空間がまだ存在しない場合は、次のように作成します。
kubectl create ns ${devNS}デプロイされていない場合は、次のようにして、
toystoreアプリケーションを開発者名前空間にデプロイします。kubectl apply -f https://raw.githubusercontent.com/Kuadrant/Kuadrant-operator/main/examples/toystore/toystore.yaml -n ${devNS}
4.2. ステップ 2 - API の HTTPRoute をセットアップする リンクのコピーリンクがクリップボードにコピーされました!
手順
次のコマンドを入力して、Toystore アプリケーション API の HTTP ルートを定義します。
kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: toystore labels: deployment: toystore service: toystore spec: parentRefs: - name: ${gatewayName} namespace: ${gatewayNS} hostnames: - "api.${rootDomain}" rules: - matches: - method: GET path: type: PathPrefix value: "/cars" - method: GET path: type: PathPrefix value: "/dolls" backendRefs: - name: toystore port: 80 - matches: - path: type: PathPrefix value: "/admin" backendRefs: - name: toystore port: 80 EOFこの
HTTPRouteが配置されると、デプロイしたサービスがゲートウェイによって公開されます。次のとおり、HTTPS 経由で API エンドポイントにアクセスできます。
export INGRESS_HOST=$(kubectl get gtw ${gatewayName} -o jsonpath='{.status.addresses[0].value}' -n api-gateway) curl --resolve api.${rootDomain}:443:${INGRESS_HOST} "https://api.${rootDomain}/cars"
4.3. ステップ 3 - ゲートウェイの deny-all AuthPolicy をオーバーライドする リンクのコピーリンクがクリップボードにコピーされました!
次に、Toystore API への認証済みアクセスを許可します。そのためには、前のステップで作成した HTTPRoute リソースをターゲットとする AuthPolicy を定義します。
新しい HTTPRoutes は、ゲートウェイレベルの既存ポリシーの影響を受けます。ユーザーがこの API にアクセスできるようにするためには、該当するゲートウェイポリシーをオーバーライドする必要があります。シンプルに API キーを使用してリクエストを認証できますが、OpenID Connect などの他のオプションも利用できます。
手順
次のとおり、ユーザーである bob および alice の API キーを定義します。
kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: bob-key labels: authorino.kuadrant.io/managed-by: authorino app: toystore annotations: secret.kuadrant.io/user-id: bob stringData: api_key: IAMBOB type: Opaque --- apiVersion: v1 kind: Secret metadata: name: alice-key labels: authorino.kuadrant.io/managed-by: authorino app: toystore annotations: secret.kuadrant.io/user-id: alice stringData: api_key: IAMALICE type: Opaque EOF次のとおり、
AuthPolicyをオーバーライドして API キーの受け入れを開始します。kubectl apply -f - <<EOF apiVersion: kuadrant.io/v1 kind: AuthPolicy metadata: name: toystore spec: targetRef: group: gateway.networking.k8s.io kind: HTTPRoute name: toystore rules: authentication: "api-key-users": apiKey: selector: matchLabels: app: toystore credentials: authorizationHeader: prefix: APIKEY response: success: filters: "identity": json: properties: "userid": selector: auth.identity.metadata.annotations.secret\.kuadrant\.io/user-id EOF
4.4. ステップ 4 - ゲートウェイの RateLimitPolicy をオーバーライドする リンクのコピーリンクがクリップボードにコピーされました!
設定されたゲートウェイ制限は、一般的なケースに適した制限セットとして使用できます。ただし、Toystore API の開発者は、特定ユーザーのリクエストには具体的な数の制限を、その他のユーザーに対しては汎用の制限を適用することが必要になる場合もあります。
手順
次のコマンドを実行して、特定ユーザーに流量制御を設定します。
kubectl apply -f - <<EOF apiVersion: kuadrant.io/v1 kind: RateLimitPolicy metadata: name: toystore spec: targetRef: group: gateway.networking.k8s.io kind: HTTPRoute name: toystore limits: "general-user": rates: - limit: 1 duration: 3 unit: second counters: - metadata.filter_metadata.envoy\.filters\.http\.ext_authz.identity.userid when: - selector: metadata.filter_metadata.envoy\.filters\.http\.ext_authz.identity.userid operator: neq value: bob "bob-limit": rates: - limit: 2 duration: 3 unit: second when: - selector: metadata.filter_metadata.envoy\.filters\.http\.ext_authz.identity.userid operator: eq value: bob EOF注記クラスターによっては、
RateLimitPolicyが適用されるまでに数分間がかかる場合があります。別の例として、bob に対して、その他ユーザーの 2 倍のリクエスト数を付与できます。
新しいセットアップをテストするには、次のとおり alice としてリクエストを送信します。
while :; do curl --resolve api.${rootDomain}:443:${INGRESS_HOST} --write-out '%{http_code}\n' --silent --output /dev/null -H 'Authorization: APIKEY IAMALICE' "https://api.${rootDomain}/cars" | grep -E --color "\b(429)\b|$"; sleep 1; done次のとおり、bob としてリクエストを送信します。
while :; do curl --resolve api.${rootDomain}:443:${INGRESS_HOST} --write-out '%{http_code}\n' --silent --output /dev/null -H 'Authorization: APIKEY IAMBOB' "https://api.${rootDomain}/cars" | grep -E --color "\b(429)\b|$"; sleep 1; done注記プラットフォームエンジニアのワークフローで説明されているとおり、DNS プロバイダーをセットアップして
DNSPolicyを設定した場合は、--resolve api.${rootDomain}:443:${INGRESS_HOST}フラグを省略できます。たとえば alice の場合は、次のようになります。while :; do curl --write-out '%{http_code}\n' --silent --output /dev/null -H 'Authorization: APIKEY IAMALICE' "https://api.${rootDomain}/cars" | grep -E --color "\b(429)\b|$"; sleep 1; done注記複数のクラスターでこのガイドの手順を実行すると、
HTTPRouteホスト名の DNS レコードに複数の IP アドレスが含まれるようになります。これは、DNS プロバイダーが異なるレスポンスをルックアップに送信するため、リクエストがクラスターをまたいでラウンドロビンパターンで実行されることを意味します。
付録A Red Hat サブスクリプションの使用 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Connectivity Link は、ソフトウェアサブスクリプションを通じて提供されます。サブスクリプションを管理するには、Red Hat カスタマーポータルでアカウントにアクセスします。
サブスクリプションの管理
- access.redhat.com に移動します。
- アカウントがない場合は作成します。
- アカウントにログインします。
- メニューバーで Subscriptions をクリックし、サブスクリプションを表示および管理します。
改訂日時: 2025-06-12