Sidecar

Sidecar は、接続されているワークロードインスタンスとの送受信通信を仲介するサイドカープロキシの設定を記述します。デフォルトでは、Istio はメッシュ内のすべてのワークロードインスタンスに到達するために必要な設定、およびワークロードに関連付けられているすべてのポートでトラフィックを受け入れるために必要な設定で、メッシュ内のすべてのサイドカープロキシをプログラムします。Sidecar 設定により、プロキシがワークロードとの間でトラフィックを転送するときに受け入れるポートとプロトコルのセットを微調整できます。さらに、ワークロードインスタンスからのアウトバウンドトラフィックを転送するときに、プロキシが到達できるサービスのセットを制限することも可能です。

メッシュ内のサービスと設定は、1つ以上の名前空間(例:Kubernetesの名前空間またはCFのorg/space)に編成されます。名前空間内のSidecar設定は、workloadSelectorフィールドを使用して選択された、同じ名前空間内の1つ以上のワークロードインスタンスに適用されます。workloadSelectorがない場合、同じ名前空間内のすべてのワークロードインスタンスに適用されます。ワークロードインスタンスに適用するSidecar設定を決定する際には、workloadSelectorを持たないSidecar設定よりも、このワークロードインスタンスを選択するworkloadSelectorを持つリソースが優先されます。

注記 1名前空間ごとに、その名前空間内のすべてのPodのデフォルトを指定するworkloadSelectorを持たないSidecar設定は1つだけ存在できます。名前空間全体のサイドカーには、名前defaultを使用することをお勧めします。特定の名前空間に複数のセレクタなしのSidecar設定が存在する場合、システムの動作は定義されていません。2つ以上のSidecar設定がworkloadSelectorを使用して同じワークロードインスタンスを選択する場合、システムの動作は定義されていません。

注記 2MeshConfig ルート名前空間内のSidecar設定は、デフォルトで、Sidecar設定のないすべての名空間へ適用されます。このグローバルデフォルトのSidecar設定には、workloadSelectorを含めるべきではありません。

注記 3ゲートウェイはIstioプロキシであるにもかかわらず、Sidecarはゲートウェイには適用されません

以下の例は、istio-configと呼ばれるルート名前空間でグローバルデフォルトのSidecar設定を宣言し、すべての名空間のサイドカーで、同じ名前空間内の他のワークロードとistio-system名前空間内のサービスへのアウトバウンドトラフィックのみを許可するように設定します。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: default
  namespace: istio-config
spec:
  egress:
  - hosts:
    - "./*"
    - "istio-system/*"

以下の例は、prod-us1名前空間でSidecar設定を宣言し、上記で定義されたグローバルデフォルトをオーバーライドし、名前空間内のサイドカーで、prod-us1prod-apis、およびistio-system名前空間のパブリックサービスへのアウトバウンドトラフィックを許可するように設定します。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: default
  namespace: prod-us1
spec:
  egress:
  - hosts:
    - "prod-us1/*"
    - "prod-apis/*"
    - "istio-system/*"

次の例は、prod-us1名前空間で、ラベルapp: ratingsを持ち、ratings.prod-us1サービスに属するすべてのPodに対するSidecar設定を宣言します。ワークロードはポート9080でインバウンドHTTPトラフィックを受け入れます。その後、トラフィックは、Unixドメインソケットをリッスンしている接続されたワークロードインスタンスに転送されます。アウトバウンド方向では、istio-system名前空間に加えて、サイドカープロキシはprod-us1名前空間のサービスに対してポート9080にバインドされたHTTPトラフィックのみを転送します。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: ratings
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: ratings
  ingress:
  - port:
      number: 9080
      protocol: HTTP
      name: somename
    defaultEndpoint: unix:///var/run/someuds.sock
  egress:
  - port:
      number: 9080
      protocol: HTTP
      name: egresshttp
    hosts:
    - "prod-us1/*"
  - hosts:
    - "istio-system/*"

