すべてのプロダクト
Search
ドキュメントセンター

API Gateway:APIG Ingress の高度な使用法

最終更新日:Sep 10, 2026

APIG Ingress は、レイヤー 7 負荷分散を使用してクラスターサービスへの外部アクセスを管理します。Ingress リソースにアノテーションを追加することで、高度なトラフィックルーティング、レート制限、およびセキュリティ機能を設定できます。

このトピックの例では、nginx.ingress.kubernetes.io と higress.ingress.kubernetes.io の両方のアノテーションプレフィックスを使用します。各アノテーションに適用可能なプレフィックスは、以下のアノテーションインデックスに示されています。

アノテーションインデックス

アノテーション名をクリックすると、その説明にジャンプします。

アノテーション タイプ スコープ 機能
nginx.ingress.kubernetes.io/canary string ("true") ルート カナリアリリース
nginx.ingress.kubernetes.io/canary-by-header string ルート ヘッダーベースのカナリアリリース
nginx.ingress.kubernetes.io/canary-by-header-value string ルート ヘッダーベースのカナリアリリース
higress.ingress.kubernetes.io/canary-by-query string ルート クエリパラメーターベースのカナリアリリース
higress.ingress.kubernetes.io/canary-by-query-value string ルート クエリパラメーターベースのカナリアリリース
nginx.ingress.kubernetes.io/canary-by-cookie string ルート Cookie ベースのカナリアリリース
nginx.ingress.kubernetes.io/canary-weight integer (0–100) ルート 重みベースのカナリアリリース
nginx.ingress.kubernetes.io/canary-weight-total integer ルート 重みベースのカナリアリリース
higress.ingress.kubernetes.io/service-subset string ルート サービスサブセット
higress.ingress.kubernetes.io/subset-labels string ルート カスタムラベルを持つサービスサブセット
nginx.ingress.kubernetes.io/enable-cors boolean ルート CORS
nginx.ingress.kubernetes.io/cors-allow-origin string ルート CORS
nginx.ingress.kubernetes.io/cors-allow-methods string ルート CORS
nginx.ingress.kubernetes.io/cors-allow-headers string ルート CORS
nginx.ingress.kubernetes.io/cors-expose-headers string ルート CORS
nginx.ingress.kubernetes.io/cors-allow-credentials boolean ルート CORS
nginx.ingress.kubernetes.io/cors-max-age integer (seconds) ルート CORS
nginx.ingress.kubernetes.io/use-regex boolean ルート 正規表現マッチング
nginx.ingress.kubernetes.io/rewrite-target string ルート パス書き換え
nginx.ingress.kubernetes.io/upstream-vhost string ドメイン ホスト書き換え
nginx.ingress.kubernetes.io/ssl-redirect boolean ルート HTTP から HTTPS へのリダイレクト
nginx.ingress.kubernetes.io/force-ssl-redirect boolean ルート HTTP から HTTPS へのリダイレクト
nginx.ingress.kubernetes.io/permanent-redirect URL ルート 恒久的なリダイレクト
nginx.ingress.kubernetes.io/permanent-redirect-code integer ルート 恒久的なリダイレクト
nginx.ingress.kubernetes.io/temporal-redirect URL ルート 一時的なリダイレクト
higress.ingress.kubernetes.io/request-header-control-add string ルート リクエストヘッダー制御
higress.ingress.kubernetes.io/request-header-control-update string ルート リクエストヘッダー制御
higress.ingress.kubernetes.io/request-header-control-remove string ルート リクエストヘッダー制御
higress.ingress.kubernetes.io/response-header-control-add string ルート レスポンスヘッダー制御
higress.ingress.kubernetes.io/response-header-control-update string ルート レスポンスヘッダー制御
higress.ingress.kubernetes.io/response-header-control-remove string ルート レスポンスヘッダー制御
nginx.ingress.kubernetes.io/proxy-next-upstream-tries integer ルート リトライ
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout integer (seconds) ルート リトライ
nginx.ingress.kubernetes.io/proxy-next-upstream string ルート リトライ
nginx.ingress.kubernetes.io/whitelist-source-range CIDR/IP ルート IP アクセス制御
higress.ingress.kubernetes.io/blacklist-source-range CIDR/IP ルート IP アクセス制御
higress.ingress.kubernetes.io/domain-whitelist-source-range CIDR/IP ドメイン IP アクセス制御
higress.ingress.kubernetes.io/domain-blacklist-source-range CIDR/IP ドメイン IP アクセス制御
higress.ingress.kubernetes.io/route-limit-rpm integer ルート シングルゲートウェイの速度制限
higress.ingress.kubernetes.io/route-limit-rps integer ルート シングルゲートウェイの速度制限
higress.ingress.kubernetes.io/route-limit-burst-multiplier integer ルート シングルゲートウェイの速度制限
higress.ingress.kubernetes.io/rate-limit integer (RPS) ルート グローバルな速度制限制御
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code integer ルート グローバルな速度制限制御
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type string ルート グローバルな速度制限制御
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body string ルート グローバルな速度制限制御
higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url URL ルート グローバルな速度制限制御
higress.ingress.kubernetes.io/concurrency-limit integer ルート グローバルな同時実行制御
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code integer ルート グローバルな同時実行制御
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type string ルート グローバルな同時実行制御
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body string ルート グローバルな同時実行制御
higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url URL ルート グローバルな同時実行制御
higress.ingress.kubernetes.io/mirror-target-service string (namespace/name:port) ルート トラフィックミラーリング
higress.ingress.kubernetes.io/mirror-percentage integer (0–100) ルート トラフィックミラーリング
nginx.ingress.kubernetes.io/backend-protocol string (HTTPS, GRPC) ルート バックエンドサービスのプロトコル
nginx.ingress.kubernetes.io/load-balance string ルート 負荷分散アルゴリズム
nginx.ingress.kubernetes.io/upstream-hash-by string ルート 一貫性ハッシュ
higress.ingress.kubernetes.io/warmup integer (seconds) ルート ウォームアップ (グレースフル起動)
nginx.ingress.kubernetes.io/affinity string ("cookie") ルート Cookie アフィニティ
nginx.ingress.kubernetes.io/affinity-mode string ("balanced" or "persistent") ルート Cookie アフィニティ
nginx.ingress.kubernetes.io/session-cookie-name string ルート Cookie アフィニティ
nginx.ingress.kubernetes.io/session-cookie-path string ルート Cookie アフィニティ
nginx.ingress.kubernetes.io/session-cookie-max-age integer (seconds) ルート Cookie アフィニティ
nginx.ingress.kubernetes.io/session-cookie-expires integer (seconds) ルート Cookie アフィニティ
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection integer ルート 接続プール
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint integer ルート 接続プール
higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection integer ルート 接続プール
higress.ingress.kubernetes.io/tls-min-protocol-version string ドメイン TLS バージョンと暗号スイート
higress.ingress.kubernetes.io/tls-max-protocol-version string ドメイン TLS バージョンと暗号スイート
nginx.ingress.kubernetes.io/ssl-cipher string ドメイン TLS バージョンと暗号スイート
nginx.ingress.kubernetes.io/proxy-ssl-secret string (namespace/name) ルート バックエンドサービスとの mTLS 認証
nginx.ingress.kubernetes.io/proxy-ssl-name string ルート バックエンドサービスとの mTLS 認証
nginx.ingress.kubernetes.io/proxy-ssl-server-name boolean ルート バックエンドサービスとの mTLS 認証

