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

Microservices Engine:MSE Ingress の高度な使用方法

最終更新日:Mar 26, 2026

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-valuecanary-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-valuecanary-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-subsetmse.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-corsCORS を有効化します。
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-credentialsCORS リクエストで認証情報を許可します。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/xxxexample.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-redirectHTTP リクエストを HTTPS へ自動転送します。
nginx.ingress.kubernetes.io/force-ssl-redirectHTTP リクエストを HTTPS へ自動転送します。
MSE Ingress では、両方のアノテーションが同一に扱われ、どちらも HTTP を強制的に HTTPS へ自動転送します。

例: http://example.com/testhttps://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/testhttp://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/testhttp://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_502http_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-multiplierRPM または 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:texttext/plain; charset=UTF-8jsonapplication/json; charset=UTF-8text
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:texttext/plain; charset=UTF-8jsonapplication/json; charset=UTF-8text
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.comexample.com-shadow になります)。

アノテーション説明デフォルト
mse.ingress.kubernetes.io/mirror-target-serviceミラートラフィックの送信先サービス。フォーマット:namespace/name:portnamespace および 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 の仕様でポート namegrpc または 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.0TLSv1.1TLSv1.2TLSv1.3TLSv1.0
mse.ingress.kubernetes.io/tls-max-protocol-version最大 TLS バージョン。TLSv1.3
nginx.ingress.kubernetes.io/ssl-cipherTLS 暗号スイート。カンマ区切り。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-secretmTLS 用にゲートウェイが使用するクライアント証明書。フォーマット:secretNamespace/secretName
nginx.ingress.kubernetes.io/proxy-ssl-nameTLS ハンドシェイク中に使用されるサーバ名表示 (SNI) 値。
nginx.ingress.kubernetes.io/proxy-ssl-server-nameTLS ハンドシェイク中の 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>