サービスエントリ

ServiceEntry は、Istio の内部サービスレジストリに追加のエントリを追加して、メッシュ内の自動検出されたサービスがこれらの手動で指定されたサービスにアクセス/ルーティングできるようにするものです。サービスエントリは、サービスのプロパティ(DNS 名、VIP、ポート、プロトコル、エンドポイント)を記述します。これらのサービスは、メッシュの外部にある可能性があります(例:Web API)。または、プラットフォームのサービスレジストリに含まれていないメッシュ内部サービスである可能性があります(例:Kubernetes のサービスと通信する VM のセット)。さらに、サービスエントリのエンドポイントは、workloadSelector フィールドを使用して動的に選択することもできます。これらのエンドポイントは、WorkloadEntry オブジェクトまたは Kubernetes ポッドを使用して宣言された VM ワークロードになります。単一のサービスでポッドと VM の両方を選択できるため、サービスの既存の DNS 名を変更することなく、VM から Kubernetes へのサービスの移行が可能です。

次の例では、内部アプリケーションが HTTPS 経由でアクセスするいくつかの外部 API を宣言しています。サイドカーは ClientHello メッセージの SNI 値を検査して、適切な外部サービスにルーティングします。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-https
spec:
  hosts:
  - api.dropboxapi.com
  - www.googleapis.com
  - api.facebook.com
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: DNS

以下の設定は、Unmanaged VM上で動作するMongoDBインスタンスのセットをIstioのレジストリに追加し、これらのサービスをメッシュ内の他のサービスと同様に扱うことを可能にします。関連付けられたDestinationRuleは、データベースインスタンスへのmTLS接続を開始するために使用されます。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-mongocluster
spec:
  hosts:
  - mymongodb.somedomain # not used
  addresses:
  - 192.192.192.192/24 # VIPs
  ports:
  - number: 27018
    name: mongodb
    protocol: MONGO
  location: MESH_INTERNAL
  resolution: STATIC
  endpoints:
  - address: 2.2.2.2
  - address: 3.3.3.3

および関連付けられたDestinationRule

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: mtls-mongocluster
spec:
  host: mymongodb.somedomain
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem

次の例では、サービスエントリと仮想サービス内のTLSルーティングを組み合わせて、SNI値に基づいてトラフィックを内部のEgressファイアウォールに誘導します。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-redirect
spec:
  hosts:
  - wikipedia.org
  - "*.wikipedia.org"
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: NONE

そして、SNI値に基づいてルーティングする関連付けられたVirtualService。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: tls-routing
spec:
  hosts:
  - wikipedia.org
  - "*.wikipedia.org"
  tls:
  - match:
    - sniHosts:
      - wikipedia.org
      - "*.wikipedia.org"
    route:
    - destination:
        host: internal-egress-firewall.ns1.svc.cluster.local

TLSマッチングを含む仮想サービスは、デフォルトのSNIマッチングを上書きします。仮想サービスがない場合、トラフィックはWikipediaドメインに転送されます。

次の例は、すべての外部サービストラフィックが転送される専用のEgressゲートウェイの使用を示しています。'exportTo'フィールドを使用すると、メッシュ内の他のネームスペースに対するサービス宣言の可視性を制御できます。デフォルトでは、サービスはすべてのネームスペースにエクスポートされます。次の例では、可視性を現在のネームスペース(「.」で表される)に制限するため、他のネームスペースで使用することはできません。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-httpbin
  namespace : egress
spec:
  hosts:
  - example.com
  exportTo:
  - "."
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS

すべてのEgressトラフィックを処理するゲートウェイを定義します。

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
 name: istio-egressgateway
 namespace: istio-system
spec:
 selector:
   istio: egressgateway
 servers:
 - port:
     number: 80
     name: http
     protocol: HTTP
   hosts:
   - "*"

そして、サイドカーからゲートウェイサービス(`istio-egressgateway.istio-system.svc.cluster.local`)へのルーティング、およびゲートウェイから外部サービスへのルーティングを行う関連付けられた`VirtualService`。仮想サービスはすべてのネームスペースにエクスポートされるため、それらのネームスペースはゲートウェイを介して外部サービスにトラフィックをルーティングできます。このように管理されたミドルプロキシを通過させることは一般的な方法です。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: gateway-routing
  namespace: egress