ワークロードがIPTablesベースのトラフィックキャプチャなしでデプロイされている場合、Sidecar設定は、ワークロードインスタンスに接続されたプロキシのポートを設定する唯一の方法です。次の例は、prod-us1名前空間で、ラベルapp: productpageを持ち、productpage.prod-us1サービスに属するすべてのPodに対するSidecar設定を宣言します。これらのPodがIPテーブルルール(つまり、istio-initコンテナ)なしでデプロイされ、プロキシメタデータISTIO_META_INTERCEPTION_MODENONEに設定されていると仮定すると、以下の仕様により、そのようなPodはポート9080でHTTPトラフィック(Istio相互TLSでラップされている)を受信し、127.0.0.1:8080をリッスンしているアプリケーションに転送できます。また、アプリケーションが127.0.0.1:3306のバックエンドMySQLデータベースと通信し、それがmysql.foo.com:3306の外部ホストされているMySQLサービスにプロキシされることも許可します。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: no-ip-tables
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: productpage
  ingress:
  - port:
      number: 9080 # binds to proxy_instance_ip:9080 (0.0.0.0:9080, if no unicast IP is available for the instance)
      protocol: HTTP
      name: somename
    defaultEndpoint: 127.0.0.1:8080
    captureMode: NONE # not needed if metadata is set for entire proxy
  egress:
  - port:
      number: 3306
      protocol: MYSQL
      name: egressmysql
    captureMode: NONE # not needed if metadata is set for entire proxy
    bind: 127.0.0.1
    hosts:
    - "*/mysql.foo.com"

そして、mysql.foo.com:3306へのルーティングのための関連するサービスエントリ。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-mysql
  namespace: ns1
spec:
  hosts:
  - mysql.foo.com
  ports:
  - number: 3306
    name: mysql
    protocol: MYSQL
  location: MESH_EXTERNAL
  resolution: DNS

単一のプロキシでトラフィックキャプチャモードを混在させることも可能です。たとえば、内部サービスが192.168.0.0/16サブネット上にある設定を考えてみましょう。そのため、VMには192.168.0.0/16サブネット上のすべてのアウトバウンドトラフィックをキャプチャするようにIPテーブルが設定されています。VMには、インバウンドトラフィック用の172.16.0.0/16サブネット上に追加のネットワークインターフェースがあると仮定します。次のSidecar設定により、VMは172.16.0.0/16サブネットから到着するトラフィックに対して172.16.1.32:80(VMのIP)でリスナーを公開できます。

注記:VMのプロキシ上のISTIO_META_INTERCEPTION_MODEメタデータには、REDIRECTまたはTPROXYという値が含まれている必要があります。これは、IPテーブルベースのトラフィックキャプチャがアクティブであることを意味します。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: partial-ip-tables
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: productpage
  ingress:
  - bind: 172.16.1.32
    port:
      number: 80 # binds to 172.16.1.32:80
      protocol: HTTP
      name: somename
    defaultEndpoint: 127.0.0.1:8080
    captureMode: NONE
  egress:
    # use the system detected defaults
    # sets up configuration to handle outbound traffic to services
    # in 192.168.0.0/16 subnet, based on information provided by the
    # service registry
  - captureMode: IPTABLES
    hosts:
    - "*/*"

次の例は、prod-us1名前空間で、ラベルapp: ratingsを持ち、ratings.prod-us1サービスに属するすべてのPodに対するSidecar設定を宣言します。サービスはポート8443でインバウンドHTTPSトラフィックを受け入れ、サイドカープロキシは指定されたサーバー証明書を使用して一方向TLSを終了します。その後、トラフィックは、Unixドメインソケットをリッスンしている接続されたワークロードインスタンスに転送されます。特定のポートでmTLSモードを「DISABLE」に設定するために、PeerAuthenticationポリシーが設定されていることが期待されます。この例では、ポート80でmTLSモードが無効になっています。この機能は現在実験段階です。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: ratings
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: ratings
  ingress:
  - port:
      number: 80
      protocol: HTTPS
      name: somename
    defaultEndpoint: unix:///var/run/someuds.sock
    tls:
      mode: SIMPLE
      privateKey: "/etc/certs/privatekey.pem"
      serverCertificate: "/etc/certs/servercert.pem"
---
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 8443
    name: https
    targetPort: 80
  selector:
    app: ratings
---
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: ratings-peer-auth
  namespace: prod-us1
