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
を使用して同じワークロードインスタンスを選択する場合、システムの動作は定義されていません。
注記 2:MeshConfig
ルート名前空間内の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-us1
、prod-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_MODE
がNONE
に設定されていると仮定すると、以下の仕様により、そのような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
から接続プールの設定をクライアント(サービスへのアウトバウンド接続の場合)とサーバー(サービスインスタンスへのインバウンド接続の場合)の両方にプッシュします。Sidecar
のInboundConnectionPool
とポートごとの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
は、接続されているワークロードインスタンスとの送受信通信を仲介するサイドカープロキシの設定を記述します。
IstioIngressListener
IstioIngressListener
は、ワークロードインスタンスに接続されたサイドカープロキシのインバウンドトラフィックリスナーのプロパティを指定します。
IstioEgressListener
IstioEgressListener
は、ワークロードインスタンスに接続されたサイドカープロキシ上のアウトバウンドトラフィックリスナーのプロパティを指定します。
Workloadセレクタ
WorkloadSelector
は、Gateway
、Sidecar
、EnvoyFilter
、ServiceEntry
、またはDestinationRule
設定をプロキシに適用できるかどうかを判断するために使用される基準を指定します。一致基準には、プロキシに関連付けられたメタデータ、ポッド/VMに添付されたラベルなどのワークロードインスタンス情報、または初期ハンドシェイク中にプロキシがIstioに提供するその他の情報が含まれます。複数の条件が指定されている場合、ワークロードインスタンスが選択されるには、すべての条件が一致する必要があります。現在、ラベルベースの選択メカニズムのみがサポートされています。
OutboundTrafficPolicy
OutboundTrafficPolicy
は、アプリケーションからの不明なアウトバウンドトラフィックの処理に関するサイドカーのデフォルトの動作を設定します。
Sidecarポート
ポートは、サービスの特定のポートのプロパティを記述します。
OutboundTrafficPolicy.Mode
名前 | 説明 |
---|---|
REGISTRY_ONLY |
注:Istioはアウトバウンドトラフィックセキュリティポリシーを提供していません。このオプションは、セキュリティポリシーやアウトバウンドファイアウォールの役割を果たしません。代わりに、このオプションは、主に、 |
ALLOW_ANY |
|
キャプチャモード
CaptureMode
は、リスナーへのトラフィックがどのようにキャプチャされるかを記述します。リスナーがIPにバインドされている場合にのみ適用されます。
名前 | 説明 |
---|---|
DEFAULT | 環境によって定義されたデフォルトのキャプチャモード。 |
IPTABLES | iptablesリダイレクトを使用してトラフィックをキャプチャします。 |
NONE | トラフィックキャプチャなし。egressリスナーで使用する場合、アプリケーションはリスナーポートまたはUnixドメインソケットと明示的に通信する必要があります。ingressリスナーで使用する場合、リスナーポートがホスト上の他のプロセスで使用されていないことを確認する必要があります。 |