Sidecar 雨点打透心脏的1/2处 2022-08-30 11:17 103阅读 0赞 ### Sidecar ### `Sidecar` 描述了 `Sidecar` 代理的配置,该代理可将入站和出站通信调解到它所附加的工作负载实例。默认情况下,Istio 将为网格中的所有 `Sidecar` 代理进行必要的配置,以达到网格中的每个工作负载示例,并接受与工作负载相关的所有端口上的流量。`Sidecar` 配置提供了一种调优端口集的方法,代理在向工作负载转发流量和从工作负载转发流量时将接受端口集和协议。此外,当转发来自工作负载实例的出站流量时,可以限制代理可以访问的服务集。 网格中的服务和配置被组织到一个或多个命名空间(如 Kubernetes 命名空间或 CF org/space)中。命名空间中的 `Sidecar` 配置将应用于同一命名空间中使用 `workloadSelector` 字段筛选出来的一个或多个工作负载实例。在 `workloadSelector` 字段不存在的情况下,它将应用于同一命名空间中的所有工作负载实例。当确定要应用于工作负载实例的 `Sidecar` 配置时,将优先选择带有该工作负载实例的 `workloadSelector` 的资源, 而不是没有任何 `workloadSelector` 的 `Sidecar` 配置。 注意1:每个命名空间在没有任何 `workloadSelector` 的情况下只能有一个 `Sidecar` 配置。如果给定的命名空间中存在多个无选择器的 `Sidecar` 配置,则系统的行为是不确定的。如果两个或多个带有 `workloadSelector` 的 `Sidecar` 配置选择了相同的工作负载实例,则系统的行为是不确定的。 注意2:默认情况下,`MeshConfig` 根命名空间中的 `Sidecar` 配置将被默认应用于所有没有 `Sidecar` 配置的命名空间。这个全局默认的 `Sidecar` 配置不应该包含任何 `workloadSelector`。 下面的示例中,在名为 `istio-config` 的根命名空间中声明了全局默认的 `Sidecar` 配置,该配置将所有命名空间中的 `Sidecar` 配置为仅允许将流量发送到同一命名空间中的其他工作负载,以及 `istio-system` 命名空间中的服务。 apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: istio-config spec: egress: - hosts: - "./*" - "istio-system/*" 下面的示例中,在 `prod-us1` 命名空间中声明了一个 `Sidecar` 配置,该配置覆盖了上面定义的全局默认值,并将命名空间下的 `Sidecar` 配置为允许将流量发送到 `prod-us1`、`prod-apis`、`istio-system` 命名空间中的服务。 apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: prod-us1 spec: egress: - hosts: - "prod-us1/*" - "prod-apis/*" - "istio-system/*" 下面的示例中,在 `prod-us1` 命名空间中声明了一个 `Sidecar` 配置,该配置在 9080 端口上接收入站 HTTP 流量,并将其转发给 `Unix Domain Socket` 上监听的附加工作负载实例。在出口方向上,除了 `istio-system` 命名空间之外,`Sidecar` 仅代理为 `prod-us1` 命名空间中的服务绑定到 9080 端口的 HTTP 流量。 apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: prod-us1 spec: 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` 命名空间中为属于 `productpage.prod-us1` 服务带有标签 `app: productpage` 的所有 `Pod` 声明了一个 `Sidecar` 配置。假定这些 `Pod` 部署时没有 iptables 规则(即 `istio-init` 容器)和代理元数据 `ISTIO_META_INTERCEPTION_MODE` 设置为 `NONE`,下面允许这样的 `Pod` 接收 9080 端口上的 HTTP 流量,并将其转发到监听 `127.0.0.1:8080` 的应用程序。它还允许应用程序与 `127.0.0.1:3306` 上的后备 mysql 数据库通信,然后将其代理到 `mysql:foo.com:3306` 上的外部托管的 mysql 服务。 apiVersion: networking.istio.io/v1alpha3 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` 的相关 `ServiceEntry`: apiVersion: networking.istio.io/v1alpha3 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 上设置 IP 表以捕获 `192.168.0.0/16` 子网中的所有出站流量。假设 VM 在 `172.16.0.0/16` 子网中有一个用于入站流量的额外网络接口,通过下面的 `Sidecar` 配置,VM 可以在 `172.16.1.32:80`(VM IP)上暴露一个监听器,用于接收来自 `172.16.0.0/16` 子网的流量。注意,在这种情况下,VM 中的代理上的 `ISTIO_META_INTERCEPTION_MODE` 元数据应包含 `REDIRECT` 或 `TPROXY` 作为其值,这意味着基于 IP 表的流量捕获处于活动状态。 apiVersion: networking.istio.io/v1alpha3 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: - "*/*" -------------------- ### CaptureMode ### `CaptureMode` 描述期望如何捕获监听器的流量。仅当监听器与 IP 绑定时适用。 <table> <thead> <tr> <th>名称</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><code>DEFAULT</code></td> <td>环境定义的默认捕获模式</td> </tr> <tr> <td><code>IPTABLES</code></td> <td>使用 iptables 重定向捕获流量</td> </tr> <tr> <td><code>NONE</code></td> <td>没有流量捕获。在出站监听器中使用时,应用程序应与监听器的端口或 <code>Unix Domain Socket</code> 通信。在入站监听器中使用时,需要确保监听器的端口未被主机上的其他进程使用</td> </tr> </tbody> </table> -------------------- ### IstioEgressListener ### `IstioEgressListener` 指定附加到工作负载实例的 `Sidecar` 代理上的出站流量监听器的属性。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>port</code></td> <td><code>Port</code></td> <td>与监听器相关联的端口。如果使用 <code>Unix Domain Socket</code>,使用 0 作为端口号,并使用有效的协议。如果指定了端口,它将用作与导入的主机关联的默认目标端口。如果省略端口,则 Istio 将根据导入的主机来推断监听器端口。注意,当指定多个出口监听器时(其中一个或多个监听具有指定的端口,而其他监听器没有端口),则主机将基于具有指定端口的监听器在监听器端口上暴露</td> <td>否</td> </tr> <tr> <td><code>bind</code></td> <td><code>string</code></td> <td>监听器应绑定到的 IP 或 <code>Unix Domain Socket</code>。如果 <code>bind</code> 不为空,则必须指定 <code>port</code>。格式:<code>x.x.x.x</code> 或 <code>unix:///path/to/uds</code> 或 <code>unix://@foobar</code>(Linux 抽象命名空间)。如果省略,则 Istio 将根据导入的服务、应用此配置的工作负载实例和 <code>captureMode</code> 来自动配置默认值。如果 <code>captureMode</code> 为 <code>NONE</code>,则 <code>bind</code> 默认为 <code>127.0.0.1</code></td> <td>否</td> </tr> <tr> <td><code>captureMode</code></td> <td><code>CaptureMode</code></td> <td>当绑定地址是 IP 时,<code>captureMode</code> 选项指示如何捕获(或不捕获)到监听器的流量。<code>bind</code> 绑定为 <code>Unix Domain Socket</code> 时 <code>captureMode</code> 必须为 <code>DEFAULT</code> 或 <code>NONE</code></td> <td>否</td> </tr> <tr> <td><code>hosts</code></td> <td><code>string[]</code></td> <td>监听器以 <code>namespace/dnsName</code> 格式公开的一台或多台服务主机。与 <code>dnsName</code> 匹配的指定命名空间中的服务 将被公开。相应的服务可以是服务注册表中的服务(如 Kubernetes 或 Cloud Foundry 服务),也可以是使用 <code>ServiceEntry</code> 或 <code>VirtualService</code> 配置指定的服务。在相同命名空间中任何关联的 <code>DestinationRule</code> 也将被使用。在 <code>dnsName</code> 应该使用 FQDN 格式指定,可以在最左边的部分中包含一个通配符(如 <code>prod/*.example.com</code>)。将 <code>dnsName</code> 设置为 <code>*</code> 以从指定的命名空间(如 <code>prod/*</code>)中选择所有服务。<code>namespace</code> 可以设置为 <code>*</code>、 <code>/</code>、<code>~</code>,分别表示任何、当前、没有命名空间。例如 <code>*/foo.example.com</code> 从任何可用的命名空间中选择服务,而 <code>./foo.example.com</code> 仅从 <code>Sidecar</code> 当前的命名空间中选择服务。如果将主机设置为 <code>*/*</code>,则 Istio 将配置 <code>Sidecar</code>,使其能够访问暴露到 <code>Sidecar</code> 命名空间的网格中的每个服务。<code>~/*</code> 可用于完全削减 <code>Sidecar</code> 的配置,仅接收流量并做出响应,但没有自己的出站连接。注意:暴露到 <code>Sidecar</code> 的命名空间的服务和配置(如 <code>exportTo</code> 设置为 <code>*</code>)才能被引用,私有配置(如 <code>exportTo</code> 设置为 <code>.</code>)将不可用。警告:<code>Sidecar</code> 如果启用了出口主机列表,则 <code>Sidecar</code> 中的出口主机列表还必须包括 <code>Mixer</code> 控制平面服务,否则 <code>Envoy</code> 将无法到达他们。例如,启用遥测功能时添加主机 <code>istio-system/istio-telemetry.istio-system.svc.cluster.local</code>,启用策略功能时添加主机 <code>istio-system/istio-policy.istio-system.svc.cluster.local</code>,或者添加 <code>istio-system/*</code> 以允许 <code>istio-system</code> 命名空间中的所有服务</td> <td>是</td> </tr> </tbody> </table> -------------------- ### IstioIngressListener ### `IstioIngressListener` 指定附加到工作负载实例的 `Sidecar` 代理上的入站流量监听器的属性。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>port</code></td> <td><code>Port</code></td> <td>与监听器相关联的端口</td> <td>是</td> </tr> <tr> <td><code>bind</code></td> <td><code>string</code></td> <td>监听器应绑定到的 IP。必须采用格式 <code>x.x.x.x</code>。入口监听器的 <code>bind</code> 字段中不允许使用 <code>Unix Domain Socket</code>。如果省略,则 Istio 将根据导入的服务、应用此配置的工作负载实例来自动配置默认值</td> <td>否</td> </tr> <tr> <td><code>captureMode</code></td> <td><code>CaptureMode</code></td> <td><code>captureMode</code> 选项指定期望如何捕获(或不捕获)到监听器的流量</td> <td>否</td> </tr> <tr> <td><code>defaultEndpoint</code></td> <td><code>string</code></td> <td>流量应转发到的环回 IP <code>endpoint</code> 或 <code>Unix Domain Socket</code>。此配置可用于将到达 <code>Sidecar</code> 上的绑定 <code>IP:Port</code> 的流量重定向到 <code>localhost:port</code> 或应用程序工作负载实例正在监听连接的 <code>Unix Domain Socket</code>。格式应为 <code>127.0.0.1:PORT</code> 或 <code>unix:///path/to/socket</code></td> <td>是</td> </tr> </tbody> </table> -------------------- ### OutboundTrafficPolicy ### `OutboundTrafficPolicy` 设置 `Sidecar` 的默认行为,用于处理来自应用程序的出站流量。如果应用程序使用一个或多个未知的外部服务,则将策略设置为 `ALLOW_ANY` 可以让 `Sidecars` 将来自应用程序的所有未知流量路由到其请求的目的地。建议使用 `ServiceEntry` 配置来声明任何外部依赖项,而不要使用 `ALLOW_ANY`,以便可以监视到这些服务的流量。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>mode</code></td> <td><code>Mode</code></td> <td></td> <td>否</td> </tr> </tbody> </table> -------------------- ### OutboundTrafficPolicy.Mode ### <table> <thead> <tr> <th>名称</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><code>REGISTRY_ONLY</code></td> <td>出站流量将仅限于服务注册表中定义的服务以及通过 <code>ServiceEntry</code> 配置定义的服务</td> </tr> <tr> <td><code>ALLOW_ONLY</code></td> <td>如果目标端口没有服务或 <code>ServiceEntry</code> 配置,将允许出站流量去往未知目的地</td> </tr> </tbody> </table> -------------------- ### Sidecar ### `Sidecar` 描述了 `Sidecar` 代理的配置,该代理负责协调它所附加的工作负载实例的入站和出站通信。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>workloadSelector</code></td> <td><code>WorkloadSelector</code></td> <td>用于选择在其上应用 <code>Sidecar</code> 配置的特定的 <code>Pod/VM</code> 集合的标准。如果省略,<code>Sidecar</code> 配置将应用于同一命名空间中的所有工作负载实例</td> <td>否</td> </tr> <tr> <td><code>ingress</code></td> <td><code>IstioIngressListener[]</code></td> <td><code>ingress</code> 指定 <code>Sidecar</code> 的配置,用于处理到附加工作负载实例的入站流量。如果省略,Istio 将根据从编排平台获得的工作负载信息(如 暴露的端口、服务等)自动配置 <code>Sidecar</code>。如果指定,当且仅当工作负载实例与服务关联时配置入站端口</td> <td>否</td> </tr> <tr> <td><code>egress</code></td> <td><code>IstioEgressListener[]</code></td> <td><code>egress</code> 指定 <code>Sidecar</code> 的配置,用于处理从附加的工作负载实例到网格中其他服务的出站流量</td> <td>是</td> </tr> <tr> <td><code>outboundTrafficPolicy</code></td> <td><code>OutboundTrafficPolicy</code></td> <td>允许配置出站流量策略。如果应用程序使用一个或多个未知的外部服务,将策略设置为 <code>ALLOW_ANY</code> 可以让 <code>Sidecars</code> 将来自应用程序的所有未知流量路由到其请求的目的地</td> <td>否</td> </tr> </tbody> </table> -------------------- ### WorkloadSelector ### `WorkloadSelector` 指定用于确定 `Gateway`,`Sidecar` 或 `EnvoyFilter` 配置是否可以被应用到代理。匹配条件包括与代理关联的元数据,工作负载实例信息(如 附加到 `Pod/VM` 的标签)或代理在初始握手期间提供给 Istio 的任何其他信息。如果指定了多个条件,则必须匹配所有条件才能选择工作负载实例。当前,仅支持基于标签的选择机制。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>labels</code></td> <td><code>map<string, string></code></td> <td>一个或多个标签,指定 <code>Sidecar</code> 在其上应用此配置的一组特定的 <code>Pod/VM</code> 。标签搜索的范围仅限于资源所在的配置命名空间</td> <td>是</td> </tr> </tbody> </table> --------------------
还没有评论,来说两句吧...