spec:
  selector:
    matchLabels:
      app: ratings
  mtls:
    mode: STRICT
  portLevelMtls:
    80:
      mode: DISABLE

トラフィックキャプチャとアプリケーションへのトラフィックの転送方法の設定に加えて、インバウンド接続プールの設定を制御することも可能です。デフォルトでは、IstioはDestinationRulesから接続プールの設定をクライアント(サービスへのアウトバウンド接続の場合)とサーバー(サービスインスタンスへのインバウンド接続の場合)の両方にプッシュします。SidecarInboundConnectionPoolとポートごとのConnectionPool設定を使用すると、クライアントすべてにプッシュされる設定とは別に、サーバーの接続プールを制御できます。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: connection-pool-settings
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: productpage
  inboundConnectionPool:
      http:
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
        maxRequestsPerConnection: 1024
        maxRetries: 100
  ingress:
  - port:
      number: 80
      protocol: HTTP
      name: somename
    connectionPool:
      http:
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
        maxRequestsPerConnection: 1024
        maxRetries: 100
      tcp:
        maxConnections: 100

Sidecar

Sidecar は、接続されているワークロードインスタンスとの送受信通信を仲介するサイドカープロキシの設定を記述します。

フィールドタイプ説明必須
workloadSelectorWorkloadセレクタ

このSidecar設定を適用する必要がある特定のPod/VMのセットを選択するために使用される基準。省略した場合、Sidecar設定は同じ名前空間内のすべてのワークロードインスタンスに適用されます。

いいえ
ingressIstioIngressListener[]

Ingressは、接続されたワークロードインスタンスへのインバウンドトラフィックを処理するためのサイドカーの設定を指定します。省略した場合、Istioはオーケストレーションプラットフォームから取得したワークロードに関する情報(例:公開ポート、サービスなど)に基づいて、サイドカーを自動的に構成します。指定されている場合、インバウンドポートは、ワークロードインスタンスがサービスに関連付けられている場合にのみ構成されます。

いいえ
egressIstioEgressListener[]

Egressは、接続されたワークロードインスタンスからメッシュ内の他のサービスへのアウトバウンドトラフィックを処理するためのサイドカーの設定を指定します。指定されていない場合、名前空間全体の、またはグローバルデフォルトのSidecarからのシステム検出されたデフォルトを継承します。

いいえ
inboundConnectionPoolConnectionPoolSettings

Envoyがネットワークから受け入れる接続の量を制御する設定。このデフォルトはすべてのインバウンドリスナーに適用され、Ingressフィールドでポートごとにオーバーライドできます。この設定は、DestinationRuleconnectionPoolフィールドを反映しています。

デフォルトでは、IstioはサービスのDestinationRuleを、サービスに向けられたアウトバウンドトラフィックのクライアントサイドカー(DestinationRuleを構成するときに一般的に考えるケース)とサーバーのインバウンドサイドカーの両方に適用します。Sidecarの接続プールはサーバーのインバウンドサイドカーを直接構成するため、その設定はクライアントとは異なる場合があります。これは、たとえば、少数のサーバーを呼び出す多くのクライアントがいる場合に役立ちます。DestinationRuleは単一クライアントの同時実行数を制限できますが、Sidecarを使用するとサーバー側でより高い同時実行数を設定できます。

サーバーのインバウンドサイドカーの接続プール設定は、次の優先順位(最高から最低)で構成されます。

  • SidecarからのポートごとのConnectionPool
  • Sidecarからの最上位レベルのInboundConnectionPool
  • DestinationRuleからのポートごとのTrafficPolicy.ConnectionPool
  • DestinationRuleからの最上位レベルのTrafficPolicy.ConnectionPool
  • デフォルトの接続プール設定(基本的に無制限)

すべての場合において、接続プール設定はオーバーライドされ、マージされません。

いいえ
outboundTrafficPolicyOutboundTrafficPolicy

アプリケーションからのアウトバウンドトラフィックの処理に関するサイドカーのデフォルトの動作を設定します。

デフォルトモードはALLOW_ANYで、これは不明な宛先へのアウトバウンドトラフィックが許可されることを意味します。

いいえ

IstioIngressListener

