Sidecar CRD描述被附加到工作负载上的Sidecar代理的配置,由Sidecar代理去调制工作负载的入站和出站通信。本文介绍Sidecar的功能、注意事项、配置示例和字段说明。
Sidecar介绍
Sidecar CRD定义Sidecar代理的配置,该代理中介了与其连接的工作负载实例的入站和出站通信。默认情况下,Istio将使用必要的配置对网格中的所有Sidecar代理进行编程,使其可以访问到网格中的每个工作负载实例,并在与工作负载关联的所有端口上接收流量。Sidecar配置提供了一种微调方式,去控制代理在从工作负载接收流量和将流量转发到工作负载时支持的端口和协议。此外,Sidecar还可以限制代理在转发来自工作负载的出站流量时可以访问的服务集合。
服务网格使用命名空间来管理服务和配置。命名空间中的Sidecar配置将使用workloadSelector字段进行选择,以应用到同一命名空间中的工作负载实例。如果没有workloadSelector字段,Sidecar将应用到同一命名空间中的所有工作负载实例。在确定要应用于工作负载实例的Sidecar资源时,将优先选择选中此工作负载的具有workloadSelector的Sidecar资源,而不是没有workloadSelector的Sidecar资源(没有workloadSelector字段的Sidecar中的配置将会被忽略而不会发生配置合并)。
注意事项
每个命名空间只能存在一个没有指定workloadSelector的Sidecar配置。该配置指定此命名空间中所有Pod的默认值。建议将命名空间范围的Sidecar命名为default。
如果在给定命名空间中存在两个及以上不带选择器的Sidecar配置,则系统的行为未定义。
如果两个及以上具有工作负载选择器的Sidecar配置选择相同的工作负载实例,则系统的行为未定义。
MeshConfig根命名空间中的Sidecar配置将默认应用于所有没有Sidecar配置的命名空间。此全局默认Sidecar配置不应具有任何工作负载选择器。
Sidecar不适用于网关,即使网关是Istio代理。
配置示例
示例一:全局默认的Sidecar配置
以下示例在根名称空间istio-config
中声明了一个全局默认的Sidecar配置。该配置将所有命名空间中的Sidecar配置为仅允许出口流量发往同一命名空间中的其他工作负载或者istio-system
命名空间中的服务。
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: default
namespace: istio-config
spec:
egress:
- hosts:
- "./*"
- "istio-system/*"
示例二:在prod-us1
命名空间中声明Sidecar配置,覆盖全局默认配置
以下示例在prod-us1
命名空间中声明了一个Sidecar配置,覆盖示例一定义的全局默认配置,并将所在命名空间中的Sidecar配置为允许出口流量发往prod-us1
、prod-apis
和istio-system
命名空间中的服务。
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: default
namespace: prod-us1
spec:
egress:
- hosts:
- "prod-us1/*"
- "prod-apis/*"
- "istio-system/*"
示例三:为标签为app: ratings
的所有Pod声明Sidecar配置
以下示例在prod-us1
命名空间中为标签为app: ratings
的所有Pod声明了一个Sidecar配置,这些Pod属于ratings.prod-us1
服务。该工作负载在端口9080上接收入站HTTP流量,然后将流量转发到侦听Unix域套接字的工作负载实例。在出口方向上,除了istio-system
命名空间外,Sidecar代理仅代理发往到prod-us1
命名空间中端口9080的HTTP流量。
示例四:为命名空间中包含app:productpage
标签的所有productpage.prod-us1
服务的Pod声明Sidecar配置
如果工作负载在部署时没有使用基于IPTables的流量捕获,则配置工作负载代理的端口的唯一方法是Sidecar配置。
以下示例为prod-us1
命名空间中包含标签app:productpage
的所有productpage.prod-us1
服务的Pod声明了Sidecar配置。假设这些Pod没有使用IPtables规则(即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服务。
字段说明
Sidecar
Sidecar描述被附加到工作负载上的Sidecar代理的配置,由Sidecar代理去调制工作负载的入站和出站通信。
字段 | 类型 | 是否必选 | 说明 |
workloadSelector | 否 | 用于选择哪些Pod适用于此Sidecar配置的条件。如果省略,Sidecar配置将应用于同一命名空间中的所有工作负载实例。 | |
ingress | 否 | 用于指定代理处理其关联的工作负载入站流量时的配置。
| |
egress | 否 | 用于指定代理处理其关联的工作负载出站流量时的配置。如果未指定,则继承系统从命名空间范围或全局范围检测到的默认Sidecar。 | |
outboundTrafficPolicy | 否 | 外部流量策略配置。如果您的应用程序使用了一个或多个未注册的外部服务,则将策略设置为ALLOW_ANY会导致Sidecar将应用程序发起的任何未知流量路由到其请求的目标。如果未指定,则继承系统从命名空间范围或全局范围检测到的默认Sidecar。 |
IstioIngressListener
IstioIngressListener指定附加到工作负载实例的Sidecar代理上的入站流量监听器的属性。
字段 | 类型 | 是否必选 | 说明 |
port | 是 | 与监听器关联的端口。 | |
bind | string | 否 | 监听器应绑定的IP地址(IPv4或IPv6)。在入口监听器的绑定字段中不允许使用Unix域套接字地址。如果省略,服务网格将根据导入的服务和应用此配置的工作负载自动配置默认值。 |
captureMode | 否 | 指定如何捕获(或不捕获)到监听器的流量。 | |
defaultEndpoint | string | 是 | 流量应转发到的IP端点或Unix域套接字。此配置可用于将到达Sidecar上
|
tls | 否 | 一组与TLS相关的选项。这些选项将启用Sidecar对于来自网格外部的请求的TLS终止。仅支持SIMPLE和MUTUAL TLS模式。 |
IstioEgressListener
IstioEgressListener指定附加到工作负载实例的Sidecar代理上的出站流量监听器的属性。
字段 | 类型 | 是否必选 | 说明 |
port | 否 | 与监听器关联的端口。如果使用Unix域套接字,请使用0作为端口号,并使用有效协议。如果指定了端口,将使用该端口作为导入主机关联的默认目标端口。如果省略端口,Istio将根据导入的主机推断监听器端口。 当指定多个出口监听器,其中存在监听器具有特定端口,而其他监听器没有端口时,暴露在监听器端口上的主机将基于具有最具体端口的监听器。 | |
bind | string | 否 | 监听器应绑定的IP地址(IPv4或IPv6)。如果bind不为空,则必须指定port字段。格式如下:
如果省略,Istio将根据导入的服务、应用此配置的工作负载实例和captureMode自动配置默认值。如果captureMode为NONE,则bind将默认为 |
captureMode | 否 | 当绑定地址是IP时,captureMode选项指定如何捕获(或不捕获)到监听器的流量。对于Unix域套接字绑定,captureMode必须为DEFAULT或NONE。 | |
hosts | string[] | 是 | 监听器暴露的服务主机,格式为
示例如下:
只能引用导出到Sidecar命名空间(例如exportTo值为 |
WorkloadSelector
WorkloadSelector指定是否能将Gateway、Sidecar、EnvoyFilter、ServiceEntry或DestinationRule配置应用于代理的条件。匹配条件包括与代理相关的元数据、工作负载实例信息(例如附加到Pod的标签)或代理在初始握手期间向Istio提供的任何其他信息。如果指定了多个条件,则所有条件都需要匹配才能选择工作负载实例。仅支持基于标签的选择机制。
字段 | 类型 | 是否必选 | 说明 |
labels | map<string, string> | 是 | 一个或多个标签,指示应在其上应用配置的一组特定Pod。标签搜索的范围仅限于资源所在的命名空间。 |
OutboundTrafficPolicy
OutboundTrafficPolicy设置Sidecar代理处理应用程序的出站流量的默认行为。如果应用程序使用了未注册的外部服务,则将策略设置为ALLOW_ANY会导致Sidecar将应用程序发起的任何未知流量路由到其请求的目标。建议您使用ServiceEntry配置显式声明任何外部依赖项,而不使用ALLOW_ANY,以便可以监控对这些服务的流量。
字段 | 类型 | 是否必选 | 说明 |
mode | string | 否 | 对外部服务的访问策略。取值说明如下:
|
CaptureMode
CaptureMode描述如何捕获传入监听器的流量。仅当监听器绑定到IP时适用。
字段 | 说明 |
DEFAULT | 环境定义的默认捕获模式。 |
IPTABLES | 使用IPtables重定向捕获流量。 |
NONE | 不捕获流量。在出口监听器中使用时,应用程序必须明确与监听器端口或Unix域套接字通信。在入口监听器中使用时,需确保主机上没有其他进程使用监听器端口。 |