Microservices Engine (MSE) Ingressは、Kubernetesクラスター内のサービスへの外部アクセスを管理するためのレイヤー7負荷分散を提供するAPIオブジェクトです。 このトピックでは、MSE Ingressの高度な使用方法について説明します。 これにより、クラスターのイングレストラフィックを管理できます。
カナリアリリース
MSE Ingressでは、複雑なトラフィックルーティングを処理するために、ヘッダー、クエリパラメーター、Cookie、または重みに基づいたカナリアリリースを設定できます。 Ingressリソース設定にアノテーションを追加することで、カナリアリリース機能を設定できます。 カナリアリリース機能を有効にするには、注釈nginx.ingress.kubernetes.io/canary: "true" を追加する必要があります。 このセクションでは、さまざまなアノテーションを使用してさまざまな種類のカナリアリリースメソッドを設定する方法について説明します。
4種類のカナリアリリースメソッドがすべて設定されている場合、MSE Ingressは次の優先順位でカナリアリリースメソッドを選択します。ヘッダーベースのカナリアリリースまたはクエリパラメーターベースのカナリアリリース> クッキーベースのカナリアリリース> 重みベースのカナリアリリース。
ヘッダーベースのカナリアリリース
nginx.ingress.kubernetes.io/canary-by-headerアノテーションのみを設定すると、リクエストはヘッダーに基づいて送信されます。ヘッダーの値が常にの場合、リクエストはカナリアバージョンに送信されます。 それ以外の場合、要求はカナリアバージョンに送信されません。nginx.ingress.kubernetes.io/canary-by-header-valueとnginx.ingress.kubernetes.io/canary-by-headerの両方のアノテーションを設定すると、リクエストヘッダーのキーと値がアノテーションで指定されたものと同じである場合にのみ、リクエストがカナリアバージョンに送信されます。 それ以外の場合、要求はカナリアバージョンに送信されません。
NGINX IngressとALB Ingressは、カナリアリリース中に最大2つのバージョンのサービスをサポートします。 MSE Ingressは、カナリアリリース中に3つ以上のバージョンのサービスをサポートします。 バージョンの数は制限されていません。
例:
リクエストヘッダーが
mse:alwaysの場合、リクエストはcanaryバージョンのdemo-service-canaryに送信されます。 それ以外の場合、リクエストは基本バージョンのデモサービスに送信されます。 サンプル設定:Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" 名前: demo-canary spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service-canary port: number: 80 パス: /hello pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /hello pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" 名前: demo-canary spec: ingressClassName: mse ルール: -http: paths: -パス: /hello バックエンド: serviceName: demo-service-canary servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse ルール: -http: paths: -パス: /hello バックエンド: serviceName: デモサービス servicePort: 80リクエストヘッダーが
mse:v1の場合、リクエストはカナリアバージョンdemo-service-canary-v1に送信されます。 リクエストヘッダーがmse:v2の場合、リクエストはカナリアバージョンdemo-service-canary-v2に送信されます。 それ以外の場合、リクエストは基本バージョンのデモサービスに送信されます。 サンプル設定:Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v1" 名前: demo-canary-v1 spec: ingressClassName: mse rules: -http: パス: - backend: service: 名前: demo-service-canary-v1 port: number: 80 パス: /hello pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v2" 名前: demo-canary-v2 spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service-canary-v2 port: number: 80 パス: /hello pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /hello pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v1" 名前: demo-canary-v1 spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: demo-service-canary-v1 servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v2" 名前: demo-canary-v2 spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: demo-service-canary-v2 servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: デモサービス servicePort: 80
パラメーターベースのカナリアリリースのクエリ
mse.ingress.kubernetes.io/canary-by-queryの設定
リクエストは、URLのクエリパラメータに基づいて送信されます。 リクエストのURLで、クエリパラメータキーがアノテーションで指定されたものと同じで、クエリパラメータ値が常にである場合、リクエストはカナリアバージョンに送信されます。 それ以外の場合、要求はカナリアバージョンに送信されません。
mse.ingress.kubernetes.io/canary-by-query値とmse.ingress.kubernetes.io/canary-by-query
リクエストのURLで、
クエリパラメータキーとクエリパラメータ値がアノテーションで指定されたものと同じ場合、リクエストはカナリアバージョンに送信されます。 それ以外の場合、要求はカナリアバージョンに送信されません。説明ヘッダーベースのカナリアリリースは、クエリパラメータベースのカナリアリリースと一緒に使用できます。 両方のカナリアリリースメソッドの一致条件が満たされている場合にのみ、要求がカナリアバージョンに送信されます。
例:
リクエストURLのクエリパラメーターが
canary:grayに設定されている場合、リクエストはcanaryバージョンdemo-service-canaryに送信されます。 それ以外の場合、リクエストは基本バージョンのデモサービスに送信されます。 サンプル設定:Kubernetes V1.19以降を実行するクラスター
apiVersion:networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" mse.ingress.kubernetes.io/canary-by-query: "canary" mse.ingress.kubernetes.io/canary-by-query-value: "gray" 名前: demo-canary spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service-canary port: number: 80 パス: /hello pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /hello pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/canary: "true" mse.ingress.kubernetes.io/canary-by-query: "canary" mse.ingress.kubernetes.io/canary-by-query-value: "gray" 名前: demo-canary spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: demo-service-canary servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: デモサービス servicePort: 80リクエストURLのクエリパラメーターが
canary:grayに設定され、x-user-id: testがリクエストヘッダーに含まれている場合、リクエストはcanaryバージョンのdemo-service-canaryに送信されます。 それ以外の場合、リクエストは基本バージョンのデモサービスに送信されます。 サンプル設定:Kubernetes V1.19以降を実行するクラスター
apiVersion:networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: 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" 名前: demo-canary spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service-canary port: number: 80 パス: /hello pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /hello pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: 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" 名前: demo-canary spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: demo-service-canary servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: デモサービス servicePort: 80
クッキーベースのカナリアリリース
nginx.ingress.kubernetes.io/canary-by-cookieアノテーションを設定すると、リクエストはcookieに基づいて送信されます。 cookieがalwaysに設定されている場合、リクエストはカナリアバージョンに送信されます。 それ以外の場合、要求はカナリアバージョンに送信されません。
cookieベースのカナリアリリースを設定する場合、カスタムcookie値はサポートされません。 設定されたcookie値は常にである必要があります。
たとえば、リクエストcookieがdemo=alwaysの場合、リクエストはcanaryバージョンのdemo-service-canaryに送信されます。 それ以外の場合、リクエストは基本バージョンのデモサービスに送信されます。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
名前: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: demo-service-canary
port:
number: 80
パス: /hello
pathType: 正確
---
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
名前: デモ
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /hello
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
名前: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
名前: デモ
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /hello
backend:
serviceName: デモサービス
servicePort: 80 体重ベースのカナリアリリース
注釈 | 説明 |
nginx.ingress.kubernetes.io/canary-weight | カナリアバージョンに送信されるリクエストの割合を指定します。 値は0から100の範囲の整数です。 |
nginx.ingress.kubernetes.io/canary-weight-total | 合計の重みを指定します。 デフォルト値:100 |
たとえば、カナリアバージョンのdemo-service-canary-v1の重みを30% に設定し、カナリアバージョンのdemo-service-canary-v2の重みを20% に設定し、基本バージョンのデモサービスの重みを50% に設定できます。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
名前: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: demo-service-canary-v1
port:
number: 80
パス: /hello
pathType: 正確
---
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
名前: demo-canary-v2
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: demo-service-canary-v2
port:
number: 80
パス: /hello
pathType: 正確
---
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
名前: デモ
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /hello
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
名前: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
名前: demo-canary-v2
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /hello
backend:
serviceName: demo-service-canary-v2
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
名前: デモ
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /hello
backend:
serviceName: デモサービス
servicePort: 80 サービスサブセット
サービスサブセットは、サービスが複数の展開に関連付けられるシナリオに適しています。 Ingressを使用して、サービスのポッドのサブセットにリクエストを転送できます。 ほとんどの場合、リクエストは特定のラベルを持つサービスポッドに転送されます。 次のいずれかの方法を使用して、サービスサブセットを設定できます。
MseIngressConfigでのポッドラベルの使用
注釈mse.ingress.kubernetes.io/service-subsetを使用して、サービスサブセットを設定します。 デフォルトでは、MseIngressConfigで設定されたサービスサブセットは、opensergo.io/canaryというプレフィックスが付いたポッドラベルにマップされます。 このアノテーションの意味は次のとおりです。
このアノテーションが
"またはbaseに設定されている場合、リクエストは、ラベルにopensergo.io/canary: "が含まれているポッド、またはラベルキーの先頭にopensergo.io/canaryが付いていないポッドに転送されます。 このようにして、リクエストは空のラベルを持つポッドまたはラベルを持たないポッドに転送されます。このアノテーションが "" またはbaseに設定されていない場合、リクエストはラベルにopensergo.io/canary-{指定値}: {指定値} を含むポッドに転送されます。 たとえば、このアノテーションを
grayに設定した場合、リクエストは、ラベルにopensergo.io/canary-gray: grayが含まれているポッドに転送されます。
たとえば、go-httpbinという名前のKubernetesサービスは、2つのデプロイに関連付けられています。 1つのデプロイメントで管理されるポッドには、プレフィックスがopensergo.io/canaryであるラベルキーはありません。 他の展開で管理されるポッドには、canaryラベルopensergo.io/canary-gray: grayがあります。 サンプル設定:
# go-httpbin k8sサービス
apiVersion: v1
種類: サービス
メタデータ:
名前: go-httpbin
namespace: デフォルト
spec:
ポート:
- port: 8080
protocol: TCP
セレクタ:
アプリ: go-httpbin
---
# go-httpbinベースの展開
apiVersion: apps/v1
kind: 配置
メタデータ:
名前: go-httpbin-base
namespace: デフォルト
spec:
replicas: 1
セレクタ:
matchLabels:
アプリ: go-httpbin
template:
metadata:
labels:
アプリ: go-httpbin
仕様:
containers:
-画像: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
-"-- version=base"
imagePullPolicy: Always
名前: go-httpbin
---
# go-httpbinグレー展開
apiVersion: apps/v1
kind: 配置
メタデータ:
名前: go-httpbin-gray
namespace: デフォルト
spec:
replicas: 1
セレクタ:
matchLabels:
アプリ: go-httpbin
template:
metadata:
labels:
アプリ: go-httpbin
opensergo.io /カナリアグレー: グレー
仕様:
containers:
-画像: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
-"-- version=gray"
imagePullPolicy: Always
名前: go-httpbin e example.com/testリクエストのヘッダーにx-user-id: testが含まれている場合、リクエストはgo-httpbin-grayに転送されます。 それ以外の場合、リクエストはhttpbin-baseに転送されます。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion:networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
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"
# canaryラベルopensergo.io/canary-gray: grayを持つポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: グレー
名前: demo-canary
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: go-httpbin
port:
数: 8080
パス: /test
pathType: 正確
---
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
# ラベルの先頭にopensergo.io/canaryが付いていないポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: ""
名前: デモ
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: go-httpbin
port:
数: 8080
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
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"
# canaryラベルopensergo.io/canary-gray: grayを持つポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: グレー
名前: demo-canary
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /test
backend:
# go-httpbinサービスを設定し、アノテーションでバージョンを指定します。
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
# ラベルの先頭にopensergo.io/canaryが付いていないポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: ""
名前: デモ
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /test
backend:
# go-httpbinサービスを設定し、アノテーションでバージョンを指定します。
serviceName: go-httpbin
servicePort: 8080 カスタムラベルの使用
mse.ingress.kubernetes.io/service-subsetとmse.ingress.kubernetes.io/subset-labelsの両方のアノテーションを使用して、サブセットが属するポッドを定義するために使用されるカスタムラベルを設定できます。
この場合、サブセットは、プレフィックスがopensergo.io/canaryであるラベルにマッピングされなくなります。
たとえば、go-httpbinという名前のKubernetesサービスは、2つのデプロイに関連付けられています。 1つのデプロイメントで管理されるポッドには、プレフィックスがopensergo.io/canaryであるラベルキーはありません。 他の展開で管理されるポッドには、canaryラベルopensergo.io/canary-gray: grayがあります。 サンプル設定:
# go-httpbin k8sサービス
apiVersion: v1
種類: サービス
メタデータ:
名前: go-httpbin
namespace: デフォルト
spec:
ポート:
- port: 8080
protocol: TCP
セレクタ:
アプリ: go-httpbin
---
# go-httpbinベースの展開
apiVersion: apps/v1
kind: 配置
メタデータ:
名前: go-httpbin-base
namespace: デフォルト
spec:
replicas: 1
セレクタ:
matchLabels:
アプリ: go-httpbin
template:
metadata:
labels:
アプリ: go-httpbin
仕様:
containers:
-画像: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
-"-- version=base"
imagePullPolicy: Always
名前: go-httpbin
---
# go-httpbinベースグレー
apiVersion: apps/v1
kind: 配置
メタデータ:
名前: go-httpbin-gray
namespace: デフォルト
spec:
replicas: 1
セレクタ:
matchLabels:
アプリ: go-httpbin
template:
metadata:
labels:
アプリ: go-httpbin
バージョン: グレー
仕様:
containers:
-画像: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
-"-- version=gray"
imagePullPolicy: Always
名前: go-httpbin e example.com/testリクエストのヘッダーにx-user-id: testが含まれている場合、リクエストはgo-httpbin-grayに転送されます。 それ以外の場合、リクエストはhttpbin-baseに転送されます。
Kubernetes V1.19以降を実行するクラスター
apiVersion:networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
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"
# canaryラベルバージョン: grayのポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: グレー
mse.ingress.kubernetes.io/subset-labels: バージョングレー
名前: demo-canary
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: go-httpbin
port:
数: 8080
パス: /test
pathType: 正確
---
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
# ラベルの先頭にopensergo.io/canaryが付いていないポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: ""
名前: デモ
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: go-httpbin
port:
数: 8080
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
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"
# canaryラベルバージョン: grayのポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: グレー
mse.ingress.kubernetes.io/subset-labels: バージョングレー
名前: demo-canary
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /test
backend:
# go-httpbinサービスを設定し、アノテーションでバージョンを指定します。
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
# ラベルの先頭にopensergo.io/canaryが付いていないポッドにリクエストを転送します。
mse.ingress.kubernetes.io/service-subset: ""
名前: デモ
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /test
backend:
# go-httpbinサービスを設定し、アノテーションでバージョンを指定します。
serviceName: go-httpbin
servicePort: 8080 CORS
クロスオリジンリソース共有 (CORS) を使用すると、webアプリケーションサーバーはクロスオリジンリソースにアクセスし、クロスオリジンデータ送信を保護できます。 CORSの詳細については、「クロスオリジンリソース共有 (CORS) 」をご参照ください。
注釈 | 説明 |
nginx.ingress.kubernetes.io/enable-cors | CORSを有効にするかどうかを指定します。 |
nginx.ingress.kubernetes.io/cors-allow-origin | 許可されるサードパーティのサイトを指定します。 サードパーティのサイトはコンマ (,) で区切ります。 ワイルドカード (*) がサポートされています。 デフォルト値: * 。 この値は、すべてのサードパーティサイトがCORSに許可されていることを示します。 |
nginx.ingress.kubernetes.io/cors-allow-methods | GET、POST、PUTなどの許可されたリクエストメソッドを指定します。 リクエストメソッドはコンマ (,) で区切ります。 ワイルドカード (*) がサポートされています。 デフォルト値: 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リクエストに含めることができるかどうかを指定します。 デフォルトでは、CORS操作中に資格情報を渡すことができます。 |
nginx.ingress.kubernetes.io/cors-max-age | 事前チェック結果をキャッシュできる最大期間を指定します。 単位は秒です。 デフォルト値: 1728000 |
たとえば、許可されたサードパーティのWebサイトとしてconfigurがe example.comされ、許可されたリクエストメソッドとしてGETとPOSTが、許可されたリクエストヘッダーとしてX-Foo-Barが、CORS操作中に資格情報を渡すことを許可しません。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /hello
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /hello
backend:
serviceName: デモサービス
servicePort: 80 正規表現マッチ
MSE Ingressは、標準のKubernetes Ingressでサポートされている完全一致とプレフィックス一致に加えて、正規表現一致をサポートしています。 注釈nginx.ingress.kubernetes.io/use-regex: trueを使用して、Ingress Specで定義されているパスの一致を正規表現の一致に変更できます。
予想されるドメイン名iがs example.comすると、リクエストパスが /appまたは /testで始まるリクエストがサービスデモに転送されます。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/use-regex: 'true'
名前: regex-match
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
名前: デモ
port:
数: 8080
パス: /(アプリ | テスト)/(.*)
pathType: プレフィックス V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/use-regex: 'true'
名前: regex-match
namespace: デフォルト
spec:
ingressClassName: mse
rules:
- http:
paths:
-パス: /(アプリ | テスト)/(.*)
backend:
serviceName: デモ
servicePort: 8080 パスとホストの書き換え
リクエストが宛先バックエンドサービスに転送される前に、書き換え操作を実行して、リクエスト内の元のパスとホストを変更できます。
注釈 | 説明 |
nginx.ingress.kubernetes.io /書き換え対象 | 書き換え操作の宛先パスを指定します。 キャプチャグループがサポートされています。 |
nginx.ingress.kubernetes.io/upstream-vhost | 書き換え先ホストを指定します。 |
パスの書き換え
e example.com/testリクエストがバックエンドサービスに転送される前に、s example.com/dev. e example.com/test サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/rewrite-target: "/dev" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/rewrite-target: "/dev" 名前: デモ spec: ingressClassName: mse rules: - http: paths: -パス: /test pathType: 正確 backend: serviceName: デモサービス servicePort: 80e example.com/v1/xxxリクエストがバックエンドサービスに転送される前に、プレフィックス /v1を削除し、リクエストをs example.com/xxx. サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/rewrite-target: "/$1" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /v1/(.*) pathType: プレフィックスV1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/rewrite-target: "/$1" 名前: デモ spec: ingressClassName: mse rules: - http: paths: -パス: /v1/(.*) pathType: プレフィックス backend: serviceName: デモサービス servicePort: 80e example.com/v1/xxxリクエストがバックエンドサービスに転送される前に、プレフィックス /v1を /v2に変更し、リクエストをs example.com/v2/xxx. サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /v1/(.*) pathType: プレフィックスV1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1" 名前: デモ spec: ingressClassName: mse rules: - http: paths: -パス: /v1/(.*) pathType: プレフィックス backend: serviceName: デモサービス servicePort: 80
ホストの書き換え
たとえば、e example.com/test要求がバックエンドサービスに転送される前に、s test.com/test. をe example.com/testします。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 Redirect
リダイレクトは、元のクライアント要求を宛先要求に変更するために使用されます。
HTTPからHTTPSへのリダイレクト
注釈 | 説明 |
nginx.ingress.kubernetes.io/ssl-リダイレクト | HTTPリクエストをHTTPSリクエストにリダイレクトするかどうかを指定します。 |
nginx.ingress.kubernetes.io/force-ssl-redirect | HTTPリクエストをHTTPSリクエストにリダイレクトするかどうかを指定します。 |
MSE Ingressは2つのアノテーションを区別しません。 2つのアノテーションは両方とも、HTTPリクエストをHTTPSリクエストに強制的にリダイレクトするために使用されます。
たとえば、リクエスト http://example.com/test を https://example.com/test. にリダイレクトします。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 永久リダイレクト
注釈 | 説明 |
nginx.ingress.kubernetes.io/permanent-redirect | 永久リダイレクトの宛先URLを指定します。 宛先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
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/permanent-redirect: " http://example.com/app "
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/permanent-redirect: " http://example.com/app "
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 一時的なリダイレクト
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
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/temporal-redirect: " http://example.com/app "
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/temporal-redirect: " http://example.com/app "
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 ヘッダー制御
ヘッダーコントロールを使用すると、MSE Ingressがリクエストをバックエンドサービスに転送する前に、リクエストヘッダーを追加、削除、または変更できます。 ヘッダーコントロールでは、MSE Ingressが受信した応答をクライアントに転送する前に、応答ヘッダーを追加、削除、または変更することもできます。
リクエストヘッダー制御
注釈 | 説明 |
mse.ingress.kubernetes.io/request-header-control-add | リクエストがバックエンドサービスに転送されるときにリクエストに追加されるヘッダーを指定します。 ヘッダーが存在する場合、その値は元の値の後に連結されます。 次の構文が使用されます。
|
mse.ingress.kubernetes.io/request-header-control-update | リクエストがバックエンドサービスに転送されるときにリクエストで変更されるヘッダーを指定します。 ヘッダーが存在する場合、その値は元の値を上書きします。 次の構文が使用されます。
|
mse.ingress.kubernetes.io/request-header-control-remove | リクエストがバックエンドサービスに転送されたときにリクエストから削除されるヘッダーを指定します。 次の構文が使用されます。
|
例:
ヘッダーfoo: barとtest: trueをreques t example.com/test. に追加します サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/request-header-control-add: | fooバー テストtrue 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/request-header-control-add: | fooバー テストtrue 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80ヘッダ制御は、カナリアバージョンに送信される要求を識別するためにカナリアリリースと共に使用することができる。 リクエストヘッダーがmse: v1の場合、リクエストはカナリアバージョンdemo-service-canary-v1に送信され、ヘッダーstage: grayがリクエストに追加されます。 それ以外の場合は、リクエストは基本バージョンのデモサービスに送信され、ヘッダーステージ: プロダクションがリクエストに追加されます。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: 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" 名前: demo-canary-v1 spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service-canary-v1 port: number: 80 パス: /hello pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/request-header-control-add: "stage production" 名前: デモ spec: ingressClassName: mse rules: - http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /hello pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: 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" 名前: demo-canary-v1 spec: ingressClassName: mse rules: - http: paths: -パス: /hello backend: serviceName: demo-service-canary-v1 servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/request-header-control-add: | fooバー テストtrue 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /hello backend: serviceName: デモサービス servicePort: 80
応答ヘッダー制御
注釈 | 説明 |
mse.ingress.kubernetes.io/response-header-control-add | 応答がクライアントに転送される前に、バックエンドサービスから受信した応答に追加されるヘッダーを指定します。 ヘッダーが存在する場合、その値は元の値の後に連結されます。 次の構文が使用されます。
|
mse.ingress.kubernetes.io/response-header-control-update | 応答がクライアントに転送される前にバックエンドサービスから受信した応答で変更されるヘッダーを指定します。 ヘッダーが存在する場合、その値は元の値を上書きします。 次の構文が使用されます。
|
mse.ingress.kubernetes.io/response-header-control-remove | 応答がクライアントに転送される前に、バックエンドサービスから受信した応答から削除されるヘッダーを指定します。 次の構文が使用されます。
|
たとえば、要求t example.com/test. への応答からヘッダーreq-cost-timeを削除します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 再試行
MSE Ingressは、エラー要求を自動的に再試行するために使用できるルートレベルの再試行設定を提供します。 ビジネス要件に基づいて再試行条件を指定できます。 たとえば、接続の確立が失敗した場合、バックエンドサービスが利用できない場合、指定されたHTTPステータスコードが返された場合に、リクエストを再試行するように設定できます。
注釈 | 説明 |
nginx.ingress.kubernetes.io/proxy-next-upstream-tries | リクエストの再試行の最大回数を指定します。 デフォルト値: 3。 |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout | リクエストの再試行のタイムアウト期間を指定します。 単位は秒です。 デフォルトでは、タイムアウト期間は設定されていません。 |
nginx.ingress.kubernetes.io/proxy-next-upstream | リトライ条件を指定します。 複数の再試行条件はコンマ (,) で区切ります。 デフォルト値:
|
たとえば、example/testリクエストが利用可能です。 リクエストの場合、リクエストの再試行の最大数を2に設定し、再試行タイムアウト期間を5秒に設定し、ステータスコード502が返された場合にのみ再試行をトリガーし、べきでないリクエストの再試行を有効にします。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 IPアドレスホワイトリストとブラックリストに基づくアクセス制御
MSE Ingressは、ドメイン名とルートレベルでIPアドレスのホワイトリストとブラックリストを提供します。 ルートレベルのIPアドレスホワイトリストとブラックリストは、ドメイン名レベルのIPアドレスホワイトリストとブラックリストよりも優先されます。
ルートレベルのIPアドレスホワイトリストとブラックリスト
注釈 | 説明 |
nginx.ingress.kubernetes.io/whitelist-source-range | 特定のルートのIPアドレスホワイトリストを指定します。 IPアドレスとCIDRブロックがサポートされています。 IPアドレスまたはCIDRブロックはコンマ (,) で区切ります。 |
mse.ingress.kubernetes.io/blacklist-source-range | 特定のルートのIPアドレスブラックリストを指定します。 IPアドレスとCIDRブロックがサポートされています。 IPアドレスまたはCIDRブロックはコンマ (,) で区切ります。 |
例:
クライアントIPアドレス1.1.xx.xxからのo example.com/testへのアクセスを許可します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80クライアントIPアドレス2.2.xx.xxからのo example.com/testアクセスを拒否します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80
ドメイン名レベルのIPアドレスホワイトリストとブラックリスト
注釈 | 説明 |
mse.ingress.kubernetes.io/domain-whitelist-source-range | 特定のドメイン名のIPアドレスホワイトリストを指定します。 ルートレベルのIPアドレスホワイトリストは、ドメイン名レベルのIPアドレスホワイトリストよりも優先されます。 IPアドレスとCIDRブロックがサポートされています。 IPアドレスまたはCIDRブロックはコンマ (,) で区切ります。 |
mse.ingress.kubernetes.io /ドメイン-blacklist-source-range | 特定のドメイン名のIPアドレスブラックリストを指定します。 ルートレベルのIPアドレスブラックリストは、ドメイン名レベルのIPアドレスブラックリストよりも優先されます。 IPアドレスとCIDRブロックがサポートされています。 IPアドレスまたはCIDRブロックはコンマ (,) で区切ります。 |
例:
クライアントIPアドレス1.1.xx.xxおよび2.2.xx.xxからドメイン名e example.comのすべてのルートへのアクセスを許可します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確 - backend: service: name: app-service port: number: 80 パス: /app pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80 -パス: /app backend: serviceName: app-service servicePort: 80ドメイン名レベルでIPアドレスホワイトリストとブラックリストを使用し、ルートレベルでIPアドレスホワイトリストとブラックリストを使用します。 クライアントIPアドレス1.1.xx.xxおよびクライアントIPアドレス2.2.xx.xxからe example.comドメイン名のすべてのルートへのアクセスを許可し、クライアントIPアドレス3.3.xx.xxからのみe example.com/orderのルートへのアクセスを許可します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 名前: demo-domain spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確 - backend: service: name: app-service port: number: 80 パス: /app pathType: 正確 --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X 名前: demo-route spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /order pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 名前: demo-domain spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80 -パス: /app backend: serviceName: app-service servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X 名前: demo-route spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /order backend: serviceName: デモサービス servicePort: 80
単一ゲートウェイ調整
MSE Ingressでは、ルートレベルで単一のゲートウェイインスタンスのスロットリングポリシーを設定できます。 スロットリングポリシーは、ゲートウェイレプリカのルートで一致するリクエストの数が、指定された期間内に設定されたしきい値を超えないようにします。
システムは、設定されたしきい値に基づいて単一のゲートウェイインスタンスに対してスロットリングを実行します。 ゲートウェイクラスターのルートのトラフィックをスロットルする場合は、代わりにグローバルスロットル制御ポリシーを使用できます。
注釈 | 説明 |
mse.ingress.kubernetes.io/route-limit-rpm | ゲートウェイでルーティングされる1分あたりの最大リクエスト数 (RPM) を指定します。 RPMの最大数のバースト制限は、指定された値にmse.ingress.kubernetes.io/route-limit-burst-multiplierを掛けた値に等しくなります。 スロットリングがトリガーされると、応答本文の内容は
|
mse.ingress.kubernetes.io/route-limit-rps | ゲートウェイでルーティングされる1秒あたりの最大リクエスト数 (RPS) を指定します。 RPSの最大数のバースト制限は、指定された値にmse.ingress.kubernetes.io/route-limit-burst-multiplierを掛けた値に等しくなります。 スロットリングがトリガーされると、応答本文の内容は
|
mse.ingress.kubernetes.io/route-limit-burst-multiplier | バースト制限の乗数を指定します。 既定値:5 |
例:
e example.com/testリクエストの場合、RPMの最大数を100に設定し、RPMの最大数のバースト制限を200に設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/route-limit-rpm: "100" mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/route-limit-rpm: "100" mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80e example.com/testリクエストの場合、RPSの最大数を10に設定し、RPSの最大数のバースト制限を50に設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/route-limit-rps: "10" # デフォルト値は5です。 # mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: mse.ingress.kubernetes.io/route-limit-rps: "10" # デフォルト値は5です。 # mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80
グローバルスロットリング制御
MSE IngressはSentinelと統合されており、ルートレベルでゲートウェイクラスターのグローバルスロットル制御を提供します。 グローバルスロットリング制御を実装するには、ゲートウェイクラスター内のルート上のRPSの最大数を指定する必要があります。
この機能を使用するには、MSE Ingressゲートウェイのバージョンが1.2.25以降であることを確認する必要があります。
mse.ingress.kubernetes.io/rate-limitアノテーションを使用して、ゲートウェイクラスター内のルート上のRPSの最大数を指定できます。 デフォルトでは、応答コードは429で、スロットリングがトリガーされると応答本文はセンチネルレート制限されます。 MSE Ingressには、カスタムスロットリング動作を設定するための2つの方法があります。カスタムレスポンスとリダイレクトです。 2つの方法のいずれかのみを選択できます。
カスタム応答
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: スロットリングがトリガーされたときのレスポンスコード。 デフォルトの応答コードは429です。mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type: スロットリングがトリガーされたときのレスポンスボディタイプ。 デフォルトのレスポンスボディタイプはtextです。このアノテーションを
textに設定した場合、レスポンスのContent-Type値はtext/plain; charset=UTF-8になります。このアノテーションを
jsonに設定した場合、レスポンスのContent-Type値はapplication/json; charset=UTF-8になります。
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: スロットリングがトリガーされたときのレスポンスボディ。 デフォルト値はセンチネルレート制限です。
例1: ゲートウェイクラスターのe example.com/testリクエストの最大RPS数を100に設定し、デフォルトのスロットリング動作を維持します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/rate-limit: "100"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/rate-limit: "100"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 例2: ゲートウェイクラスターのe example.com/testリクエストの最大RPS数を100に設定し、スロットリングがトリガーされるとレスポンスコードを503に設定します。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 リダイレクト
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: スロットリングがトリガーされたときのリダイレクトURL。
例1: ゲートウェイクラスター内のe example.com/testリクエストの最大RPS数を100に設定し、スロットリングがトリガーされたときにリダイレクトURLをo example.com/fallbackします。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 グローバル同時実行制御
MSE IngressはSentinelと統合されており、ルートレベルでゲートウェイクラスターのグローバル同時実行制御を提供します。 グローバル同時実行制御を実装するには、ゲートウェイクラスター内のルートで処理されるリクエストの最大数を指定する必要があります。
この機能を使用するには、MSE Ingressゲートウェイのバージョンが1.2.25以降であることを確認する必要があります。
mse.ingress.kubernetes.io/concurrency-limitアノテーションを使用して、ゲートウェイクラスターのルートで処理できるリクエストの最大数を指定できます。 グローバル同時実行制御がトリガーされると、応答コードが429され、応答本文はセンチネルレートが制限されます。 MSE Ingressには、カスタム同時実行動作を設定する2つの方法があります。カスタム応答とリダイレクトです。 2つの方法のいずれかのみを選択できます。
カスタム応答
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 同時実行制御がトリガーされたときのレスポンスコード。 デフォルトの応答コードは429です。mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type: 同時実行制御がトリガーされたときの応答ボディタイプ。 デフォルトのレスポンスボディタイプはtextです。このアノテーションを
textに設定した場合、レスポンスのContent-Type値はtext/plain; charset=UTF-8になります。このアノテーションを
jsonに設定した場合、レスポンスのContent-Type値はapplication/json; charset=UTF-8になります。
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: 同時実行制御がトリガーされたときのレスポンスボディ。 デフォルト値はセンチネルレート制限です。
例1: ゲートウェイクラスターで処理されるf example.com/testリクエストの最大数を1000に設定し、デフォルトの同時実行制御動作を保持します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 例2: ゲートウェイクラスターで処理されるm example.com/testからのリクエストの最大数を1,000に設定し、レスポンスコードを503に設定し、並行制御がトリガーされるとレスポンスボディがサーバーにオーバーロードされます。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
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"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 リダイレクト
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: 同時実行制御がトリガーされたときのリダイレクトURL。
同時実行制御がトリガーされたときに、ゲートウェイクラスターで処理されるf example.com/testリクエストの最大数を1000に設定し、リダイレクトURLをo example.com/fallbackします。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
名前: デモ
spec:
ingressClassName: mse
ルール:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 トラフィックミラーリング
指定したサービスにトラフィックをコピーするようにトラフィックミラーリングを設定できます。 トラフィックミラーリングは、運用監査やトラフィックテストなどのシナリオに適しています。
mse.ingress.kubernetes.io/mirror-target-service: コピーされたトラフィックが転送される宛先サービス。 サービス形式はnamespace/name:portです。
namespace: Kubernetesサービスが存在する名前空間。 このパラメーターはオプションです。 デフォルトの名前空間は、Ingressゲートウェイが存在する名前空間です。
name: Kubernetesサービスの名前。 This parameter is required.
port: ミラーリングされたトラフィックが転送されるKubernetesサービスポート。 このパラメーターはオプションです。 デフォルトでは、最初のポートが使用されます。
mse.ingress.kubernetes.io/mirror-percentage: ミラーリングされたトラフィックの割合。 有効な値: 0-100 デフォルト値: 100
コピーされたトラフィックが宛先サービスに転送されると、-shadowサフィックスが元のリクエストのHostヘッダーに自動的に追加されます。
例えば、m example.com/testからの要求はコピーされ、宛先サービスtest/app:8080に転送される。
この例では、コピーされたトラフィックが宛先サービスに転送されるときに、Hostヘッダーの値がo example.comシャドウで自動的に変更されます。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
注釈:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
名前: デモ
spec:
ingressClassName: mse
ルール:
-host: example.com
http:
パス:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 たとえば、m example.com/testからの要求がコピーされ、宛先サービスtest/app:8080に転送され、ミラーリングされたトラフィックの割合が10% になります。
この例では、コピーされたトラフィックが宛先サービスに転送されるときに、Hostヘッダーの値がo example.comシャドウで自動的に変更されます。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io /ミラーパーセンテージ: 10
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
パス:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io /ミラーパーセンテージ: 10
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 バックエンドサービスプロトコル: HTTPSおよびgRPC
デフォルトでは、MSE IngressはHTTPを使用してリクエストをバックエンドサービスコンテナに転送します。 バックエンドサービスコンテナがHTTPSを使用している場合、nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" という注釈を使用して、リクエストをバックエンドサービスコンテナに転送できます。 バックエンドサービスコンテナがgRPCを使用している場合、nginx.ingress.kubernetes.io/backend-protocol: "GRPC" という注釈を使用して、リクエストをバックエンドサービスコンテナに転送できます。
バックエンドサービスが属するKubernetesサービスのリソース設定のポートの名前にgRPCまたはHTTP/2が指定されている場合、MSE Ingressは自動的にgRPCまたはHTTP/2プロトコルを使用してバックエンドサービスコンテナにリクエストを転送します。 注釈nginx.ingress.kubernetes.io/backend-protocol: "GRPC" を設定する必要はありません。 この実装は、NGINX Ingressの実装とは異なります。
例:
HTTPSを使用して、サンプル /テストリクエストをバックエンドサービスに転送します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 path: / pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80gRPCを使用して、サンプル /テスト要求をバックエンドサービスに転送します。 次の方法を使用できます。
方法1: 注釈を使用する。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/backend-protocol: "GRPC" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/backend-protocol: "GRPC" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80方法2: Ingressリソース設定でspec > ports > nameを使用します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /order pathType: 正確 --- apiVersion: v1 種類: サービス メタデータ: 名前: demo-service spec: ポート: -名前: grpc port: 80 protocol: TCP セレクタ: app: デモサービスV1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80 --- apiVersion: v1 種類: サービス メタデータ: 名前: demo-service spec: ポート: -名前: grpc port: 80 protocol: TCP セレクタ: app: デモサービス
バックエンドサービスの負荷分散アルゴリズム
負荷分散アルゴリズムは、ゲートウェイがバックエンドサービスに要求を転送するときにノードを選択する方法を決定します。
一般的な負荷分散アルゴリズム
nginx.ingress.kubernetes.io/load-balance: バックエンドサービスで使用される一般的な負荷分散アルゴリズムを指定します。 デフォルト値: round_robin。 有効な値:
round_robin: ラウンドロビンに基づく負荷分散。
least_conn: 最小接続に基づく負荷分散。
random: ランダムな負荷分散。
クラウドネイティブゲートウェイは、指数加重移動平均 (EWMA) アルゴリズムをサポートしていません。 EWMAアルゴリズムを設定すると、アルゴリズムはラウンドロビン負荷分散アルゴリズムにロールバックされます。
たとえば、デモサービスのバックエンドサービスに最小接続負荷分散アルゴリズムを設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /order
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 一貫性のあるハッシュに基づく負荷分散アルゴリズム
コンシステントハッシングに基づく負荷分散アルゴリズムは、要求親和性を有する。 同じ特性を持つリクエストは、常に同じノードに配信されます。 MSE Ingressでは、NGINX変数、リクエストヘッダー、およびリクエストパスパラメーターをハッシュキーとして使用できます。
nginx.ingress.kubernetes.io/upstream-hash-by: コンシステントハッシングに基づく負荷分散アルゴリズムを指定します。 クラウドネイティブゲートウェイは、次のタイプのコンシステントハッシングをサポートします。
NGINX変数に基づく一貫したハッシュ:
$request_uri: ハッシュキーとして使用されるリクエストパス。 パスパラメータが含まれています。
$host: ハッシュキーとして使用されるリクエストホスト。
$remote_addr: ハッシュキーとして使用されるクライアントIPアドレス。
リクエストヘッダーに基づく一貫したハッシュ。 $http_headerNameを設定するだけです。
要求パスパラメータに基づく一貫したハッシュ。 $arg_varNameを設定するだけです。
例:
リクエストのクライアントIPアドレスをハッシュキーとして使用します。 クライアントIPアドレスからのリクエストは、常に同じノードに配信されます。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80リクエストヘッダーX-Stageをハッシュキーとして使用し、リクエストヘッダーX-Stageと同じ値のリクエストを同じノードに配布します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80リクエストパスパラメーターX-Stageをハッシュキーとして使用し、リクエストパスパラメーターX-Stageの値が同じリクエストを同じノードに配布します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80
サービスの先取り (graceful start)
サービスプリフェッチ機能により、新しいノードが解放されると、指定されたサービスプリフェッチウィンドウでトラフィックが徐々に増加します。 これは、ノードが完全にプリフェッチされることを保証する。
mse.ingress.kubernetes.io/warmup: サービスがプリフェッチされる期間を指定します。 単位は秒です。 デフォルトでは、サービスプリフェッチ機能は有効になっていません。
サービスプリフェッチは、選択した負荷分散アルゴリズムに依存します。 ラウンドロビンおよび最小接続に基づく負荷分散アルゴリズムのみがサポートされています。
たとえば、バックエンドサービスデモサービスのサービスプリフェッチ機能を有効にし、プリフェッチ時間ウィンドウを30秒に設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/warmup: "30"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/warmup: "30"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 Cookieアフィニティ (セッション永続化)
同じcookieを持つリクエストは、常にクラウドネイティブゲートウェイ上の同じノードに配信されます。 クライアントが最初のリクエストをcookieと共にゲートウェイに送信すると、MSE Ingressはクライアントに対して生成されたcookieを含む応答を返します。 生成されたcookieは、後続の要求が常にゲートウェイの同じノードに配信されるようにするために使用されます。
注釈 | 説明 |
nginx.ingress.kubernetes.io/affinity | affinity型を指定します。 デフォルトで有効な値はcookieのみです。 |
nginx.ingress.kubernetes.io/affinity-mode | affinityモードを指定します。 デフォルト値と有効値のみがバランスされます。 |
nginx.ingress.kubernetes.io/session-cookie-name | ハッシュキーとして使用されるcookieの名前を指定します。 デフォルト値: INGRESSCOKIE。 |
nginx.ingress.kubernetes.io/session-cookie-path | 指定されたcookieが存在しない場合に生成されるcookieのパスを指定します。 デフォルト値: /。 |
nginx.ingress.kubernetes.io/session-cookie-max-age | 指定されたcookieが存在しない場合に生成されるcookieの有効期限を指定します。 単位は秒です。 デフォルトでは、このアノテーションはセッションレベルで指定されます。 |
nginx.ingress.kubernetes.io/session-cookie-expires | 指定されたcookieが存在しない場合に生成されるcookieの有効期限を指定します。 単位は秒です。 デフォルトでは、このアノテーションはセッションレベルで指定されます。 |
例:
cookieアフィニティを有効にし、MSE Ingressのデフォルト設定を使用します。 cookie名をINGRESSCOKIEに設定し、パスを /に設定し、セッションレベルでcookieのライフサイクルを設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/affinity: "cookie" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/affinity: "cookie" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80cookie affinityを有効にし、テストするcookie名、/へのパス、およびcookieの有効期限を10秒に設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "test" nginx.ingress.kubernetes.io/session-cookie-max-age: "10" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: - backend: service: 名前: demo-service port: number: 80 パス: /test pathType: 正確V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1 kind: Ingress メタデータ: アノテーション: nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "test" nginx.ingress.kubernetes.io/session-cookie-max-age: "10" 名前: デモ spec: ingressClassName: mse rules: -host: example.com http: paths: -パス: /test backend: serviceName: デモサービス servicePort: 80
ゲートウェイとバックエンドサービス間の接続プールの設定
ゲートウェイ上の指定されたバックエンドサービスの接続プールを設定した後、ゲートウェイとバックエンドサービス間の接続数を制御できます。 これにより、バックエンドサービスが過負荷になるのを防ぎ、バックエンドサービスの安定性と高可用性を保証します。
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: ゲートウェイとバックエンドサービス間の単一の接続でのリクエストの最大数。
たとえば、バックエンドサービスのデモサービスの場合、ゲートウェイとバックエンドサービスの間に確立できる最大接続数を10に設定し、ゲートウェイとバックエンドサービスの単一ノードの間に確立できる最大接続数を2に設定できます。
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 クライアントとクラウドネイティブゲートウェイ間の通信用のTLSバージョンと暗号スイート
MSE Ingressでサポートされているデフォルトの最も古いTLSバージョンはTLSv1.0です。 デフォルトの最新のTLSバージョンはTLSv1.3です。 デフォルトでは、次の暗号スイートが使用されます。
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。 有効な値:
|
mse.ingress.kubernetes.io/tls-max-protocol-version | TLSの最新バージョンを指定します。 デフォルト値: TLSv1.3. |
nginx.ingress.kubernetes.io/ssl-cipher | TLS暗号スイートを指定します。 カンマ (,) で区切られた複数のTLS暗号スイートを指定できます。 このアノテーションは、TLSハンドシェイクにv1.0からv1.2までのTLSバージョンが使用されている場合にのみ有効です。 |
例えば、ドメイン名e example.comが利用可能である。 このドメイン名の場合、最も古いTLSバージョンをTLSv1.2に設定し、最新バージョンをTLSv1.2に設定します。 サンプル設定:
Kubernetes V1.19以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80 ゲートウェイとバックエンドサービス間のmTLS
デフォルトでは、MSE IngressはHTTPを使用してリクエストをバックエンドサービスコンテナに転送します。 注釈nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" を使用すると、MSE IngressがHTTPS経由でバックエンドサービスにアクセスできるようになります。 この場合、一方向TLSが使用される。 MSE Ingressは、バックエンドサービスによって提供される証明書を認証します。証明書は、よく知られている認証局 (CA) によって発行される必要があります。 相互TLS (mTLS) も許可されています。 mTLSを使用する場合、ゲートウェイとバックエンドサービスは双方向認証を実行します。 ゲートウェイは、バックエンドサービスによって提供される証明書が有効であるかどうかを検証し、バックエンドサービスは、ゲートウェイによって提供される証明書が有効であるかどうかを検証する。
注釈 | 説明 |
nginx.ingress.kubernetes.io/proxy-ssl-secret | ゲートウェイで使用されるクライアント証明書を指定します。 クライアント証明書は、バックエンドサービスがゲートウェイを認証するために使用されます。 形式はsecretNamespace/secretNameです。 |
nginx.ingress.kubernetes.io/proxy-ssl-name | TLSハンドシェイク中に使用されるサーバー名表示 (SNI) を指定します。 |
nginx.ingress.kubernetes.io/proxy-ssl-server-name | TLSハンドシェイク中に使用されるSNIを有効にするか無効にするかを指定します。 |
たとえば、クラウドネイティブゲートウェイとバックエンドサービス間でmTLSを実行し、secretNameをgateway-certに設定し、secretNamespaceをdefaultに設定します。 サンプル設定:
Kubernetes 1.19を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/ateway-cert"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
- backend:
service:
名前: demo-service
port:
number: 80
パス: /test
pathType: 正確 V1.19より前のバージョンのKubernetesを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
メタデータ:
アノテーション:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/ateway-cert"
名前: デモ
spec:
ingressClassName: mse
rules:
-host: example.com
http:
paths:
-パス: /test
backend:
serviceName: デモサービス
servicePort: 80