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/reviewshttps://eu.bookinfo.com/reviewshttp://uk.bookinfo.com:9080/reviewshttp://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.comhttps://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接続を受け入れるロードバランサーを記述します。

フィールドタイプ説明必須
serversServer[]

サーバー仕様のリスト。

いいえ
selectormap<string, string>

このゲートウェイ構成を適用する必要がある特定のポッド/VMセットを示す1つ以上のラベル。デフォルトでは、ワークロードはラベルセレクターに基づいてすべての名前空間で検索されます。これは、名前空間 “foo” のゲートウェイリソースが、ラベルに基づいて名前空間 “bar” のポッドを選択できることを意味します。この動作は、istiod の PILOT_SCOPE_GATEWAY_TO_NAMESPACE 環境変数を介して制御できます。この変数が true に設定されている場合、ラベル検索のスコープは、リソースが存在する構成名前空間に制限されます。言い換えれば、ゲートウェイリソースは、ゲートウェイワークロードインスタンスと同じ名前空間に存在する必要があります。セレクターが nil の場合、ゲートウェイはすべてのワークロードに適用されます。

いいえ

サーバー

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ポート

プロキシが着信接続をリッスンする必要があるポート。

はい
bindstring

リスナーがバインドされるべきIPまたはUnixドメインソケット。形式:x.x.x.x または unix:///path/to/uds または unix://@foobar(Linux抽象名前空間)。Unixドメインソケットを使用する場合は、ポート番号を0にする必要があります。これは、このサーバーの到達可能性をゲートウェイ内部のみに制限するために使用できます。これは通常、ゲートウェイが別のメッシュサービスと通信する必要がある場合、例えばメトリクスを公開する場合に使用されます。そのような場合、指定されたバインドで作成されたサーバーは、外部ゲートウェイクライアントには利用できません。

いいえ
hostsstring[]