カナリアリリース

カナリアリリースを使用すると、現在の本番バージョンを停止させることなく、新しいサービスバージョンにトラフィックを移行できます。この機能を有効にするには nginx.ingress.kubernetes.io/canary: "true" を設定し、1 つ以上のターゲティングアノテーションを追加してトラフィックの分散方法を制御します。

同じ Ingress に複数のターゲティングメソッドが設定されている場合、ルールは次の優先順位で評価されます:

Cookie > ヘッダー > クエリパラメーター > 重み

ヘッダーベースのカナリアリリース

アノテーション 説明
nginx.ingress.kubernetes.io/canary-by-header リクエストヘッダー名に基づいてトラフィックをルーティングします。ヘッダーの値を always に設定すると、常にカナリアにルーティングされます。それ以外の値の場合、canary-by-header-value も一致しない限り、本番環境にルーティングされます。
nginx.ingress.kubernetes.io/canary-by-header-value canary-by-header と組み合わせると、ヘッダー名と値の両方が一致する場合にのみカナリアサービスにルーティングされます。

例 1:ヘッダーが `apig: always` のリクエストをカナリアサービスにルーティングする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    higress.ingress.kubernetes.io/canary-by-query: "canary"
    higress.ingress.kubernetes.io/canary-by-query-value: "gray"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    higress.ingress.kubernetes.io/canary-by-query: "canary"
    higress.ingress.kubernetes.io/canary-by-query-value: "gray"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:ヘッダー値によって複数のカナリアバージョンにルーティングする (`apig: v1` → v1, `apig: v2` → v2)

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "apig"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "apig"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
  name: demo-canary-v2
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v2
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "apig"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "apig"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
  name: demo-canary-v2
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v2
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

クエリパラメーターベースのカナリアリリース

アノテーション 説明
higress.ingress.kubernetes.io/canary-by-query URL クエリパラメーター名に基づいてトラフィックをルーティングします。パラメーターの値を always に設定すると、カナリアサービスにルーティングされます。
higress.ingress.kubernetes.io/canary-by-query-value canary-by-query と組み合わせると、クエリパラメーター名と値の両方が一致する場合にのみカナリアサービスにルーティングされます。

ヘッダーベースとクエリパラメーターベースのルールは組み合わせることができます。両方が設定されている場合、リクエストは両方の条件が一致する場合にのみカナリアサービスにルーティングされます。

