Istio Ingress Gatewayの設定 #
Ingress Gatewayクラスター外部に対してクラスター内部のServiceに対するルーティングを公開します(Ingressとは何か)。 IstioもIngress Gatewayを提供しており、L7のルーティング設定を記述することができます。
Istio Ingress Gatewayの設定を変更するためにはいくつかのComponentを定義する必要があり、代表的なのはドキュメント(Istio / Ingress Gateways)で紹介されているGateway
とVirtualService
になります。
nginxやApacheのようにconfファイルを起動時に読み込む形式と違い、istioがEnvoyに対してAPI経由で設定変更を動的に変更することになります。
そのため、どのistio-proxy(GatewayもしくはSidecarとして機能しているEnvoy)に対して設定を適用させるか記述する必要があります。
ここでは、以下の図中のIstio Ingress Gatewayに対して設定を変更します。
hosts
でルーティングを分ける
#
例えばPCとスマートフォン(SP)でルーティング先を分けたい場合があります。
これを実現するためにはまずはGatewayを宣言する必要があります。
ここではわかりやすいようにPCのルーティング先をpc.example.com
、SPの行き先をsp.example.com
として定義します。
PC用Gateway
|
|
SP用Gateway
|
|
このとき、.metadata.namespace
と.spec.selector
で設定を適用したいIstio IngressGatewayを絞り込みます。
仮にGatewayを定義しなかった場合、Istio IngressGatewayはリクエストを後方のマイクロサービスに疎通させません。
次に、このGatewayをVirtualServiceに対してバインドします。
PC版Virtual Service
|
|
SP版Virtual Service
|
|
Virtual Serviceは.spec.gateways[]
にGateway
の.metadata.name
(namespace内でユニーク)を指定することで、
同一namespace
内のGatewayを特定してバインドしています。
語弊を恐れずにこれらのコンポーネントの流れを書くと次のようになります。
[host]pc.example.com:33000 # アクセス
→ [Gateway]pc-example-com # hostsとPortの宣言
→ [VirtualService]pc-route # Gatewayのバインド、PATHに対するServiceへルーティング
→ [Service]pc.demo.svc.cluster.local # Podに対するルーティング
以上でhostsに対するルーティングを実現することができます。
また、これらの操作により、同じnamespace内でpcとspで別々のIngress Gatewayに分離したい要求が発生した場合はIngress Gatewayが増えた場合は
Gateway
の.metadata.selector
を調整することで対応することができます。
HeaderやQueryParameterでルーティングする #
Virtual ServiceはURI
やHeader、Query Parameterなどの情報をもとに、ルーティング先のServiceを変更することができます。
Argo Rolloutsはこの機能を利用してBlueGreenデプロイや、Canaryデプロイを実現しています。
デプロイの機能として利用するだけでなく例えば「Preview版の機能を特定のHeader情報を含む場合にのみ公開する」などを実現することが可能です。
例えば、Headerにversion: v2
が含まれる場合は、.metadata.name=pc-v2
のServiceにルーティングする設定は次のように書くことができます。
|
|
試験的に実現したい機能などを本番環境に投入したい場合などに役に立つことは間違いないでしょう。
VirtualServiceを記述する注意点として、.spec.http[]
は条件の厳しいものが先にくるように記述する必要があります。
また、ルーティング先のhost
となるServiceが存在しない場合はManifestがApplyできないことがあります。