このゲートウェイによって公開される1つ以上のホスト。通常はHTTPサービスに適用されますが、SNIを持つTLSを使用するTCPサービスにも使用できます。ホストは、オプションの namespace/ プレフィックスを持つ dnsName として指定されます。dnsName は、FQDN形式を使用して指定する必要があり、オプションで左端のコンポーネントにワイルドカード文字を含めることができます(例:prod/*.example.com)。指定された名前空間からすべての VirtualService ホストを選択するには、dnsName* に設定します(例:prod/*)。

namespace は、それぞれ任意の名前空間または現在の名前空間を表す * または . に設定できます。例えば、*/foo.example.com は利用可能な任意の名前空間からサービスを選択しますが、./foo.example.com はサイドカーの名前空間からのみサービスを選択します。デフォルトでは、namespace/ が指定されていない場合、*/、つまり任意の名前空間からサービスを選択します。選択された名前空間内の関連する DestinationRule も使用されます。

VirtualService はゲートウェイにバインドする必要があり、サーバーで指定されたホストに一致する1つ以上のホストを持つ必要があります。一致は、完全に一致するか、サーバーのホストとのサフィックス一致である可能性があります。例えば、サーバーのホストが *.example.com を指定している場合、dev.example.com または prod.example.com のホストを持つ VirtualService が一致します。ただし、example.com または newexample.com のホストを持つ VirtualService は一致しません。

注:ゲートウェイの名前空間にエクスポートされた仮想サービス(例:exportTo 値が *)のみを参照できます。プライベート構成(例:exportTo. に設定されている)は利用できません。詳細については、VirtualServiceDestinationRule、および ServiceEntry 構成の exportTo 設定を参照してください。

はい
tlsServerTLSSettings

サーバーの動作を制御するTLS関連オプションのセット。これらのオプションを使用して、すべてのhttpリクエストをhttpsにリダイレクトする必要があるかどうか、および使用するTLSモードを制御します。

いいえ
namestring

サーバーのオプションの名前。設定する場合は、すべてのサーバー間で一意である必要があります。これは、この名前で生成された統計のプレフィックスなど、さまざまな目的で使用されます。

いいえ

ポート

Portは、サービスの特定のポートのプロパティを記述します。

フィールドタイプ説明必須
numberuint32

有効な非負の整数ポート番号。

はい
protocolstring

ポートで公開されるプロトコル。HTTP|HTTPS|GRPC|GRPC-WEB|HTTP2|MONGO|TCP|TLS のいずれかである必要があります。TLSは、特定のポートで非HTTPベースの接続を終了するために使用するか、TLS接続を終了せずにSNIヘッダーに基づいてトラフィックを宛先にルーティングするために使用できます。

はい
namestring

ポートに割り当てられたラベル。

はい

ServerTLSSettings

フィールドタイプ説明必須
httpsRedirectbool

trueに設定すると、ロードバランサーはすべてのhttp接続に対して301リダイレクトを送信し、クライアントにHTTPSを使用するように要求します。

いいえ
modeTLSmode

オプション:このポートへの接続をTLSを使用して保護する必要があるかどうかを示します。このフィールドの値は、TLSがどのように適用されるかを決定します。

いいえ
serverCertificatestring

modeが SIMPLE または MUTUAL の場合は必須。使用するサーバー側のTLS証明書を保持するファイルへのパス。

いいえ
privateKeystring

modeが SIMPLE または MUTUAL の場合は必須。サーバーの秘密鍵を保持するファイルへのパス。

いいえ
caCertificatesstring

modeが MUTUAL または OPTIONAL_MUTUAL の場合は必須。提示されたクライアント側の証明書を検証する際に使用する認証局証明書を含むファイルへのパス。

いいえ
caCrlstring

オプション:提示されたクライアント側の証明書を検証する際に使用する証明書失効リスト(CRL)を含むファイルへのパス。CRL は、スケジュールされた有効期限日より前にCA(認証局)によって失効された証明書のリストです。指定した場合、プロキシは、提示された証明書が失効した証明書のリストの一部であるかどうかを検証します。省略した場合、プロキシは crl に対して証明書を検証しません。

いいえ
credentialNamestring

Kubernetesで実行されているゲートウェイの場合、CA証明書を含むTLS証明書を保持するシークレットの名前。Kubernetesでのみ適用可能。不透明なシークレットには、次のキーと値を含める必要があります:tls.key: <privateKey> および tls.crt: <serverCert> または key: <privateKey> および cert: <serverCert>。相互TLSの場合、cacert: <CACertificate> および crl: <CertificateRevocationList> は、同じシークレットまたは <secret>-cacert という名前の別のシークレットで提供できます。OCSPステープル情報を指定するための追加の tls.ocsp-staple キー、CA証明書用の ca.crt キー、および証明書失効リスト用の ca.crl キーを持つサーバー証明書用のTLSシークレットもサポートされています。サーバー証明書とCA証明書またはcredentialNameのいずれか一方のみを指定できます。

いいえ
subjectAltNamesstring[]

クライアントによって提示された証明書のサブジェクトIDを検証するための代替名のリスト。

いいえ
verifyCertificateSpkistring[]

認証されたクライアント証明書のSPKIのbase64エンコードされたSHA-256ハッシュのオプションリスト。注:verify_certificate_hashとverify_certificate_spkiの両方が指定されている場合、いずれかの値に一致するハッシュは、証明書が受け入れられる結果になります。

いいえ
verifyCertificateHashstring[]

認証されたクライアント証明書の16進数エンコードされたSHA-256ハッシュのオプションリスト。単純な形式とコロン区切りの形式の両方が受け入れられます。注:verify_certificate_hashとverify_certificate_spkiの両方が指定されている場合、いずれかの値に一致するハッシュは、証明書が受け入れられる結果になります。

いいえ
minProtocolVersionTLSProtocol

オプション:最小TLSプロトコルバージョン。デフォルトでは TLSV1_2 です。TLSV1_2未満のTLSプロトコルバージョンでは、互換性のある暗号がもはや含まれていないため、cipherSuites 設定で互換性のある暗号を設定する必要があります。

注:TLSV1_2未満のTLSプロトコルバージョンを使用すると、重大なセキュリティリスクが発生します。

いいえ
maxProtocolVersionTLSProtocol

オプション:最大TLSプロトコルバージョン。

いいえ
cipherSuitesstring[]

オプション:指定した場合、指定された暗号リストのみをサポートします。それ以外の場合は、こちらで指定されているように、Envoyでサポートされているデフォルトの暗号リストが使用されます。サポートされている暗号のリストは

  • ECDHE-ECDSA-AES128-GCM-SHA256
  • ECDHE-RSA-AES128-GCM-SHA256
  • ECDHE-ECDSA-AES256-GCM-SHA384
  • ECDHE-RSA-AES256-GCM-SHA384
  • ECDHE-ECDSA-CHACHA20-POLY1305
  • ECDHE-RSA-CHACHA20-POLY1305
  • ECDHE-ECDSA-AES128-SHA
  • ECDHE-RSA-AES128-SHA
  • ECDHE-ECDSA-AES256-SHA
  • ECDHE-RSA-AES256-SHA
  • AES128-GCM-SHA256
  • AES256-GCM-SHA384
  • AES128-SHA
  • AES256-SHA
  • DES-CBC3-SHA
いいえ

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を表す証明書を使用します。このモードを使用する場合、TLSOptions の他のすべてのフィールドは空である必要があります。

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

この情報は役に立ちましたか?
改善のためのご提案はありますか?

フィードバックありがとうございます!