IstioIngressListenerは、ワークロードインスタンスに接続されたサイドカープロキシのインバウンドトラフィックリスナーのプロパティを指定します。

フィールドタイプ説明必須
portSidecarポート

リスナーに関連付けられたポート。

はい
bind文字列

リスナーをバインドするIP(IPv4またはIPv6)。Unixドメインソケットアドレスは、イングレスリスナーのbindフィールドでは許可されません。省略した場合、Istioはインポートされたサービスとこの設定が適用されるワークロードインスタンスに基づいて、デフォルトを自動的に構成します。

いいえ
captureModeキャプチャモード

captureModeオプションは、リスナーへのトラフィックをどのようにキャプチャする(またはしない)かを決定します。

いいえ
defaultEndpoint文字列

トラフィックを転送するIPエンドポイントまたはUnixドメインソケット。この設定は、サイドカー上のbind `IP:Port`に到着するトラフィックを、アプリケーションワークロードインスタンスが接続をリッスンしている`localhost:port`またはUnixドメインソケットにリダイレクトするために使用できます。任意のIPはサポートされていません。形式は、`127.0.0.1:PORT`、`[::1]:PORT`(localhostに転送)、`0.0.0.0:PORT`、`[::]:PORT`(インスタンスIPに転送)、または`unix:///path/to/socket`(Unixドメインソケットに転送)のいずれかである必要があります。

いいえ
tlsServerTLSSettings

メッシュの外部から発信されるリクエストに対してサイドカーでTLS終端を有効にするTLS関連のオプションのセット。現在、SIMPLEとMUTUAL TLSモードのみをサポートしています。

いいえ
connectionPoolConnectionPoolSettings

Envoyがネットワークから受け入れる接続の量を制御する設定。この設定は、最上位レベルのデフォルトのinboundConnectionPoolをオーバーライドして、このポートの特定の設定を構成します。この設定は、DestinationRulePortTrafficPolicy.connectionPoolフィールドを反映しています。このポートレベルの接続プールは、設定で最も高い優先順位を持ち、Sidecarの最上位レベルのInboundConnectionPoolDestinationRuleからの接続プーリング設定の両方をオーバーライドします。

いいえ

IstioEgressListener

IstioEgressListenerは、ワークロードインスタンスに接続されたサイドカープロキシ上のアウトバウンドトラフィックリスナーのプロパティを指定します。

フィールドタイプ説明必須
portSidecarポート

リスナーに関連付けられたポート。Unixドメインソケットを使用する場合は、有効なプロトコルと共にポート番号として0を使用します。ポートを指定した場合、インポートされたホストに関連付けられたデフォルトの宛先ポートとして使用されます。ポートを省略した場合、Istioはインポートされたホストに基づいてリスナーポートを推測します。複数のegressリスナーが指定され、1つ以上のリスナーが特定のポートを持ち、他のリスナーがポートを持たない場合、リスナーポートで公開されるホストは、最も具体的なポートを持つリスナーに基づきます。

いいえ
bind文字列

リスナーをバインドするIP(IPv4またはIPv6)またはUnixドメインソケット。bindが空でない場合は、ポートを指定する必要があります。形式:IPv4またはIPv6アドレス形式、またはunix:///path/to/uds、またはunix://@foobar(Linux抽象名前空間)。省略した場合、Istioはインポートされたサービス、この設定が適用されるワークロードインスタンス、およびcaptureModeに基づいてデフォルトを自動的に構成します。captureModeがNONEの場合、bindは127.0.0.1にデフォルト設定されます。

いいえ
captureModeキャプチャモード

バインドアドレスがIPの場合、captureModeオプションは、リスナーへのトラフィックがどのようにキャプチャされるか(またはされないか)を決定します。captureModeは、Unixドメインソケットバインドの場合、DEFAULTまたはNONEである必要があります。

いいえ
ホストstring[]

namespace/dnsName形式でリスナーによって公開される1つ以上のサービスホスト。指定された名前空間に存在し、dnsNameと一致するサービスが公開されます。対応するサービスは、サービスレジストリ(例:KubernetesまたはCloud Foundryサービス)のサービス、またはServiceEntryまたはVirtualService設定を使用して指定されたサービスです。同じ名前空間内の関連付けられたDestinationRuleも使用されます。