spec:
  hosts:
  - example.com
  exportTo:
  - "*"
  gateways:
  - mesh
  - istio-egressgateway
  http:
  - match:
    - port: 80
      gateways:
      - mesh
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
  - match:
    - port: 80
      gateways:
      - istio-egressgateway
    route:
    - destination:
        host: example.com

次の例は、外部サービスのホストでワイルドカードを使用する方法を示しています。接続をアプリケーションによって要求されたIPアドレスにルーティングする必要がある場合(つまり、アプリケーションがDNSを解決して特定のIPに接続しようとする場合)、解決モードを`NONE`に設定する必要があります。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-wildcard-example
spec:
  hosts:
  - "*.bar.com"
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: NONE

次の例は、クライアントのホスト上のUnixドメインソケットを介して利用可能なサービスを示しています。Unixアドレスエンドポイントを使用するには、解決をSTATICに設定する必要があります。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: unix-domain-socket-example
spec:
  hosts:
  - "example.unix.local"
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: STATIC
  endpoints:
  - address: unix:///var/run/example/socket

HTTPベースのサービスの場合、複数のDNSアドレス指定可能なエンドポイントによってバックアップされた`VirtualService`を作成できます。このようなシナリオでは、アプリケーションは`HTTP_PROXY`環境変数を使用して、`VirtualService`のAPI呼び出しを選択したバックエンドに透過的にリダイレクトできます。たとえば、次の設定は、us.foo.bar.com:8080、uk.foo.bar.com:9080、およびin.foo.bar.com:7080の3つのドメインによってバックアップされた、存在しない外部サービスfoo.bar.comを作成します。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-dns
spec:
  hosts:
  - foo.bar.com
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS
  endpoints:
  - address: us.foo.bar.com
    ports:
      http: 8080
  - address: uk.foo.bar.com
    ports:
      http: 9080
  - address: in.foo.bar.com
    ports:
      http: 7080

`HTTP_PROXY=https://#/`を使用すると、アプリケーションから`http://foo.bar.com`への呼び出しは、上記で指定された3つのドメインにロードバランシングされます。言い換えれば、`http://foo.bar.com/baz`への呼び出しは`http://uk.foo.bar.com/baz`に変換されます。

次の例は、SPIFFE標準に準拠した形式のサブジェクト代替名を含む`ServiceEntry`の使用を示しています。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: httpbin
  namespace : httpbin-ns
spec:
  hosts:
  - example.com
  location: MESH_INTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: STATIC
  endpoints:
  - address: 2.2.2.2
  - address: 3.3.3.3
  subjectAltNames:
  - "spiffe://cluster.local/ns/httpbin-ns/sa/httpbin-service-account"

次の例は、`workloadSelector`を使用した`ServiceEntry`の使用を示し、サービス`details.bookinfo.com`のVMからKubernetesへの移行を処理します。このサービスには、サイドカー付きのVMベースのインスタンス2つと、標準的なデプロイメントオブジェクトによって管理されるKubernetesポッドのセットがあります。メッシュ内のこのサービスのコンシューマーは、VMとKubernetes間で自動的にロードバランシングされます。

apiVersion: networking.istio.io/v1
kind: WorkloadEntry
metadata:
  name: details-vm-1
spec:
  serviceAccount: details
  address: 2.2.2.2
  labels:
    app: details
    instance-id: vm1
---
apiVersion: networking.istio.io/v1
kind: WorkloadEntry
metadata:
  name: details-vm-2
spec:
  serviceAccount: details
  address: 3.3.3.3
  labels:
    app: details
    instance-id: vm2

同じサービスアカウント`details`を使用するポッドラベル`app: details`を持つKubernetesデプロイメントがあると仮定すると、次のサービスエントリはVMとKubernetesの両方にまたがるサービスを宣言します。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: details-svc
spec:
  hosts:
  - details.bookinfo.com
  location: MESH_INTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: STATIC
  workloadSelector:
    labels:
      app: details

ServiceEntry

ServiceEntryを使用すると、Istioの内部サービスレジストリに追加のエントリを追加できます。

フィールド説明必須
hostsstring[]

ServiceEntryに関連付けられたホスト。ワイルドカードプレフィックス付きのDNS名にすることができます。

  1. hostsフィールドは、VirtualServiceとDestinationRuleで一致するホストを選択するために使用されます。
  2. HTTPトラフィックの場合、HTTP Host/Authorityヘッダーはhostsフィールドと照合されます。
  3. サーバー名表示(SNI)を含むHTTPSまたはTLSトラフィックの場合、SNI値はhostsフィールドと照合されます。