例 1:URL クエリパラメーターが `canary=gray` のリクエストをカナリアサービスにルーティングする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    higress.ingress.kubernetes.io/canary-by-query: "canary"
    higress.ingress.kubernetes.io/canary-by-query-value: "gray"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    higress.ingress.kubernetes.io/canary-by-query: "canary"
    higress.ingress.kubernetes.io/canary-by-query-value: "gray"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:URL に `canary=gray` があり、かつヘッダーに `x-user-id: test` が存在する場合にのみカナリアにルーティングする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    higress.ingress.kubernetes.io/canary-by-query: "canary"
    higress.ingress.kubernetes.io/canary-by-query-value: "gray"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    higress.ingress.kubernetes.io/canary-by-query: "canary"
    higress.ingress.kubernetes.io/canary-by-query-value: "gray"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Cookie ベースのカナリアリリース

nginx.ingress.kubernetes.io/canary-by-cookie を使用して、Cookie に基づいてトラフィックを分割します。Cookie の値を always に設定すると、リクエストはカナリアサービスにルーティングされます。他のすべてのリクエストは本番サービスにルーティングされます。

Cookie ベースのカナリアリリースはカスタム値をサポートしていません。Cookie の値は always である必要があります。

例:Cookie が `demo=always` のリクエストをカナリアサービスにルーティングする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

重みベースのカナリアリリース

アノテーション 説明 デフォルト
nginx.ingress.kubernetes.io/canary-weight カナリアバージョンにルーティングされるリクエストの割合。0 から 100 までの整数。 —
nginx.ingress.kubernetes.io/canary-weight-total すべてのバージョンにわたる合計の重み。 100

例:トラフィックを 3 つのバージョンに分割する — カナリア v1 に 30%、カナリア v2 に 20%、本番に 50%

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-canary-v2
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v2
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-canary-v2
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v2
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

サービスサブセット

サービスサブセットを使用すると、トラフィックを Service 内の特定の Pod にルーティングできます。これは、1 つの Service が異なるコードバージョンを実行する複数の Deployment によってサポートされている場合に便利です。

APIG Ingress の Pod ラベル規約の使用

higress.ingress.kubernetes.io/service-subset を設定して、リクエストを受信する Pod グループを指定します。デフォルトでは、APIG Ingress はサブセットの値を opensergo.io/canary で始まる Pod ラベルにマッピングします:

  • 値が "" または base の場合:ラベル opensergo.io/canary: "" を持つ Pod、または opensergo.io/canary プレフィックスのラベルを持たない Pod にルーティングします。

  • その他の文字列 (例:gray) の場合:ラベル opensergo.io/canary-gray: gray を持つ Pod にルーティングします。

例:`x-user-id: test` リクエストを go-httpbin の gray Deployment にルーティングする

まず、Service と Deployment を適用します:

# Kubernetes Service
apiVersion: v1
kind: Service
metadata:
  name: go-httpbin
  namespace: default
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-httpbin
---
# Base Deployment — opensergo.io/canary ラベルなし
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-base
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — ラベル opensergo.io/canary-gray: gray を持つ
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        opensergo.io/canary-gray: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

次に、Ingress リソースを設定します:

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # ラベル opensergo.io/canary-gray: gray を持つ Pod に転送
    higress.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # opensergo.io/canary- プレフィックスのラベルを持たない Pod に転送
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # ラベル opensergo.io/canary-gray: gray を持つ Pod に転送
    higress.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    # opensergo.io/canary- プレフィックスのラベルを持たない Pod に転送
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080

カスタムラベルの使用

opensergo.io/canary 規約ではなく、任意のラベルで Pod をターゲットにするには、higress.ingress.kubernetes.io/service-subset と higress.ingress.kubernetes.io/subset-labels の両方を設定します。

subset-labels が設定されている場合、サブセットはもはや opensergo.io/canary プレフィックスのラベルにマッピングされません。

例:`x-user-id: test` リクエストをラベル `version: gray` を持つ Pod にルーティングする

まず、Deployment を適用します (gray Deployment の Pod テンプレートに version: gray ラベルが追加されます):

# go-httpbin Kubernetes Service
apiVersion: v1
kind: Service
metadata:
  name: go-httpbin
  namespace: default
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-httpbin
---
# Base Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-base
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — カスタムラベル version: gray を使用
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        version: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

次に、Ingress リソースを設定します:

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # ラベル version: gray を持つ Pod に転送
    higress.ingress.kubernetes.io/service-subset: gray
    higress.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # ラベル version: gray を持つ Pod に転送
    higress.ingress.kubernetes.io/service-subset: gray
    higress.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080

CORS

オリジン間リソース共有 (CORS) は、どの外部ドメインがご利用のサービスにリクエストを送信できるかを制御します。

アノテーション 説明 デフォルト
nginx.ingress.kubernetes.io/enable-cors CORS を有効または無効にします。 —
nginx.ingress.kubernetes.io/cors-allow-origin 許可されるサードパーティのオリジン。カンマ区切りで、ワイルドカード * をサポートします。 * (すべてのオリジン)
nginx.ingress.kubernetes.io/cors-allow-methods 許可される HTTP メソッド。カンマ区切りで、ワイルドカード * をサポートします。 GET,PUT,POST,DELETE,PATCH,OPTIONS
nginx.ingress.kubernetes.io/cors-allow-headers 許可されるリクエストヘッダー。カンマ区切りで、ワイルドカード * をサポートします。 DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
nginx.ingress.kubernetes.io/cors-expose-headers ブラウザがアクセスできるレスポンスヘッダー。カンマ区切り。 —
nginx.ingress.kubernetes.io/cors-allow-credentials CORS リクエストで認証情報を許可するかどうか。 true
nginx.ingress.kubernetes.io/cors-max-age プリフライト応答をキャッシュできる時間 (秒単位)。 1728000

