Gateway
Gateway
は、メッシュのエッジで動作し、受信または送信のHTTP/TCP接続を受信するロードバランサーを記述します。仕様は、公開されるべきポートのセット、使用するプロトコルのタイプ、ロードバランサーのSNI構成などを記述します。
例えば、以下のゲートウェイ構成では、ポート80と9080(http)、443(https)、9443(https)、およびイングレス用のポート2379(TCP)を公開するロードバランサーとして機能するプロキシを設定します。このゲートウェイは、app: my-gateway-controller
というラベルを持つポッドで実行されているプロキシに適用されます。Istioはプロキシがこれらのポートでリッスンするように構成しますが、これらのポートへの外部トラフィックがメッシュに許可されるようにするのはユーザーの責任です。
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- uk.bookinfo.com
- eu.bookinfo.com
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- uk.bookinfo.com
- eu.bookinfo.com
tls:
mode: SIMPLE # enables HTTPS on this port
serverCertificate: /etc/certs/servercert.pem
privateKey: /etc/certs/privatekey.pem
- port:
number: 9443
name: https-9443
protocol: HTTPS
hosts:
- "bookinfo-namespace/*.bookinfo.com"
tls:
mode: SIMPLE # enables HTTPS on this port
credentialName: bookinfo-secret # fetches certs from Kubernetes secret
- port:
number: 9080
name: http-wildcard
protocol: HTTP
hosts:
- "*"
- port:
number: 2379 # to expose internal service via external port 2379
name: mongo
protocol: MONGO
hosts:
- "*"
上記のゲートウェイ仕様は、ロードバランサーのL4-L6プロパティを記述します。次に、VirtualService
をゲートウェイにバインドして、特定のホストまたはゲートウェイポートに到着するトラフィックの転送を制御できます。
例えば、以下のVirtualServiceは、https://uk.bookinfo.com/reviews
、https://eu.bookinfo.com/reviews
、http://uk.bookinfo.com:9080/reviews
、http://eu.bookinfo.com:9080/reviews
へのトラフィックを、ポート9080で動作する内部のレビューサービスの2つのバージョン(prodとqa)に分割します。さらに、cookie “user: dev-123” を含むリクエストは、qaバージョンの特別なポート7777に送信されます。同じルールは、メッシュ内の "reviews.prod.svc.cluster.local" サービスへのリクエストにも適用されます。このルールは、ポート443、9080にわたって適用されます。なお、http://uk.bookinfo.com
は https://uk.bookinfo.com
にリダイレクトされます(つまり、80は443にリダイレクトされます)。
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: bookinfo-rule
namespace: bookinfo-namespace
spec:
hosts:
- reviews.prod.svc.cluster.local
- uk.bookinfo.com
- eu.bookinfo.com
gateways:
- some-config-namespace/my-gateway
- mesh # applies to all the sidecars in the mesh
http:
- match:
- headers:
cookie:
exact: "user=dev-123"
route:
- destination:
port:
number: 7777
host: reviews.qa.svc.cluster.local
- match:
- uri:
prefix: /reviews/
route:
- destination:
port:
number: 9080 # can be omitted if it's the only port for reviews
host: reviews.prod.svc.cluster.local
weight: 80
- destination:
host: reviews.qa.svc.cluster.local
weight: 20
次のVirtualServiceは、(外部の)ポート27017に到着するトラフィックを、ポート5555で動作する内部のMongoサーバーに転送します。このルールは、ゲートウェイリストが予約名 mesh
を省略しているため、メッシュ内では適用されません。
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: bookinfo-mongo
namespace: bookinfo-namespace
spec:
hosts:
- mongosvr.prod.svc.cluster.local # name of internal Mongo service
gateways:
- some-config-namespace/my-gateway # can omit the namespace if gateway is in same namespace as virtual service.
tcp:
- match:
- port: 27017
route:
- destination:
host: mongo.prod.svc.cluster.local
port:
number: 5555
ホストフィールドのnamespace/hostname構文を使用して、ゲートウェイサーバーにバインドできる仮想サービスのセットを制限できます。例えば、次のゲートウェイでは、ns1名前空間内の任意の仮想サービスをバインドできますが、ns2名前空間の foo.bar.com ホストを持つ仮想サービスのみをバインドするように制限します。
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "ns1/*"
- "ns2/foo.bar.com"
Gateway
ゲートウェイは、メッシュのエッジで動作し、受信または送信HTTP/TCP接続を受け入れるロードバランサーを記述します。
サーバー
Server
は、指定されたロードバランサーポート上のプロキシのプロパティを記述します。例えば、
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: my-ingress
spec:
selector:
app: my-ingressgateway
servers:
- port:
number: 80
name: http2
protocol: HTTP2
hosts:
- "*"
別の例
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: my-tcp-ingress
spec:
selector:
app: my-tcp-ingressgateway
servers:
- port:
number: 27018
name: mongo
protocol: MONGO
hosts:
- "*"
以下は、ポート443のTLS構成の例です。
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: my-tls-ingress
spec:
selector:
app: my-tls-ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "*"
tls:
mode: SIMPLE
credentialName: tls-cert
ポート
Portは、サービスの特定のポートのプロパティを記述します。
ServerTLSSettings
ServerTLSSettings.TLSmode
プロキシによって適用されるTLSモード
名前 | 説明 |
---|---|
PASSTHROUGH | クライアントによって提示されたSNI文字列は、サービスレジストリから宛先サービスを決定するためのVirtualService TLSルートの一致基準として使用されます。 |
SIMPLE | 標準のTLSセマンティクスで接続を保護します。このモードでは、ハンドシェイク中にクライアント証明書は要求されません。 |
MUTUAL | 認証のためにサーバー証明書を提示することにより、相互TLSを使用してダウンストリームへの接続を保護します。ハンドシェイク中にクライアント証明書も要求され、少なくとも1つの有効な証明書をクライアントから送信する必要があります。 |
AUTO_PASSTHROUGH | パススルーモードに似ていますが、このTLSモードのサーバーは、SNI値からレジストリ内のサービスへのマッピングに関連するVirtualServiceを必要としません。サービス/サブセット/ポートなどの宛先の詳細は、SNI値でエンコードされます。プロキシは、SNI値で指定されたアップストリーム(Envoy)クラスター(エンドポイントのグループ)に転送します。このサーバーは通常、それぞれのエンドポイント間に直接接続がない、異なるL3ネットワークのサービス間の接続を提供するために使用されます。このモードの使用は、ソースと宛先の両方がIstio mTLSを使用してトラフィックを保護することを前提としています。 |
ISTIO_MUTUAL | 認証のためにサーバー証明書を提示することにより、相互TLSを使用してダウンストリームからの接続を保護します。Mutualモードと比較して、このモードでは、mTLS認証のためにIstioによって自動的に生成されたゲートウェイワークロードIDを表す証明書を使用します。このモードを使用する場合、 |
OPTIONAL_MUTUAL | MUTUALモードに似ていますが、クライアント証明書はオプションです。SIMPLEモードとは異なり、ハンドシェイク中にクライアント証明書が明示的に要求されますが、クライアントは証明書を送信する必要はありません。クライアント証明書が提示された場合、検証されます。クライアント証明書を検証するためにca_certificatesを指定する必要があります。 |
ServerTLSSettings.TLSProtocol
TLSプロトコルバージョン。
名前 | 説明 |
---|---|
TLS_AUTO | 最適なTLSバージョンを自動的に選択します。 |
TLSV1_0 | TLSバージョン1.0 |
TLSV1_1 | TLSバージョン1.1 |
TLSV1_2 | TLSバージョン1.2 |
TLSV1_3 | TLSバージョン1.3 |