MSE Ingress は、Kubernetes API オブジェクトであり、クラスター内のサービスへの外部アクセスを制御するためのレイヤー 7 ロードバランシングを提供します。本トピックでは、トラフィックガバナンスのためのアノテーションベースの高度な構成について説明します。対象となる機能には、カナリアリリース、CORS、パスおよびホストの書き換え、自動転送、ヘッダー制御、リトライ、IP アドレスに基づくアクセスの制御、レート制限、トラフィックミラーリング、負荷分散、セッション維持、コネクションプーリング、TLS 設定が含まれます。
カナリアリリース
MSE Ingress は、ヘッダーに基づく、クエリパラメーターに基づく、Cookie に基づく、および重み付けに基づくの 4 種類のカナリアリリース方式をサポートしています。カナリアリリースは、Ingress リソースにアノテーションを追加することで構成します。すべてのカナリア Ingress リソースには、nginx.ingress.kubernetes.io/canary: "true" というアノテーションが必要です。
複数の方式を同時に構成した場合、MSE Ingress は以下の優先順位で適用します:
ヘッダーまたはクエリパラメーターに基づく方式 > Cookie に基づく方式 > 重み付けに基づく方式
MSE Ingress では、1 つのルートあたり無制限のカナリアバージョンをサポートします。一方、NGINX Ingress および ALB Ingress では、最大 2 バージョンのみがサポートされます。
ヘッダーに基づくカナリアリリース
リクエストヘッダーに基づいてトラフィックをルーティングするには、以下のアノテーションを使用します:
| アノテーション | 動作 |
|---|---|
nginx.ingress.kubernetes.io/canary-by-header | ヘッダー値が always の場合にカナリアバージョンへルーティングします。その他のすべての値ではベースバージョンへルーティングします。 |
nginx.ingress.kubernetes.io/canary-by-header-value | canary-by-header と併用します。ヘッダーのキーと値の両方が完全に一致した場合にのみ、カナリアバージョンへルーティングします。 |
例 1:ヘッダーによる単一カナリアバージョンへのルーティング
ヘッダー mse: always を含むリクエストは demo-service-canary へ、それ以外のすべてのリクエストは demo-service へルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
name: demo-canary
spec:
ingressClassName: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:ヘッダー値による複数カナリアバージョンへのルーティング
mse: v1 を含むリクエストは demo-service-canary-v1 へ、mse: v2 を含むリクエストは demo-service-canary-v2 へ、それ以外のすべてのリクエストは demo-service へルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
name: demo-canary-v1
spec:
ingressClassName: mse
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: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
name: demo-canary-v2
spec:
ingressClassName: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
name: demo-canary-v1
spec:
ingressClassName: mse
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: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
name: demo-canary-v2
spec:
ingressClassName: mse
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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
クエリパラメーターに基づくカナリアリリース
URL のクエリパラメーターに基づいてトラフィックをルーティングするには、以下のアノテーションを使用します:
| アノテーション | 動作 |
|---|---|
mse.ingress.kubernetes.io/canary-by-query | クエリパラメーターのキーが一致し、値が always の場合にカナリアバージョンへルーティングします。 |
mse.ingress.kubernetes.io/canary-by-query-value | canary-by-query と併用します。クエリのキーと値の両方が完全に一致した場合にのみ、カナリアバージョンへルーティングします。 |
ヘッダーに基づく方式とクエリパラメーターに基づく方式を組み合わせることができます。両方の条件が満たされた場合にのみ、リクエストはカナリアバージョンへルーティングされます。
例 1:クエリパラメーターのみによるルーティング
クエリパラメーター canary=gray を含むリクエストは demo-service-canary へ、それ以外のすべてのリクエストは demo-service へルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.ingress.kubernetes.io/canary-by-query-value: "gray"
name: demo-canary
spec:
ingressClassName: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.ingress.kubernetes.io/canary-by-query-value: "gray"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:クエリパラメーターとヘッダーのマッチングを組み合わせる
URL に canary=gray が含まれ、かつヘッダーに x-user-id: test が含まれるリクエストは demo-service-canary へ、それ以外のすべてのリクエストは demo-service へルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.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: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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にルーティング
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080</details>
Cookie に基づくカナリアリリース
nginx.ingress.kubernetes.io/canary-by-cookie を使用して、Cookie に基づいてトラフィックをルーティングします。Cookie の値が always の場合に、リクエストはカナリアバージョンへ送信されます。
カスタム Cookie 値はサポートされていません。Cookie の値は必ず always でなければなりません。例: Cookie demo=always を含むリクエストは demo-service-canary へ、それ以外のすべてのリクエストは demo-service へルーティングされます。
# Kubernetes v1.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: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
重み付けに基づくカナリアリリース
| アノテーション | 説明 | デフォルト |
|---|---|---|
nginx.ingress.kubernetes.io/canary-weight | カナリアバージョンへルーティングされるリクエストの割合(パーセント)。0 ~ 100 の整数。 | — |
nginx.ingress.kubernetes.io/canary-weight-total | 重み計算における分母として使用される総重み。 | 100 |
カナリアバージョンへ送信されるトラフィックの割合は、canary-weight / canary-weight-total です。複数のカナリアバージョンを使用する場合、各重みの合計が canary-weight-total より小さくなるように設定してください。残りの割合はベースバージョンへ送信されます。
例: 3 つのバージョン間でトラフィックを分割 — demo-service-canary-v1 へ 30 %、demo-service-canary-v2 へ 20 %、demo-service へ 50 %。
# Kubernetes v1.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: mse
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: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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: mse
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: mse
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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
サービスサブセット
サービスサブセットは、サービス内の特定の Pod グループへリクエストをルーティングします。たとえば、単一の Kubernetes Service が、異なるバージョンを実行する複数の Deployment によってバックアップされている場合などです。サービスサブセットを構成するには、以下のいずれかの方法を使用します。
MseIngressConfig での Pod ラベルの使用
mse.ingress.kubernetes.io/service-subset を使用して、特定の opensergo.io/canary ラベルプレフィックスを持つ Pod へルーティングします。
""またはbase:ラベルにopensergo.io/canaryプレフィックスが含まれていない、またはラベル値が空である Pod へルーティングします。その他の任意の値(例:
gray):ラベルopensergo.io/canary-{value}: {value}(例:opensergo.io/canary-gray: gray)を持つ Pod へルーティングします。
例: go-httpbin という名前の Service が、2 つの Deployment(ベース Deployment:ラベル opensergo.io/canary なし、グレーデプロイメント:ラベル opensergo.io/canary-gray: gray)によってバックアップされています。ヘッダー x-user-id: test を含むリクエストはグレーデプロイメントへ、それ以外のすべてのリクエストはベースデプロイメントへルーティングされます。
# go-httpbin Kubernetes Service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# ベースデプロイメント
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/mse/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# グレーデプロイメント
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/mse/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbin# Ingress — Kubernetes v1.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 へルーティング
mse.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
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 へルーティング
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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 へルーティング
mse.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
# opensergo.io/canary ラベルプレフィックスを持たない Pod へルーティング
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080</details>
カスタムラベルの使用
Pod サブセット選択のためのカスタムラベルを定義するには、mse.ingress.kubernetes.io/service-subset と mse.ingress.kubernetes.io/subset-labels の両方を使用します。subset-labels を構成すると、サブセットはもはや opensergo.io/canary ラベルプレフィックスにはマップされません。
mse.ingress.kubernetes.io/subset-labelsを設定すると、opensergo.io/canaryプレフィックスのマッピングは無効になります。
例: 上記と同じシナリオですが、グレーポッドは opensergo.io/canary-gray ラベルではなく、カスタムラベル 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
---
# ベースデプロイメント
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/mse/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# グレーデプロイメント(カスタムラベル)
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/mse/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbin# Ingress — Kubernetes v1.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 へルーティング
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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 へルーティング
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080</details>
CORS
クロスオリジンリソース共有(CORS)は、クロスオリジンリクエストで許可されるオリジン、メソッド、およびヘッダーを制御します。詳細については、「クロスオリジンリソース共有(CORS)」をご参照ください。
| アノテーション | 説明 | デフォルト |
|---|---|---|
nginx.ingress.kubernetes.io/enable-cors | CORS を有効化します。 | — |
nginx.ingress.kubernetes.io/cors-allow-origin | 許可されるオリジン。カンマ区切り。ワイルドカード (*) をサポート。 | * |
nginx.ingress.kubernetes.io/cors-allow-methods | 許可されるリクエストメソッド。カンマ区切り。ワイルドカード (*) をサポート。 | 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 に制限し、認証情報を許可しないようにします。
# Kubernetes v1.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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
正規表現によるマッチング
標準の Kubernetes Ingress でサポートされる Exact および Prefix のパスタイプに加えて、MSE Ingress は正規表現によるマッチングをサポートします。nginx.ingress.kubernetes.io/use-regex: "true" を追加すると、パス値が正規表現として扱われます。
例:パスが /app または /test で始まる example.com へのリクエストを demo サービスに転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: 'true'
name: regex-match
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo
port:
number: 8080
path: /(app|test)/(.*)
pathType: Prefix<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: 'true'
name: regex-match
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /(app|test)/(.*)
backend:
serviceName: demo
servicePort: 8080</details>
パスおよびホストの書き換え
MSE Ingress がバックエンドサービスへトラフィックを転送する前に、リクエストパスまたはホストを書き換えます。
| アノテーション | 説明 |
|---|---|
nginx.ingress.kubernetes.io/rewrite-target | 書き換え先のパス。キャプチャグループをサポート。 |
nginx.ingress.kubernetes.io/upstream-vhost | 書き換え先のホスト。 |
パスの書き換え
例 1:固定パスの書き換え
example.com/test をバックエンドへ転送する前に example.com/dev に書き換えます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/dev"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/dev"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
pathType: Exact
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:パスプレフィックスの削除
/v1 プレフィックスを削除し、example.com/v1/xxx をバックエンドへ転送する前に example.com/xxx に変換します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /v1/(.*)
pathType: Prefix<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /v1/(.*)
pathType: Prefix
backend:
serviceName: demo-service
servicePort: 80</details>
例 3:パスプレフィックスの置換
/v1 プレフィックスを /v2 に変更して、example.com/v1/xxx が example.com/v2/xxx になるようにします。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /v1/(.*)
pathType: Prefix<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /v1/(.*)
pathType: Prefix
backend:
serviceName: demo-service
servicePort: 80</details>
ホストの書き換え
例: example.com から test.com へホストを書き換え、example.com/test をバックエンドへ転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
自動転送
HTTP から HTTPS への自動転送
| アノテーション | 説明 |
|---|---|
nginx.ingress.kubernetes.io/ssl-redirect | HTTP リクエストを HTTPS へ自動転送します。 |
nginx.ingress.kubernetes.io/force-ssl-redirect | HTTP リクエストを HTTPS へ自動転送します。 |
MSE Ingress では、両方のアノテーションが同一に扱われ、どちらも HTTP を強制的に HTTPS へ自動転送します。
例: http://example.com/test を https://example.com/test へ自動転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
恒久的なリダイレクト
| アノテーション | 説明 | デフォルト |
|---|---|---|
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 へ恒久的に自動転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
一時的なリダイレクト
nginx.ingress.kubernetes.io/temporal-redirect を使用して、一時的な自動転送先の URL を指定します。URL にはスキーム(http:// または https://)を含める必要があります。
例: http://example.com/test を http://example.com/app へ一時的に自動転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
ヘッダー制御
MSE Ingress を使用すると、トラフィックを転送する前にリクエストおよびレスポンスヘッダーを追加、更新、または削除できます。
リクエストヘッダー制御
| アノテーション | 説明 |
|---|---|
mse.ingress.kubernetes.io/request-header-control-add | 転送されるリクエストにヘッダーを追加します。ヘッダーが既に存在する場合、新しい値は既存の値に追加されます。単一ヘッダー:キーと値のペア。複数ヘッダー:YAML ブロックスカラー(|)を使用し、1 行につき 1 ペア。 |
mse.ingress.kubernetes.io/request-header-control-update | 転送されるリクエストのヘッダーを変更します。ヘッダーが既に存在する場合、新しい値で既存の値が上書きされます。単一ヘッダー:キーと値のペア。複数ヘッダー:YAML ブロックスカラー(|)を使用し、1 行につき 1 ペア。 |
mse.ingress.kubernetes.io/request-header-control-remove | 転送されるリクエストからヘッダーを削除します。単一ヘッダー:キーのみ。複数ヘッダー:カンマ区切り。 |
例 1:複数のリクエストヘッダーの追加
example.com/test へのリクエストに foo: bar および test: true を追加します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: |
foo bar
test true
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: |
foo bar
test true
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:ヘッダー制御とカナリアリリースの組み合わせ
ステージを識別するためにリクエストにステージヘッダーを付与します。mse: v1 を含むリクエストは demo-service-canary-v1 へ送信され、stage: gray を受信します。それ以外のすべてのリクエストは demo-service へ送信され、stage: production を受信します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
mse.ingress.kubernetes.io/request-header-control-add: "stage gray"
name: demo-canary-v1
spec:
ingressClassName: mse
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:
mse.ingress.kubernetes.io/request-header-control-add: "stage production"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
mse.ingress.kubernetes.io/request-header-control-add: "stage gray"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: "stage production"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80</details>
レスポンスヘッダー制御
| アノテーション | 説明 |
|---|---|
mse.ingress.kubernetes.io/response-header-control-add | クライアントへ転送される前にレスポンスにヘッダーを追加します。ヘッダーが存在する場合、値は追加されます。 |
mse.ingress.kubernetes.io/response-header-control-update | クライアントへ転送される前にレスポンスのヘッダーを変更します。ヘッダーが存在する場合、値は上書きされます。 |
mse.ingress.kubernetes.io/response-header-control-remove | クライアントへ転送される前にレスポンスからヘッダーを削除します。単一ヘッダー:キーのみ。複数ヘッダー:カンマ区切り。 |
例: example.com/test へのレスポンスから req-cost-time ヘッダーを削除します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
リトライ
MSE 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 |
proxy-next-upstream-timeout は、各リトライ試行に対して個別に適用されます。3 回のリトライを 5 秒のタイムアウトで設定した場合、合計の最大リトライ時間は 15 秒であり、5 秒ではありません。
proxy-next-upstream の有効なリトライ条件:
| 値 | リトライがトリガーされる条件 |
|---|---|
error | 接続が失敗した場合、または 5xx ステータスが返された場合。 |
timeout | 接続がタイムアウトした場合、または 5xx ステータスが返された場合。 |
invalid_header | リクエストが不正な形式であり、5xx ステータスが返された場合。 |
http_xxx | 指定されたステータスコードが返された場合(例:http_502、http_403)。 |
non_idempotent | 非冪等リクエスト(POST、PATCH)が失敗した場合。デフォルトでは、MSE Ingress は非冪等リクエストをリトライしません。 |
off | リトライを無効化します。 |
例: example.com/test に対して、最大 2 回のリトライ、各リトライのタイムアウトを 5 秒、502 応答のみでリトライをトリガー、および非冪等リクエストのリトライを許可します。
# Kubernetes v1.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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
IP アドレスに基づくアクセスの制御
MSE Ingress は、ルートレベルおよびドメイン名レベルの IP アドレスに基づくアクセスの制御をサポートします。ルートレベルのルールは、ドメインレベルのルールよりも優先されます。
ルートレベルの IP アクセス制御
| アノテーション | 説明 |
|---|---|
nginx.ingress.kubernetes.io/whitelist-source-range | ルートの IP アドレスホワイトリスト。IP アドレスおよび CIDR ブロックをカンマ区切りで指定可能。 |
mse.ingress.kubernetes.io/blacklist-source-range | ルートの IP アドレスブラックリスト。IP アドレスおよび CIDR ブロックをカンマ区切りで指定可能。 |
例 1:特定の IP アドレスからのルートへのアクセスを許可
example.com/test へのアクセスを 1.1.X.X のみから許可します。
# Kubernetes v1.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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:特定の IP アドレスからのルートへのアクセスを拒否
example.com/test へのアクセスを 2.2.2.2 から拒否します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
ドメインレベルの IP アクセス制御
| アノテーション | 説明 |
|---|---|
mse.ingress.kubernetes.io/domain-whitelist-source-range | ドメイン下のすべてのルートに対する IP アドレスホワイトリスト。ルートレベルのホワイトリストが優先されます。IP アドレスおよび CIDR ブロックをカンマ区切りで指定可能。 |
mse.ingress.kubernetes.io/domain-blacklist-source-range | ドメイン下のすべてのルートに対する IP アドレスブラックリスト。ルートレベルのブラックリストが優先されます。IP アドレスおよび CIDR ブロックをカンマ区切りで指定可能。 |
例 1:ドメイン下のすべてのルートへの特定の IP アドレスからのアクセスを許可
example.com のすべてのルートへのアクセスを 1.1.X.X および 2.2.2.2 から許可します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo
spec:
ingressClassName: mse
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<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
- path: /app
backend:
serviceName: app-service
servicePort: 80</details>
例 2:ドメインレベルおよびルートレベルのアクセス制御の組み合わせ
1.1.X.X および 2.2.2.2 から example.com のすべてのルートへのアクセスを許可しますが、example.com/order へのアクセスは 3.3.X.X のみに制限します(ルートレベルが優先されます)。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo-domain
spec:
ingressClassName: mse
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
---
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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo-domain
spec:
ingressClassName: mse
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: mse
rules:
- host: example.com
http:
paths:
- path: /order
backend:
serviceName: demo-service
servicePort: 80</details>
単一ゲートウェイインスタンスごとの速度制限
MSE Ingress は、ルートレベルでの単一ゲートウェイインスタンスごとの速度制限をサポートします。この制限は、ゲートウェイクラスター全体ではなく、単一のゲートウェイレプリカに適用されます。
クラスター全体の速度制限には、代わりにグローバルな速度制限制御を使用してください。
| アノテーション | 説明 | デフォルト |
|---|---|---|
mse.ingress.kubernetes.io/route-limit-rpm | 単一ゲートウェイインスタンスにおける 1 分あたりの最大リクエスト数(RPM)。バースト制限 = RPM × route-limit-burst-multiplier。制限を超えた場合、レスポンスボディは local_rate_limited となります。ステータスコード:ゲートウェイバージョン v1.2.23 より前の場合は 503、v1.2.23 以降の場合は 429。 | — |
mse.ingress.kubernetes.io/route-limit-rps | 単一ゲートウェイインスタンスにおける 1 秒あたりの最大リクエスト数(RPS)。バースト制限 = RPS × route-limit-burst-multiplier。制限を超えた場合、レスポンスボディは local_rate_limited となります。ステータスコード:ゲートウェイバージョン v1.2.23 より前の場合は 503、v1.2.23 以降の場合は 429。 | — |
mse.ingress.kubernetes.io/route-limit-burst-multiplier | RPM または RPS に適用される、バースト制限を計算するための乗数。 | 5 |
例 1:RPM による制限
example.com/test に対して、RPM を最大 100、バースト制限を 200(乗数 = 2)に設定します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rpm: "100"
mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rpm: "100"
mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:RPS による制限
example.com/test に対して、RPS を最大 10、デフォルトのバースト乗数(5、バースト制限 = 50)に設定します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rps: "10"
# デフォルトのバースト乗数は 5;バースト制限 = 10 × 5 = 50
# mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rps: "10"
# mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
グローバルな速度制限制御
MSE Ingress は Sentinel と統合しており、ゲートウェイクラスター全体にわたってルートの RPS 制限を強制します。
この機能は MSE Ingress ゲートウェイバージョン 1.2.25 以降を必要とします。
mse.ingress.kubernetes.io/rate-limit を使用して、ルートの最大 RPS を設定します。制限を超えた場合、デフォルトの応答はステータスコード 429 およびボディ sentinel rate limited です。カスタムの速度制限動作を以下の 2 つの方法のいずれかで構成できます — カスタム応答または自動転送。同時に有効にできるのは 1 つのみです。
カスタム応答
| アノテーション | 説明 | デフォルト |
|---|---|---|
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code | 制限を超えた場合の HTTP ステータスコード。 | 429 |
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type | レスポンスボディの Content-Type:text → text/plain; charset=UTF-8;json → application/json; charset=UTF-8。 | text |
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body | 制限を超えた場合のレスポンスボディの内容。 | sentinel rate limited |
例 1:デフォルト動作によるクラスター全体の RPS 制限の適用
example.com/test をクラスター全体で 100 RPS に制限します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:制限を超えた場合のカスタムエラー応答の返却
example.com/test を 100 RPS に制限し、ステータスコード 503 およびボディ server is overload を返却します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
自動転送
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url を使用して、制限を超えた場合にクライアントをフォールバック URL へ自動転送します。
例: example.com/test を 100 RPS に制限し、制限に達した場合に example.com/fallback へ自動転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
グローバルな同時実行制御
MSE Ingress は Sentinel と統合しており、ゲートウェイクラスター全体にわたってルートの同時実行リクエスト数を制限します。
この機能は MSE Ingress ゲートウェイバージョン 1.2.25 以降を必要とします。
mse.ingress.kubernetes.io/concurrency-limit を使用して、ゲートウェイクラスター全体にわたるルートの同時実行リクエスト数の上限を設定します。制限を超えた場合、デフォルトの応答はステータスコード 429 およびボディ sentinel rate limited です。カスタムの同時実行動作を以下の 2 つの方法のいずれかで構成できます — カスタム応答または自動転送。同時に有効にできるのは 1 つのみです。
カスタム応答
| アノテーション | 説明 | デフォルト |
|---|---|---|
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code | 制限を超えた場合の HTTP ステータスコード。 | 429 |
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type | レスポンスボディの Content-Type:text → text/plain; charset=UTF-8;json → application/json; charset=UTF-8。 | text |
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body | 制限を超えた場合のレスポンスボディの内容。 | sentinel rate limited |
例 1:デフォルト動作による同時実行制限の適用
クラスター全体で example.com/test への同時実行リクエストを 1000 に制限します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:制限を超えた場合のカスタムエラー応答の返却
同時実行数を 1000 に制限し、ステータスコード 503 およびボディ server is overload を返却します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
自動転送
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url を使用して、制限を超えた場合にクライアントをフォールバック URL へ自動転送します。
例: 同時実行数を 1000 に制限し、制限に達した場合に example.com/fallback へ自動転送します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
トラフィックミラーリング
トラフィックミラーリングは、プライマリリクエストパスに影響を与えることなく、ライブトラフィックをシャドウサービスへコピーします。ゲートウェイは各リクエストのコピーをミラーターゲットへ転送し、レスポンスを破棄します — ミラーリクエストはファイア・アンド・フォーゲットであり、元のリクエストの遅延や結果には影響しません。これにより、トラフィックミラーリングは新規サービスバージョンのテスト、運用監査、およびトラフィック分析に適しています。
リクエストがミラーされた場合、MSE Ingress はコピーされたリクエストの Host ヘッダーに自動的に -shadow を付加します(例:example.com は example.com-shadow になります)。
| アノテーション | 説明 | デフォルト |
|---|---|---|
mse.ingress.kubernetes.io/mirror-target-service | ミラートラフィックの送信先サービス。フォーマット:namespace/name:port。namespace および port は省略可能です。 | — |
mse.ingress.kubernetes.io/mirror-percentage | ミラーするトラフィックの割合。0 ~ 100 の整数。 | 100 |
例 1:すべてのトラフィックをミラー
example.com/test へのすべてのリクエストをサービス test/app:8080 へコピーします。
ミラーされたリクエストのHostヘッダーは自動的にexample.com-shadowに変更されます。シャドウターゲットからのレスポンスは破棄されます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:トラフィックの一部をミラー
example.com/test へのリクエストの 10 % を test/app:8080 へコピーします。
ミラーされたリクエストのHostヘッダーは自動的にexample.com-shadowに変更されます。シャドウターゲットからのレスポンスは破棄されます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io/mirror-percentage: 10
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io/mirror-percentage: 10
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
バックエンドサービスプロトコル:HTTPS および gRPC
デフォルトでは、MSE Ingress はバックエンドサービスへのリクエスト転送に HTTP を使用します。nginx.ingress.kubernetes.io/backend-protocol アノテーションを使用して、HTTPS または gRPC に切り替えることができます。
Kubernetes Service の仕様でポートnameにgrpcまたはhttp2が設定されている場合、MSE Ingress は自動的に gRPC または HTTP/2 を使用してリクエストを転送します —backend-protocol: "GRPC"アノテーションは不要です。これは標準の NGINX Ingress の動作とは異なります。
例 1:HTTPS を使用して転送
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:gRPC を使用して転送
2 つの方法があります。明示的な制御には方法 1(アノテーション)を使用し、gRPC の自動検出には方法 2(Service ポート名)を使用します。
方法 1:アノテーションを使用
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
方法 2:Service ポート名を使用
Service の仕様で name: grpc を設定します。MSE Ingress はこれを自動的に検出し、アノテーションなしで gRPC を使用します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
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
port: 80
protocol: TCP
selector:
app: demo-service<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
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</details>
バックエンドサービスの負荷分散アルゴリズム
負荷分散アルゴリズムは、ゲートウェイがリクエストを転送する際にバックエンドノードを選択する方法を決定します。
一般的な負荷分散アルゴリズム
nginx.ingress.kubernetes.io/load-balance を使用してアルゴリズムを設定します。デフォルト:round_robin。
| 値 | アルゴリズム |
|---|---|
round_robin | ラウンドロビン |
least_conn | 最少接続 |
random | ランダム |
指数加重移動平均 (EWMA) アルゴリズムはクラウドネイティブゲートウェイではサポートされていません。EWMA が構成された場合、ラウンドロビンにフォールバックします。
例: demo-service に対して最少接続負荷分散を使用します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
一貫したハッシュ
nginx.ingress.kubernetes.io/upstream-hash-by を使用して一貫したハッシュを有効化します。同じハッシュキーを持つリクエストは常に同じバックエンドノードへ転送されます。ハッシュキーは NGINX 変数、リクエストヘッダー、またはクエリパラメーターから導出できます。
| ハッシュキーの形式 | 説明 |
|---|---|
$request_uri | クエリパラメーターを含む完全なリクエストパス |
$host | リクエストホスト |
$remote_addr | クライアント IP アドレス |
$http_<header-name> | 特定のリクエストヘッダーの値(例:$http_x-stage) |
$arg_<param-name> | クエリパラメーターの値(例:$arg_x-stage) |
例 1:クライアント IP アドレスによるハッシュ
同じクライアント IP アドレスからのリクエストは常に同じバックエンドノードへルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:リクエストヘッダーによるハッシュ
X-Stage ヘッダーの値が同じリクエストは常に同じバックエンドノードへルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 3:クエリパラメーターによるハッシュ
X-Stage クエリパラメーターの値が同じリクエストは常に同じバックエンドノードへルーティングされます。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
サービスプリフェッチ(ウォームアップ)
サービスプリフェッチは、指定されたウォームアップ期間中に新しく追加されたバックエンドノードへのトラフィックを徐々に増加させます。これにより、ノードが完全に初期化される前にコールドスタートによってノードが過負荷になることを防ぎます。
mse.ingress.kubernetes.io/warmup を使用してウォームアップ期間(秒単位)を設定します。この機能はデフォルトで無効になっています。
サービスプリフェッチは、ラウンドロビンおよび最少接続の負荷分散アルゴリズムでのみ動作します。
例: demo-service に対して 30 秒のウォームアップウィンドウを有効化します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
Cookie アフィニティ(セッション維持)
Cookie アフィニティは、同一クライアントからのリクエストが常に同じバックエンドノードへルーティングされるように保証します。クライアントが一致する Cookie を含まないリクエストを送信すると、MSE Ingress は Cookie を生成して返却します。この Cookie を含む後続のリクエストは、同じノードへルーティングされます。
| アノテーション | 説明 | デフォルト |
|---|---|---|
nginx.ingress.kubernetes.io/affinity | アフィニティタイプ。有効な値は cookie のみです。 | — |
nginx.ingress.kubernetes.io/affinity-mode | アフィニティモード。有効な値は balanced のみです。 | balanced |
nginx.ingress.kubernetes.io/session-cookie-name | ハッシュキーとして使用される Cookie の名前。 | INGRESSCOOKIE |
nginx.ingress.kubernetes.io/session-cookie-path | 生成される Cookie のパス。 | / |
nginx.ingress.kubernetes.io/session-cookie-max-age | 生成される Cookie の有効期限(秒単位)。 | セッションレベル |
nginx.ingress.kubernetes.io/session-cookie-expires | 生成される Cookie の有効期限(秒単位)。 | セッションレベル |
例 1:デフォルト設定による Cookie アフィニティの有効化
Cookie 名:INGRESSCOOKIE、パス:/、セッションレベルの有効期限。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
例 2:カスタム Cookie 名および有効期限
Cookie 名:test、パス:/、有効期限:10 秒。
# Kubernetes v1.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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
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: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
ゲートウェイとバックエンドサービス間の接続プール
バックエンドサービスの接続プールを構成して、ゲートウェイとそのサービス間の同時接続数を制限します。これにより、バックエンドが過負荷になるのを防ぎます。
| アノテーション | 説明 |
|---|---|
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection | ゲートウェイとバックエンドサービス間の最大接続数。 |
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint | ゲートウェイと単一のバックエンドノード間の最大接続数。 |
mse.ingress.kubernetes.io/connection-policy-http-max-request-per-connection | ゲートウェイとバックエンドサービス間の接続あたりの最大 HTTP リクエスト数。 |
例: demo-service に対して、合計接続数を 10、ノードあたりの接続数を 2 に制限します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
クライアントとゲートウェイ間接続の TLS バージョンおよび暗号スイート
デフォルトでは、MSE Ingress は TLSv1.0 から TLSv1.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 バージョンおよび暗号スイートを制限します。
| アノテーション | 説明 | デフォルト |
|---|---|---|
mse.ingress.kubernetes.io/tls-min-protocol-version | 最小 TLS バージョン。有効な値:TLSv1.0、TLSv1.1、TLSv1.2、TLSv1.3。 | TLSv1.0 |
mse.ingress.kubernetes.io/tls-max-protocol-version | 最大 TLS バージョン。 | TLSv1.3 |
nginx.ingress.kubernetes.io/ssl-cipher | TLS 暗号スイート。カンマ区切り。TLSv1.0~TLSv1.2 を使用した TLS ハンドシェイクにのみ適用されます。 | — |
例: example.com を TLSv1.2 のみに制限します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>
ゲートウェイとバックエンドサービス間の相互 TLS
デフォルトでは、MSE Ingress はバックエンドサービスへのリクエスト転送に HTTP を使用します。nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" が設定されている場合、MSE Ingress はワンウェイ TLS を使用します — ゲートウェイはバックエンドサービスの証明書を認証し、その証明書は既知の認証局 (CA) によって発行されている必要があります。
相互 TLS (mTLS) では、双方が互いの証明書を認証します:ゲートウェイはバックエンド証明書を検証し、バックエンドサービスはゲートウェイのクライアント証明書を検証します。
| アノテーション | 説明 |
|---|---|
nginx.ingress.kubernetes.io/proxy-ssl-secret | mTLS 用にゲートウェイが使用するクライアント証明書。フォーマット:secretNamespace/secretName。 |
nginx.ingress.kubernetes.io/proxy-ssl-name | TLS ハンドシェイク中に使用されるサーバ名表示 (SNI) 値。 |
nginx.ingress.kubernetes.io/proxy-ssl-server-name | TLS ハンドシェイク中の SNI を有効または無効にします。 |
例: default 名前空間内のシークレット gateway-cert に保存されているクライアント証明書を使用して mTLS を構成します。
# Kubernetes v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact<details> <summary>Kubernetes v1.19 より前のバージョン</summary>
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80</details>