dnsNameはFQDN形式で指定する必要があり、オプションで最左のコンポーネントにワイルドカード文字を含めることができます(例:prod/*.example.com)。指定された名前空間からのすべてのサービスを選択するには、dnsName*に設定します(例:prod/*)。

namespace*.、または~に設定でき、それぞれ任意の名前空間、現在の名前空間、名前空間なしを表します。たとえば、*/foo.example.comは使用可能な任意の名前空間からサービスを選択し、./foo.example.comはサイドカーの名前空間からのサービスのみを選択します。ホストが*/*に設定されている場合、Istioはサイドカーがサイドカーの名前空間にエクスポートされているメッシュ内のすべてのサービスに到達できるように構成します。値~/*を使用して、単にトラフィックを受信して応答するが、独自のアウトバウンド接続を行わないサイドカーの設定を完全にトリミングできます。

注:サイドカーの名前空間にエクスポートされたサービスと設定アーティファクトのみ(例:exportTo値が*)、参照できます。プライベート設定(例:exportTo.に設定されている)は使用できません。詳細については、VirtualServiceDestinationRule、およびServiceEntry設定のexportTo設定を参照してください。

はい

Workloadセレクタ

WorkloadSelectorは、GatewaySidecarEnvoyFilterServiceEntry、またはDestinationRule設定をプロキシに適用できるかどうかを判断するために使用される基準を指定します。一致基準には、プロキシに関連付けられたメタデータ、ポッド/VMに添付されたラベルなどのワークロードインスタンス情報、または初期ハンドシェイク中にプロキシがIstioに提供するその他の情報が含まれます。複数の条件が指定されている場合、ワークロードインスタンスが選択されるには、すべての条件が一致する必要があります。現在、ラベルベースの選択メカニズムのみがサポートされています。

フィールドタイプ説明必須
ラベルmap<string, string>

設定を適用する特定のポッド/VMのセットを示す1つ以上のラベル。ラベル検索の範囲は、リソースが存在する設定名前空間に制限されます。

いいえ

OutboundTrafficPolicy

OutboundTrafficPolicyは、アプリケーションからの不明なアウトバウンドトラフィックの処理に関するサイドカーのデフォルトの動作を設定します。

フィールドタイプ説明必須
モードモードいいえ

Sidecarポート

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

フィールドタイプ説明必須
番号uint32

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

いいえ
プロトコル文字列

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

いいえ
名前文字列

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

いいえ

OutboundTrafficPolicy.Mode

名前説明
REGISTRY_ONLY

REGISTRY_ONLYモードでは、不明なアウトバウンドトラフィックはドロップされます。トラフィックの宛先は、ServiceEntry設定を通じてサービスレジストリに明示的に宣言する必要があります。

注:Istioはアウトバウンドトラフィックセキュリティポリシーを提供していません。このオプションは、セキュリティポリシーやアウトバウンドファイアウォールの役割を果たしません。代わりに、このオプションは、主に、ServiceEntry設定の不足を明示的に失敗させることで検出する方法を提供するために存在します。

ALLOW_ANY

ALLOW_ANYモードでは、不明な宛先へのトラフィックはすべて許可されます。ただし、不明な宛先のトラフィックは、可観測性の低下など、機能が制限されます。このモードにより、ServiceEntry設定を通じてすべての可能なアウトバウンド宛先を登録していないユーザーでも、任意の宛先に接続できます。

キャプチャモード

CaptureModeは、リスナーへのトラフィックがどのようにキャプチャされるかを記述します。リスナーがIPにバインドされている場合にのみ適用されます。

名前説明
DEFAULT

環境によって定義されたデフォルトのキャプチャモード。

IPTABLES

iptablesリダイレクトを使用してトラフィックをキャプチャします。

NONE

トラフィックキャプチャなし。egressリスナーで使用する場合、アプリケーションはリスナーポートまたはUnixドメインソケットと明示的に通信する必要があります。ingressリスナーで使用する場合、リスナーポートがホスト上の他のプロセスで使用されていないことを確認する必要があります。

この情報は役に立ちましたか?
改善点についてご提案があれば教えてください。

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