例:`example.com` を許可し、`GET` と `POST` のみを許可し、ヘッダーを `X-Foo-Bar` に制限し、認証情報を許可しない

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

正規表現マッチング

標準の Kubernetes Ingress は、Exact と Prefix のパスマッチングのみをサポートします。APIG Ingress は正規表現マッチングもサポートしています。有効にするには nginx.ingress.kubernetes.io/use-regex: "true" を設定し、パスの値として正規表現パターンを使用します。

例:`/app/...` または `/test/...` に一致するリクエストをデモサービスに転送する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
  name: regex-match
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo
                port:
                  number: 8080
            path: /(app|test)/(.*)
            pathType: Prefix

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
  name: regex-match
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /(app|test)/(.*)
            backend:
              serviceName: demo
              servicePort: 8080

パスとホストの書き換え

書き換えは、APIG Ingress がリクエストをバックエンドサービスに転送する前に、リクエストのパスまたはホストを変更します。

アノテーション 説明
nginx.ingress.kubernetes.io/rewrite-target 書き換え後のターゲットパス。キャプチャグループをサポートします。
nginx.ingress.kubernetes.io/upstream-vhost バックエンドサービスに送信されるホストヘッダーの値。

パス書き換え

以下のすべての例では、nginx.ingress.kubernetes.io/rewrite-target を使用してリクエストパスを変更します。

例 1:転送前に `example.com/test` を `example.com/dev` に書き換える

Kubernetes 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/dev"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/dev"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            pathType: Exact
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:`/v1` プレフィックスを削除する — `example.com/v1/xxx` を `example.com/xxx` に書き換える

Kubernetes 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /v1/(.*)
            pathType: Prefix

Kubernetes 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /v1/(.*)
            pathType: Prefix
            backend:
              serviceName: demo-service
              servicePort: 80

例 3:`/v1` プレフィックスを `/v2` に置き換える — `example.com/v1/xxx` を `example.com/v2/xxx` に書き換える

Kubernetes 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /v1/(.*)
            pathType: Prefix

Kubernetes 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /v1/(.*)
            pathType: Prefix
            backend:
              serviceName: demo-service
              servicePort: 80

ホスト書き換え

例:転送前にホストを `example.com` から `test.com` に書き換える

Kubernetes 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

リダイレクト

HTTP から HTTPS へのリダイレクト

アノテーション 説明
nginx.ingress.kubernetes.io/ssl-redirect HTTP リクエストを HTTPS にリダイレクトします。
nginx.ingress.kubernetes.io/force-ssl-redirect HTTP リクエストを HTTPS にリダイレクトします。

APIG Ingress は ssl-redirect と force-ssl-redirect を同じように扱います — どちらも HTTP から HTTPS へのリダイレクトを強制します。

例:`http://example.com/test` を `https://example.com/test` にリダイレクトする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

恒久的なリダイレクト