**注記1:**resolutionがDNSタイプに設定されていて、エンドポイントが指定されていない場合、ホストフィールドはトラフィックをルーティングするエンドポイントのDNS名として使用されます。

**注記2:**ホスト名が、Kubernetesなど、独自のエンドポイントセットも提供する別のサービスレジストリからのサービス名と一致する場合、ServiceEntryは既存のKubernetesサービスのデコレーターとして扱われます。該当する場合は、サービスエントリのプロパティがKubernetesサービスに追加されます。現在、`istiod`によって考慮される追加プロパティは次のとおりです。

  1. subjectAltNames:サービスのポッドに関連付けられたサービスアカウントのSANを検証することに加えて、ここで指定されたSANも検証されます。
はい
addressesstring[]

サービスに関連付けられた仮想IPアドレス。CIDRプレフィックスにすることができます。HTTPトラフィックの場合、生成されたルート設定には、`addresses`フィールド値と`hosts`フィールド値の両方のHTTPルートドメインが含まれ、宛先はHTTP Host/Authorityヘッダーに基づいて識別されます。1つ以上のIPアドレスが指定されている場合、宛先IPがaddressesフィールドに指定されたIP/CIDRと一致する場合、着信トラフィックは、このサービスに属するものとして識別されます。Addressesフィールドが空の場合、トラフィックは宛先ポートに基づいてのみ識別されます。このようなシナリオでは、サービスがアクセスされているポートを、メッシュ内の他のサービスで共有することはできません。言い換えれば、サイドカーは単純なTCPプロキシとして動作し、指定されたポートの着信トラフィックを指定された宛先エンドポイントIP/ホストに転送します。このフィールドでは、Unixドメインソケットアドレスはサポートされていません。

いいえ
portsServicePort[]

外部サービスに関連付けられたポート。エンドポイントがUnixドメインソケットアドレスの場合、ポートは正確に1つである必要があります。

いいえ
location場所

サービスをメッシュの外部と見なすか、メッシュの一部と見なすかを指定します。

いいえ
resolution解決方法

ホストのサービス解決モード。TCPポートにIPアドレスを伴わずにresolutionモードをNONEに設定する場合は注意が必要です。そのような場合、そのポート上の任意のIPへのトラフィックが許可されます(つまり、`0.0.0.0:<port>`)。

いいえ
endpointsWorkloadEntry[]

サービスに関連付けられた1つ以上のエンドポイント。`endpoints`または`workloadSelector`のどちらか一方のみを指定できます。

いいえ
workloadSelectorWorkloadSelector

MESH_INTERNALサービスにのみ適用されます。`endpoints`または`workloadSelector`のどちらか一方のみを指定できます。ラベルに基づいて、1つ以上のKubernetesポッドまたはVMワークロード(`WorkloadEntry`を使用して指定)を選択します。VMを表す`WorkloadEntry`オブジェクトは、ServiceEntryと同じネームスペースで定義する必要があります。

いいえ
exportTostring[]

このサービスがエクスポートされるネームスペースのリスト。サービスをエクスポートすると、他のネームスペースで定義されたサイドカー、ゲートウェイ、および仮想サービスで使用できるようになります。この機能は、サービス所有者とメッシュ管理者がネームスペースの境界を越えてサービスの可視性を制御するためのメカニズムを提供します。

ネームスペースが指定されていない場合、サービスはデフォルトですべてのネームスペースにエクスポートされます。

値「.」は予約されており、サービスが宣言されているのと同じネームスペースへのエクスポートを定義します。同様に、値「*」は予約されており、すべてのネームスペースへのエクスポートを定義します。

Kubernetesサービスの場合、アノテーション「networking.istio.io/exportTo」をコンマ区切りのネームスペース名リストに設定することで、同等の効果を得ることができます。

いいえ
subjectAltNamesstring[]

指定されている場合、プロキシは、サーバー証明書のサブジェクト代替名が指定された値の1つと一致することを検証します。

注:workloadSelectorでworkloadEntryを使用する場合、workloadEntryで指定されたサービスアカウントも使用して、検証する必要がある追加のサブジェクト代替名を導出します。

いいえ

ServicePort

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

フィールド説明必須
numberuint32

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

はい
protocolstring

ポートで公開されるプロトコル。HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLSのいずれかである必要があります。TLSは、TLS接続を終了せずに、SNIヘッダーに基づいて接続が宛先にルーティングされることを意味します。

