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 绑定时适用。
名称 | 描述 |
---|---|
DEFAULT | 环境定义的默认捕获模式 |
IPTABLES | 使用 iptables 重定向捕获流量 |
NONE | 没有流量捕获。在出站监听器中使用时,应用程序应与监听器的端口或 Unix Domain Socket 通信。在入站监听器中使用时,需要确保监听器的端口未被主机上的其他进程使用 |
IstioEgressListener
IstioEgressListener
指定附加到工作负载实例的 Sidecar
代理上的出站流量监听器的属性。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
port | Port | 与监听器相关联的端口。如果使用 Unix Domain Socket ,使用 0 作为端口号,并使用有效的协议。如果指定了端口,它将用作与导入的主机关联的默认目标端口。如果省略端口,则 Istio 将根据导入的主机来推断监听器端口。注意,当指定多个出口监听器时(其中一个或多个监听具有指定的端口,而其他监听器没有端口),则主机将基于具有指定端口的监听器在监听器端口上暴露 | 否 |
bind | string | 监听器应绑定到的 IP 或 Unix Domain Socket 。如果 bind 不为空,则必须指定 port 。格式:x.x.x.x 或 unix:///path/to/uds 或 unix://@foobar (Linux 抽象命名空间)。如果省略,则 Istio 将根据导入的服务、应用此配置的工作负载实例和 captureMode 来自动配置默认值。如果 captureMode 为 NONE ,则 bind 默认为 127.0.0.1 | 否 |
captureMode | CaptureMode | 当绑定地址是 IP 时,captureMode 选项指示如何捕获(或不捕获)到监听器的流量。bind 绑定为 Unix Domain Socket 时 captureMode 必须为 DEFAULT 或 NONE | 否 |
hosts | string[] | 监听器以 namespace/dnsName 格式公开的一台或多台服务主机。与 dnsName 匹配的指定命名空间中的服务 将被公开。相应的服务可以是服务注册表中的服务(如 Kubernetes 或 Cloud Foundry 服务),也可以是使用 ServiceEntry 或 VirtualService 配置指定的服务。在相同命名空间中任何关联的 DestinationRule 也将被使用。在 dnsName 应该使用 FQDN 格式指定,可以在最左边的部分中包含一个通配符(如 prod/*.example.com )。将 dnsName 设置为 * 以从指定的命名空间(如 prod/* )中选择所有服务。namespace 可以设置为 * 、 / 、~ ,分别表示任何、当前、没有命名空间。例如 */foo.example.com 从任何可用的命名空间中选择服务,而 ./foo.example.com 仅从 Sidecar 当前的命名空间中选择服务。如果将主机设置为 */* ,则 Istio 将配置 Sidecar ,使其能够访问暴露到 Sidecar 命名空间的网格中的每个服务。~/* 可用于完全削减 Sidecar 的配置,仅接收流量并做出响应,但没有自己的出站连接。注意:暴露到 Sidecar 的命名空间的服务和配置(如 exportTo 设置为 * )才能被引用,私有配置(如 exportTo 设置为 . )将不可用。警告:Sidecar 如果启用了出口主机列表,则 Sidecar 中的出口主机列表还必须包括 Mixer 控制平面服务,否则 Envoy 将无法到达他们。例如,启用遥测功能时添加主机 istio-system/istio-telemetry.istio-system.svc.cluster.local ,启用策略功能时添加主机 istio-system/istio-policy.istio-system.svc.cluster.local ,或者添加 istio-system/* 以允许 istio-system 命名空间中的所有服务 | 是 |
IstioIngressListener
IstioIngressListener
指定附加到工作负载实例的 Sidecar
代理上的入站流量监听器的属性。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
port | Port | 与监听器相关联的端口 | 是 |
bind | string | 监听器应绑定到的 IP。必须采用格式 x.x.x.x 。入口监听器的 bind 字段中不允许使用 Unix Domain Socket 。如果省略,则 Istio 将根据导入的服务、应用此配置的工作负载实例来自动配置默认值 | 否 |
captureMode | CaptureMode | captureMode 选项指定期望如何捕获(或不捕获)到监听器的流量 | 否 |
defaultEndpoint | string | 流量应转发到的环回 IP endpoint 或 Unix Domain Socket 。此配置可用于将到达 Sidecar 上的绑定 IP:Port 的流量重定向到 localhost:port 或应用程序工作负载实例正在监听连接的 Unix Domain Socket 。格式应为 127.0.0.1:PORT 或 unix:///path/to/socket | 是 |
OutboundTrafficPolicy
OutboundTrafficPolicy
设置 Sidecar
的默认行为,用于处理来自应用程序的出站流量。如果应用程序使用一个或多个未知的外部服务,则将策略设置为 ALLOW_ANY
可以让 Sidecars
将来自应用程序的所有未知流量路由到其请求的目的地。建议使用 ServiceEntry
配置来声明任何外部依赖项,而不要使用 ALLOW_ANY
,以便可以监视到这些服务的流量。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
mode | Mode | 否 |
OutboundTrafficPolicy.Mode
名称 | 描述 |
---|---|
REGISTRY_ONLY | 出站流量将仅限于服务注册表中定义的服务以及通过 ServiceEntry 配置定义的服务 |
ALLOW_ONLY | 如果目标端口没有服务或 ServiceEntry 配置,将允许出站流量去往未知目的地 |
Sidecar
Sidecar
描述了 Sidecar
代理的配置,该代理负责协调它所附加的工作负载实例的入站和出站通信。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
workloadSelector | WorkloadSelector | 用于选择在其上应用 Sidecar 配置的特定的 Pod/VM 集合的标准。如果省略,Sidecar 配置将应用于同一命名空间中的所有工作负载实例 | 否 |
ingress | IstioIngressListener[] | ingress 指定 Sidecar 的配置,用于处理到附加工作负载实例的入站流量。如果省略,Istio 将根据从编排平台获得的工作负载信息(如 暴露的端口、服务等)自动配置 Sidecar 。如果指定,当且仅当工作负载实例与服务关联时配置入站端口 | 否 |
egress | IstioEgressListener[] | egress 指定 Sidecar 的配置,用于处理从附加的工作负载实例到网格中其他服务的出站流量 | 是 |
outboundTrafficPolicy | OutboundTrafficPolicy | 允许配置出站流量策略。如果应用程序使用一个或多个未知的外部服务,将策略设置为 ALLOW_ANY 可以让 Sidecars 将来自应用程序的所有未知流量路由到其请求的目的地 | 否 |
WorkloadSelector
WorkloadSelector
指定用于确定 Gateway
,Sidecar
或 EnvoyFilter
配置是否可以被应用到代理。匹配条件包括与代理关联的元数据,工作负载实例信息(如 附加到 Pod/VM
的标签)或代理在初始握手期间提供给 Istio 的任何其他信息。如果指定了多个条件,则必须匹配所有条件才能选择工作负载实例。当前,仅支持基于标签的选择机制。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
labels | map<string, string> | 一个或多个标签,指定 Sidecar 在其上应用此配置的一组特定的 Pod/VM 。标签搜索的范围仅限于资源所在的配置命名空间 | 是 |