アノテーション 説明 デフォルト
nginx.ingress.kubernetes.io/permanent-redirect 恒久的なリダイレクトの宛先 URL。スキーム (http:// または https://) を含める必要があります。 —
nginx.ingress.kubernetes.io/permanent-redirect-code リダイレクトの HTTP ステータスコード。 301

例:`http://example.com/test` を `http://example.com/app` に恒久的にリダイレクトする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

一時的なリダイレクト

nginx.ingress.kubernetes.io/temporal-redirect を使用して、一時的なリダイレクトの宛先 URL を指定します。URL にはスキーム (http:// または https://) を含める必要があります。

例:`http://example.com/test` を `http://example.com/app` に一時的にリダイレクトする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

ヘッダー制御

ヘッダー制御を使用すると、APIG Ingress がリクエストをバックエンドサービスに転送し、応答をクライアントに返す際に、HTTP ヘッダーを追加、更新、または削除できます。

リクエストヘッダー制御

3 つすべてのアノテーションは、同じ複数ヘッダー構文を共有します:単一のヘッダーはキーと値のペアを使用し、複数のヘッダーは YAML の | ブロックスカラーを使用し、1 行に 1 つのキーと値のペアを記述します。

アノテーション 説明
higress.ingress.kubernetes.io/request-header-control-add 転送されるリクエストにヘッダーを追加します。ヘッダーが既に存在する場合、値は追加されます。
higress.ingress.kubernetes.io/request-header-control-update 転送されるリクエストのヘッダーを更新します。ヘッダーが既に存在する場合、値は上書きされます。
higress.ingress.kubernetes.io/request-header-control-remove 転送されるリクエストからヘッダーを削除します。複数のヘッダー名はカンマで区切ります。

例 1:`example.com/test` へのすべてのリクエストにヘッダー `foo: bar` と `test: true` を追加する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/request-header-control-add: |
      foo bar
      test true
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/request-header-control-add: |
      foo bar
      test true
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:ヘッダー制御をカナリアリリースと組み合わせて、デプロイステージごとにトラフィックをタグ付けする

リクエストヘッダーに apig: v1 が存在する場合、APIG Ingress はカナリアにルーティングし、stage: gray を追加します。他のすべてのリクエストはベースバージョンに送られ、stage: production を受け取ります。

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "apig"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
    higress.ingress.kubernetes.io/request-header-control-add: "stage gray"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/request-header-control-add: "stage production"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "apig"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
    higress.ingress.kubernetes.io/request-header-control-add: "stage gray"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/request-header-control-add: "stage production"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

レスポンスヘッダー制御

アノテーション 説明
higress.ingress.kubernetes.io/response-header-control-add クライアントに転送される前に、応答にヘッダーを追加します。ヘッダーが既に存在する場合、値は追加されます。
higress.ingress.kubernetes.io/response-header-control-update クライアントに転送される前に、応答のヘッダーを更新します。ヘッダーが既に存在する場合、値は上書きされます。
higress.ingress.kubernetes.io/response-header-control-remove クライアントに転送される前に、応答からヘッダーを削除します。複数のヘッダー名はカンマで区切ります。

例:`example.com/test` への応答から `req-cost-time` ヘッダーを削除する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

リトライ

APIG Ingress は、ルートレベルで失敗したリクエストを自動的にリトライします。リトライの最大回数、タイムアウト、およびリトライをトリガーする条件を設定できます。

アノテーション 説明 デフォルト
nginx.ingress.kubernetes.io/proxy-next-upstream-tries リトライ試行の最大回数。 3
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout リトライのタイムアウト (秒単位)。 タイムアウトなし
nginx.ingress.kubernetes.io/proxy-next-upstream リトライ条件のカンマ区切りリスト。 error,timeout

有効なリトライ条件:

条件 説明
error 接続確立に失敗するか、5xx ステータスコードが返されます。
timeout 接続確立がタイムアウトするか、5xx ステータスコードが返されます。
invalid_header リクエストエラーが発生するか、5xx ステータスコードが返されます。
http_xxx 特定の HTTP ステータスコードでリトライします (例:http_502、http_403)。
non_idempotent 非冪等リクエスト (POST、PATCH) のリトライを有効にします。デフォルトでは、これらはリトライされません。
off リトライを完全に無効にします。

例:5 秒以内に最大 2 回リトライし、HTTP 502 のみで、非冪等リクエストもリトライする

Kubernetes 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
    nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
    nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

IP アクセス制御

APIG Ingress は、ルートレベルとドメインレベルの両方で IP アドレスのホワイトリストとブラックリストをサポートします。ルートレベルのルールはドメインレベルのルールよりも優先されます。

ルートレベルの IP アクセス制御

アノテーション 説明
nginx.ingress.kubernetes.io/whitelist-source-range 特定のルートのホワイトリスト。IP アドレスと CIDR ブロックをカンマ区切りで受け入れます。
higress.ingress.kubernetes.io/blacklist-source-range 特定のルートのブラックリスト。IP アドレスと CIDR ブロックをカンマ区切りで受け入れます。

例 1:`1.1.X.X` からのみ `example.com/test` へのアクセスを許可する

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:`2.2.2.2` からの `example.com/test` へのアクセスをブロックする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

ドメインレベルの IP アクセス制御

アノテーション 説明
higress.ingress.kubernetes.io/domain-whitelist-source-range ドメイン下のすべてのルートに適用されるホワイトリスト。ルートレベルのホワイトリストが優先されます。IP アドレスと CIDR ブロックをカンマ区切りで受け入れます。
higress.ingress.kubernetes.io/domain-blacklist-source-range ドメイン下のすべてのルートに適用されるブラックリスト。ルートレベルのブラックリストが優先されます。IP アドレスと CIDR ブロックをカンマ区切りで受け入れます。

例 1:`1.1.X.X` と `2.2.2.2` からの `example.com` 下のすべてのルートへのアクセスを許可する

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact
          - backend:
              service:
                name: app-service
                port:
                  number: 80
            path: /app
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80
          - path: /app
            backend:
              serviceName: app-service
              servicePort: 80

例 2:ドメインレベルとルートレベルのホワイトリストを組み合わせる — `/order` を `3.3.X.X` に制限し、他のすべてのルートでは `1.1.X.X` と `2.2.2.2` を許可する

バージョン 1.19 以降のクラスター

# /test と /app のためのドメインレベルのホワイトリスト
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo-domain
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact
          - backend:
              service:
                name: app-service
                port:
                  number: 80
            path: /app
            pathType: Exact
---
# ルートレベルのホワイトリストが /order のドメインレベルをオーバーライド
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
  name: demo-route
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /order
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo-domain
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80
          - path: /app
            backend:
              serviceName: app-service
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
  name: demo-route
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /order
            backend:
              serviceName: demo-service
              servicePort: 80

シングルゲートウェイの速度制限

シングルゲートウェイの速度制限は、各クラウドネイティブ API ゲートウェイインスタンス上の特定のルートに対するリクエストレートを制限します。この制限はゲートウェイレプリカごとに適用され、クラスター全体には適用されません。

重要

レート制限はゲートウェイレプリカごとに適用されます。複数のレプリカを実行する場合や Horizontal Pod Autoscaler (HPA) を使用する場合、クラスター全体の実質的な制限は、設定値にレプリカ数を掛けたものになります。レプリカ数に影響されないクラスター全体の制限については、代わりにグローバルな速度制限制御を使用してください。

アノテーション 説明 デフォルト
higress.ingress.kubernetes.io/route-limit-rpm ゲートウェイインスタンスごとの 1 分あたりの最大リクエスト数 (RPM)。制限を超えると、レスポンスボディは local_rate_limited になります。 —
higress.ingress.kubernetes.io/route-limit-rps ゲートウェイインスタンスごとの 1 秒あたりの最大リクエスト数 (RPS)。制限を超えると、レスポンスボディは local_rate_limited になります。 —
higress.ingress.kubernetes.io/route-limit-burst-multiplier バースト制限の乗数。バースト制限は、RPM または RPS の値にこの数値を掛けたものに等しくなります。 5

速度制限がトリガーされたときの応答ステータスコードは、ゲートウェイのバージョンによって異なります:

  • ゲートウェイバージョン 1.2.23 より前:HTTP 503

  • ゲートウェイバージョン 1.2.23 以降:HTTP 429

例 1:`example.com/test` を 100 RPM に制限し、バースト制限を 200 (乗数 2) にする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/route-limit-rpm: "100"
    higress.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/route-limit-rpm: "100"
    higress.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:`example.com/test` を 10 RPS に制限し、デフォルトのバースト制限 (乗数 5、バースト = 50) を使用する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/route-limit-rps: "10"
    # デフォルトのバースト乗数は 5; バースト制限 = 50
    # higress.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/route-limit-rps: "10"
    # デフォルトのバースト乗数は 5; バースト制限 = 50
    # higress.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

グローバルな速度制限制御

この機能には、APIG Ingress ゲートウェイバージョン 1.2.25 以降が必要です。

グローバルな速度制限制御は Sentinel と統合して、特定のルートに対してクラスター全体の RPS 制限を適用します。制限を超えると、デフォルトの応答は HTTP 429 で、本文は sentinel rate limited となります。この動作は、カスタム応答またはリダイレクトでオーバーライドできますが、両方を同時に使用することはできません。

カスタム応答

アノテーション 説明 デフォルト
higress.ingress.kubernetes.io/rate-limit ゲートウェイクラスター全体のルートの最大 RPS。 —
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code 速度制限がトリガーされたときの HTTP ステータスコード。 429
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type レスポンスボディのフォーマット:text (text/plain; charset=UTF-8) または json (application/json; charset=UTF-8)。 text
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body 速度制限がトリガーされたときのレスポンスボディの内容。 sentinel rate limited

例 1:`example.com/test` を 100 RPS に制限し、デフォルトの速度制限応答を使用する

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:`example.com/test` を 100 RPS に制限し、速度制限された場合は HTTP 503 と本文 `server is overload` を返す

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

リダイレクト

higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url を使用して、速度制限がトリガーされたときにクライアントをフォールバック URL にリダイレクトします。

例:`example.com/test` を 100 RPS に制限し、速度制限された場合は `example.com/fallback` にリダイレクトする

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

グローバルな同時実行制御

この機能には、APIG Ingress ゲートウェイバージョン 1.2.25 以降が必要です。

グローバルな同時実行制御は Sentinel と統合して、特定のルートに対してクラスター全体の同時リクエスト制限を適用します。制限を超えると、デフォルトの応答は HTTP 429 で、本文は sentinel rate limited となります。この動作は、カスタム応答またはリダイレクトでオーバーライドできますが、両方を同時に使用することはできません。

カスタム応答

アノテーション 説明 デフォルト
higress.ingress.kubernetes.io/concurrency-limit ゲートウェイクラスター全体のルートの最大同時リクエスト数。 —
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code 同時実行制御がトリガーされたときの HTTP ステータスコード。 429
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type レスポンスボディのフォーマット:text (text/plain; charset=UTF-8) または json (application/json; charset=UTF-8)。 text
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body 同時実行制御がトリガーされたときのレスポンスボディの内容。 sentinel rate limited

例 1:`example.com/test` への同時リクエストを 1,000 に制限し、デフォルトの応答を使用する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:同時リクエストを 1,000 に制限し、制限に達した場合は HTTP 503 と本文 `server is overloaded` を返す

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

リダイレクト

higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url を使用して、同時実行制御がトリガーされたときにクライアントをフォールバック URL にリダイレクトします。

例:同時リクエストを 1,000 に制限し、制限に達した場合は `example.com/fallback` にリダイレクトする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

トラフィックミラーリング

トラフィックミラーリングは、元のリクエストフローに影響を与えることなく、ライブリクエストトラフィックをシャドウサービスにコピーします。これは、運用監査、トラフィックテスト、またはシャドウモードでの新しいサービスバージョンの検証に使用します。

アノテーション 説明 デフォルト
higress.ingress.kubernetes.io/mirror-target-service ミラーリングされたトラフィックの宛先サービス。フォーマット:namespace/name:port。namespace と port フィールドはオプションです — namespace は Ingress ゲートウェイの名前空間にデフォルト設定され、port はサービスの最初のポートにデフォルト設定されます。 —
higress.ingress.kubernetes.io/mirror-percentage ミラーリングするトラフィックの割合。有効な値:0–100。 100
重要

ミラーリングされたトラフィックが宛先サービスに転送される際、APIG Ingress は自動的に Host ヘッダーに -shadow を追加します。たとえば、example.com は example.com-shadow になります。宛先サービスがルーティングやロギングに Host ヘッダーを使用している場合は、サービスの設定でこの書き換えを考慮してください。

例 1:`example.com/test` からのすべてのトラフィックを `test/app:8080` にミラーリングする

バージョン 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:`example.com/test` からのトラフィックの 10% を `test/app:8080` にミラーリングする

バージョン 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
    higress.ingress.kubernetes.io/mirror-percentage: "10"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
    higress.ingress.kubernetes.io/mirror-percentage: "10"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

バックエンドサービスのプロトコル

デフォルトでは、APIG Ingress は HTTP を介してバックエンドサービスにリクエストを転送します。nginx.ingress.kubernetes.io/backend-protocol アノテーションを使用して、HTTPS または gRPC に切り替えます。

Kubernetes Service リソースのポート名が grpc または http2 に設定されている場合、APIG Ingress はアノテーションなしで、そのバックエンドに対して自動的に gRPC または HTTP/2 を使用します。これは、すべての場合にアノテーションを必要とする NGINX Ingress とは異なります。

例 1:HTTPS バックエンドにリクエストを転送する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /
            pathType: Exact

Kubernetes 1.19 より前のバージョンを実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:gRPC バックエンドにリクエストを転送する

2 つの方法があります:アノテーション (明示的) または Service ポート名 (設定より規約)。

方法 1 — アノテーション:

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前のバージョンを実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

方法 2 — Service ポート名 (grpc):

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /order
            pathType: Exact
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  ports:
    - name: grpc  # APIG Ingress はこれを検出し、自動的に gRPC を使用します
      port: 80
      protocol: TCP
  selector:
    app: demo-service

Kubernetes 1.19 より前のバージョンを実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  ports:
    - name: grpc
      port: 80
      protocol: TCP
  selector:
    app: demo-service

バックエンドサービスの負荷分散アルゴリズム

負荷分散アルゴリズムは、ゲートウェイがリクエストを転送する際にバックエンドノードをどのように選択するかを決定します。

一般的な負荷分散アルゴリズム

nginx.ingress.kubernetes.io/load-balance を使用してアルゴリズムを設定します。

値 説明
round_robin バックエンドノード間でリクエストを順番に分散します。これがデフォルトです。
least_conn 各リクエストをアクティブな接続が最も少ないノードにルーティングします。
random バックエンドノードをランダムに選択します。
重要

APIG Ingress は、指数加重移動平均 (EWMA) アルゴリズムをサポートしていません。EWMA が設定されている場合、round_robin にフォールバックします。

例:demo-service バックエンドに最小接続を使用する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "least_conn"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /order
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "least_conn"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

一貫性ハッシュに基づく負荷分散アルゴリズム

一貫性ハッシュは、同じキーを持つリクエストが常に同じバックエンドノードにルーティングされることを保証します — これはセッションアウェアなアプリケーションやキャッシュローカリティに便利です。nginx.ingress.kubernetes.io/upstream-hash-by を使用してハッシュキーを設定します。

サポートされているハッシュキーのタイプ:

ハッシュキー 構成 説明
リクエスト URI $request_uri パスパラメーターを含みます。
ホスト $host リクエストのホストヘッダー。
クライアント IP $remote_addr クライアントの IP アドレス。
リクエストヘッダー $http_<header-name> 特定のリクエストヘッダーの値。
クエリパラメーター $arg_<param-name> 特定の URL クエリパラメーターの値。

例 1:同じクライアント IP からのすべてのリクエストを同じバックエンドノードにルーティングする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:同じ `X-Stage` ヘッダー値を持つリクエストを同じバックエンドノードにルーティングする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 3:同じ `X-Stage` クエリパラメーター値を持つリクエストを同じバックエンドノードにルーティングする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

ウォームアップ (グレースフル起動)

ウォームアップは、新しく起動したバックエンドノードへのトラフィックを、指定されたタイムウィンドウにわたって徐々に増加させ、ピークトラフィックを処理する前にキャッシュの初期化や JIT コンパイルコードの実行時間を与えます。

higress.ingress.kubernetes.io/warmup を使用して、ウォームアップ期間を秒単位で設定します。ウォームアップはデフォルトで無効になっています。

ウォームアップは、round_robin および least_conn 負荷分散アルゴリズムでのみサポートされます。

例:demo-service を 30 秒のウィンドウでウォームアップする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/warmup: "30"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/warmup: "30"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Cookie アフィニティ (セッション維持)

Cookie アフィニティは、同じクライアントからのすべてのリクエストを同じバックエンドノードにルーティングします。APIG Ingress は最初のリクエストでアフィニティ Cookie を生成し、後続のリクエストはその Cookie を携帯して同じノードにルーティングされます。

アノテーション 説明 デフォルト
nginx.ingress.kubernetes.io/affinity アフィニティタイプ。唯一の有効な値は cookie です。 —
nginx.ingress.kubernetes.io/affinity-mode アフィニティモード:balanced は新しいセッションをバックエンド間で均等に分散します。persistent は Cookie の有効期間中、常に同じバックエンドにルーティングします。 balanced
nginx.ingress.kubernetes.io/session-cookie-name ハッシュキーとして使用される Cookie の名前。 INGRESSCOOKIE
nginx.ingress.kubernetes.io/session-cookie-path 生成された Cookie のパス。Ingress パスと一致する必要があります。 /
nginx.ingress.kubernetes.io/session-cookie-max-age 生成された Cookie の有効期限 (秒単位)。session-cookie-expires よりも優先されます。 セッションレベル
nginx.ingress.kubernetes.io/session-cookie-expires 生成された Cookie の有効期限 (秒単位)。 セッションレベル

例 1:デフォルト設定 (Cookie 名 `INGRESSCOOKIE`、パス `/`、セッションレベルの有効期間) で Cookie アフィニティを有効にする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

例 2:カスタム Cookie 名 `test`、パス `/`、10 秒の有効期限で Cookie アフィニティを有効にする

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "test"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "test"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

接続プール

接続プールは、ゲートウェイインスタンスがバックエンドサービスに対して開く接続数を制限し、高トラフィック下での過負荷を防ぎます。

アノテーション 説明
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection ゲートウェイインスタンスとバックエンドサービス間の最大合計 TCP 接続数。
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint ゲートウェイインスタンスと単一のバックエンド Pod 間の最大 TCP 接続数。
higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection ゲートウェイインスタンスとバックエンドサービス間の TCP 接続ごとの最大 HTTP リクエスト数。

例:demo-service に対して、ゲートウェイの合計接続数を 10、Pod ごとの接続数を 2 に制限する

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: "10"
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: "2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: "10"
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: "2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

TLS バージョンと暗号スイート

デフォルトでは、APIG Ingress は TLS 1.0 から TLS 1.3 までの TLS 接続を受け入れ、以下の暗号スイートを使用します:

  • ECDHE-ECDSA-AES128-GCM-SHA256

  • ECDHE-RSA-AES128-GCM-SHA256

  • ECDHE-ECDSA-AES128-SHA

  • ECDHE-RSA-AES128-SHA

  • AES128-GCM-SHA256

  • AES128-SHA

  • ECDHE-ECDSA-AES256-GCM-SHA384

  • ECDHE-RSA-AES256-GCM-SHA384

  • ECDHE-ECDSA-AES256-SHA

  • ECDHE-RSA-AES256-SHA

  • AES256-GCM-SHA384

  • AES256-SHA

特定のドメインに対して TLS バージョンの範囲や暗号スイートを制限するには、次のアノテーションを使用します:

アノテーション 説明 デフォルト
higress.ingress.kubernetes.io/tls-min-protocol-version 最小 TLS バージョン。有効な値:TLSv1.0、TLSv1.1、TLSv1.2、TLSv1.3。 TLSv1.0
higress.ingress.kubernetes.io/tls-max-protocol-version 最大 TLS バージョン。有効な値:TLSv1.0、TLSv1.1、TLSv1.2、TLSv1.3。 TLSv1.3
nginx.ingress.kubernetes.io/ssl-cipher 許可される暗号スイート (カンマ区切り)。TLS 1.0–1.2 ハンドシェイクにのみ適用されます。 —

例:`example.com` を TLS 1.2 のみに制限する

バージョン 1.19 以降のクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
    higress.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

バージョン 1.19 より前のクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
    higress.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

バックエンドサービスとの mTLS 認証

一方向 TLS (バックエンドサービスのプロトコルで説明されている nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 経由) は、バックエンドの証明書のみを検証します。相互検証のためには、mTLS を設定します。これにより、バックエンドもゲートウェイから提示されたクライアント証明書を検証します。

ゲートウェイが提示するクライアント証明書を設定するには、これらのアノテーションを使用します:

アノテーション 説明
nginx.ingress.kubernetes.io/proxy-ssl-secret ゲートウェイがバックエンドサービスに対して自身を認証するために使用するクライアント証明書。フォーマット:secretNamespace/secretName。
nginx.ingress.kubernetes.io/proxy-ssl-name TLS ハンドシェイク中に使用されるサーバー名表示 (SNI) の値。
nginx.ingress.kubernetes.io/proxy-ssl-server-name TLS ハンドシェイク中の SNI を有効または無効にします。

例:証明書 `default/gateway-cert` を使用して、ゲートウェイと demo-service 間の mTLS を設定する

Kubernetes 1.19 以降を実行しているクラスター

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Kubernetes 1.19 より前を実行しているクラスター

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80