いいえ
namestring

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

はい
targetPortuint32

トラフィックが受信されるエンドポイント上のポート番号。設定されていない場合は、`number`をデフォルト値とします。

いいえ

ServiceEntryStatus

フィールド説明必須
conditionsIstioCondition[]

ServiceEntryの現在のサービス状態。詳細情報:https://istio.dokyumento.jp/docs/reference/config/config-status/

いいえ
validationMessagesAnalysisMessageBase[]

Istioのアナライザーによって検出されたエラーまたは警告が含まれます。

いいえ
observedGenerationint64

調整済み状態を参照するリソース世代。この値がオブジェクトのメタデータ世代と等しくない場合、現在の世代の調整済み状態の計算はまだ進行中です。詳細については、https://istio.dokyumento.jp/latest/docs/reference/config/config-status/を参照してください。

いいえ
addressesServiceEntryAddress[]

このServiceEntryに割り当てられたアドレスのリスト。

いいえ

ServiceEntryAddress

ホスト名を追加するために必要なマイナーな抽象化

フィールド説明必須
valuestring

valueはアドレス(192.168.0.2)です。

いいえ
hoststring

hostはこのアドレスに関連付けられた名前です。

いいえ

ServiceEntry.Location

Locationは、サービスがIstioメッシュの一部であるか、メッシュの外部であるかを指定します。Locationは、サービス間のmTLS認証、ポリシー適用など、いくつかの機能の動作を決定します。メッシュ外のサービスと通信する場合、IstioのmTLS認証は無効になり、ポリシー適用はサーバー側ではなくクライアント側で実行されます。

名前説明
MESH_EXTERNAL

サービスがメッシュの外部にあることを示します。通常、APIを介して消費される外部サービスを示すために使用されます。

MESH_INTERNAL

サービスがメッシュの一部であることを示します。通常、Unmanagedインフラストラクチャ(たとえば、Kubernetesベースのサービスメッシュに追加されたVM)を含めるためにサービスメッシュを拡張する一部として明示的に追加されたサービスを示すために使用されます。

ServiceEntry.Resolution

Resolutionは、プロキシがサービスに関連付けられたネットワークエンドポイントのIPアドレスをどのように解決するかを決定し、それらのいずれかにルーティングできるようにします。ここで指定された解決モードは、アプリケーションがサービスに関連付けられたIPアドレスを解決する方法には影響しません。アプリケーションは、アウトバウンドトラフィックをプロキシでキャプチャできるように、サービスをIPに解決するためにDNSを使用する必要がある場合があります。または、HTTPサービスの場合、アプリケーションはプロキシと直接通信して(たとえば、HTTP_PROXYを設定して)これらのサービスと通信できます。

名前説明
NONE

着信接続が既に解決されている(特定の宛先IPアドレスに)と想定します。このような接続は、通常、IPテーブルREDIRECT/eBPFなどのメカニズムを使用してプロキシを介してルーティングされます。ルーティング関連の変換を実行した後、プロキシは接続がバインドされていたIPアドレスに接続を転送します。

STATIC

エンドポイント(下記参照)に指定された静的IPアドレスを、サービスに関連付けられたバッキングインスタンスとして使用します。

DNS

周囲のDNSを非同期でクエリして、IPアドレスを解決しようとします。エンドポイントが指定されていない場合、ワイルドカードが使用されていない場合は、hostsフィールドに指定されたDNSアドレスが解決されます。エンドポイントが指定されている場合、エンドポイントに指定されたDNSアドレスが解決されて、宛先IPアドレスが決定されます。DNS解決は、Unixドメインソケットエンドポイントでは使用できません。

DNS_ROUND_ROBIN

周囲のDNSを非同期でクエリして、IPアドレスを解決しようとします。`DNS`とは異なり、`DNS_ROUND_ROBIN`は、DNS解決の完全な結果に依存せずに、新しい接続を開始する必要がある場合に返された最初のIPアドレスのみを使用し、DNSレコードが頻繁に変更されても、接続プールと接続サイクルの枯渇を排除して、ホストへの接続は維持されます。これは、DNSを介してアクセスする必要がある大規模なウェブスケールサービスに最適です。プロキシは、ワイルドカードが使用されていない場合、hostsフィールドに指定されたDNSアドレスを解決します。DNS解決は、Unixドメインソケットエンドポイントでは使用できません。

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

ご意見ありがとうございます!