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