侧车

Sidecar 描述了与之关联的工作负载实例的入站和出站通信进行中介的侧车代理的配置。默认情况下,Istio 将使用到达网格中每个工作负载实例所需的必要配置以及在与工作负载关联的所有端口上接受流量来对网格中的所有侧车代理进行编程。Sidecar 配置提供了一种方法来微调代理在将流量转发到工作负载和从工作负载转发流量时将接受的端口和协议集。此外,可以限制代理在转发工作负载实例的出站流量时可以到达的服务集。

网格中的服务和配置组织到一个或多个命名空间中(例如,Kubernetes 命名空间或 CF org/space)。命名空间中的 Sidecar 配置将应用于同一命名空间中的一个或多个工作负载实例,这些实例使用 workloadSelector 字段进行选择。在没有 workloadSelector 的情况下,它将应用于同一命名空间中的所有工作负载实例。在确定要应用于工作负载实例的 Sidecar 配置时,将优先考虑选择此工作负载实例的具有 workloadSelector 的资源,而不是任何 workloadSelector 都没有的 Sidecar 配置。

注意 1每个命名空间只能有一个没有 workloadSelectorSidecar 配置,该配置指定该命名空间中所有 Pod 的默认值。建议为命名空间范围的侧车使用名称 default。如果在给定命名空间中存在多个无选择器的 Sidecar 配置,则系统的行为未定义。如果两个或多个具有 workloadSelectorSidecar 配置选择同一个工作负载实例,则系统的行为未定义。

注意 2MeshConfig 根命名空间 中的Sidecar配置将默认应用于所有没有Sidecar配置的命名空间。此全局默认Sidecar配置不应有任何workloadSelector

注意 3即使网关是istio-代理,Sidecar也不适用于网关

以下示例在名为istio-config的根命名空间中声明了一个全局默认Sidecar配置,该配置将所有命名空间中的sidecar配置为仅允许出站流量到同一命名空间中的其他工作负载以及istio-system命名空间中的服务。

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

以下示例在prod-us1命名空间中声明了一个Sidecar配置,该配置覆盖了上面定义的全局默认值,并将该命名空间中的sidecar配置为允许出站流量到prod-us1prod-apisistio-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命名空间中声明了一个Sidecar配置,用于所有具有标签app: ratings且属于ratings.prod-us1服务的Pod。工作负载在端口9080上接受入站HTTP流量。然后,流量被转发到在Unix域套接字上侦听的附加工作负载实例。在出站方向,除了istio-system命名空间之外,sidecar代理仅代理绑定到端口9080的服务在prod-us1命名空间中的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命名空间中声明了一个Sidecar配置,用于所有具有标签app: productpage且属于productpage.prod-us1服务的Pod。假设这些Pod是在没有IPtable规则(即istio-init容器)的情况下部署的,并且代理元数据ISTIO_META_INTERCEPTION_MODE设置为NONE,则以下规范允许此类Pod在端口9080(包装在Istio双向TLS中)接收HTTP流量,并将其转发到侦听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上设置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元数据应包含REDIRECTTPROXY作为其值,这意味着基于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命名空间中声明了一个Sidecar配置,用于所有具有标签app: ratings且属于ratings.prod-us1服务的Pod。该服务在端口8443上接受入站HTTPS流量,并且sidecar代理使用给定的服务器证书终止单向TLS。然后,流量被转发到在Unix域套接字上侦听的附加工作负载实例。预计将配置PeerAuthentication策略,以便在特定端口上将mTLS模式设置为“DISABLE”。在此示例中,端口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描述了代理的配置,该代理会协调附加到的工作负载实例的入站和出站通信。

字段类型描述必填
workloadSelectorWorkloadSelector

用于选择应应用此Sidecar配置的特定Pod/VM集的条件。如果省略,则Sidecar配置将应用于同一命名空间中的所有工作负载实例。

ingressIstioIngressListener[]

Ingress指定sidecar的配置,用于处理到达附加工作负载实例的入站流量。如果省略,Istio将根据从编排平台获取的工作负载信息(例如,公开的端口、服务等)自动配置sidecar。如果指定,当且仅当工作负载实例与服务关联时,才会配置入站端口。

egressIstioEgressListener[]

Egress指定sidecar的配置,用于处理从附加工作负载实例到网格中其他服务的出站流量。如果未指定,则继承来自命名空间范围或全局默认Sidecar的系统检测到的默认值。

inboundConnectionPoolConnectionPoolSettings

控制Envoy将从网络接受的连接数量的设置。此默认值将应用于所有入站侦听器,并且可以在Ingress字段中每个端口覆盖。此配置反映了DestinationRuleconnectionPool字段。

默认情况下,Istio会将服务的DestinationRule应用于客户端sidecar以进行定向到该服务的出站流量——这是人们在配置DestinationRule时通常考虑的情况——但也应用于服务器的入站sidecar。Sidecar的连接池直接配置服务器的入站sidecar,因此其设置可以与客户端的不同。例如,当您有很多客户端调用少量服务器时,这很有价值:DestinationRule可以限制任何单个客户端的并发性,而Sidecar允许您在服务器端配置更高的并发性。

服务器入站sidecar的连接池设置按以下优先级配置,从高到低

  • 来自Sidecar的每个端口的ConnectionPool
  • 来自Sidecar的顶级InboundConnectionPool
  • 来自DestinationRule的每个端口的TrafficPolicy.ConnectionPool
  • 来自DestinationRule的顶级TrafficPolicy.ConnectionPool
  • 默认连接池设置(基本上是无限的)

在每种情况下,都会覆盖连接池设置,而不是合并它们。

outboundTrafficPolicyOutboundTrafficPolicy

设置sidecar处理应用程序出站流量的默认行为。

默认模式为ALLOW_ANY,这意味着将允许到未知目标的出站流量。

IstioIngressListener

IstioIngressListener指定附加到工作负载实例的sidecar代理上入站流量侦听器的属性。

字段类型描述必填
portSidecarPort

与侦听器关联的端口。

bindstring

侦听器应绑定到的IP(IPv4或IPv6)。Unix域套接字地址在入站侦听器的bind字段中不允许使用。如果省略,Istio将根据导入的服务以及应用此配置的工作负载实例自动配置默认值。

captureModeCaptureMode

captureMode选项指示预期如何捕获(或不捕获)到侦听器的流量。

defaultEndpointstring

应将流量转发到的IP端点或Unix域套接字。此配置可用于将到达sidecar上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相关的选项,这些选项将为来自网格外面的请求启用sidecar上的TLS终止。目前仅支持SIMPLE和MUTUAL TLS模式。

connectionPoolConnectionPoolSettings

控制Envoy将从网络接受的连接数量的设置。此设置将覆盖顶级默认inboundConnectionPool以配置此端口的特定设置。此配置反映了DestinationRulePortTrafficPolicy.connectionPool字段。此端口级别的连接池在配置中具有最高优先级,覆盖Sidecar的顶级InboundConnectionPool以及来自DestinationRule的任何连接池设置。

IstioEgressListener

IstioEgressListener指定附加到工作负载实例的sidecar代理上出站流量侦听器的属性。

字段类型描述必填
portSidecarPort

与侦听器关联的端口。如果使用Unix域套接字,请使用0作为端口号,并使用有效的协议。如果指定了端口,则它将用作与导入的主机关联的默认目标端口。如果省略端口,Istio将根据导入的主机推断侦听器端口。请注意,当指定多个出站侦听器时,其中一个或多个侦听器具有特定端口而其他侦听器没有端口,则侦听器端口上公开的主机将基于具有最特定端口的侦听器。

bindstring

侦听器应绑定到的IP(IPv4或IPv6)或Unix域套接字。如果bind不为空,则必须指定Port。格式:IPv4或IPv6地址格式或unix:///path/to/udsunix://@foobar(Linux抽象命名空间)。如果省略,Istio将根据导入的服务、应用此配置的工作负载实例以及captureMode自动配置默认值。如果captureMode为NONE,则bind将默认为127.0.0.1。

captureModeCaptureMode

当绑定地址为IP时,captureMode选项指示预期如何捕获(或不捕获)到侦听器的流量。对于Unix域套接字绑定,captureMode必须为DEFAULT或NONE

hostsstring[]

侦听器以namespace/dnsName格式公开的一个或多个服务主机。将公开指定命名空间中与dnsName匹配的服务。相应服务可以是服务注册表中的服务(例如,Kubernetes或Cloud Foundry服务),也可以是使用ServiceEntryVirtualService配置指定的服务。相同命名空间中的任何关联DestinationRule也将被使用。

dnsName应使用FQDN格式指定,可选地在最左边的组件中包含通配符(例如,prod/*.example.com)。将dnsName设置为*以从指定命名空间选择所有服务(例如,prod/*)。

namespace可以设置为*.~,分别表示任何、当前或无命名空间。例如,*/foo.example.com从任何可用命名空间选择服务,而./foo.example.com仅从sidecar的命名空间选择服务。如果主机设置为*/*,Istio将配置sidecar以能够访问导出到sidecar命名空间的网格中的每个服务。值~/*可用于完全修剪仅接收流量并响应但没有自行进行出站连接的sidecar的配置。

注意:只能引用导出到sidecar命名空间的服务和配置工件(例如,exportTo值为*)。私有配置(例如,exportTo设置为.)将不可用。有关详细信息,请参阅VirtualServiceDestinationRuleServiceEntry配置中的exportTo设置。

WorkloadSelector

WorkloadSelector 指定用于确定 GatewaySidecarEnvoyFilterServiceEntryDestinationRule 配置是否可以应用于代理的标准。匹配标准包括与代理关联的元数据、工作负载实例信息(例如附加到 Pod/VM 的标签)或代理在初始握手期间提供给 Istio 的任何其他信息。如果指定了多个条件,则所有条件都必须匹配才能选择工作负载实例。目前,仅支持基于标签的选择机制。

字段类型描述必填
标签map<string, string>

一个或多个指示应在其中应用配置的特定 Pod/VM 集的标签。标签搜索范围限制在资源所在的配置命名空间。

OutboundTrafficPolicy

OutboundTrafficPolicy 设置 sidecar 处理应用程序发出的未知出站流量的默认行为。

字段类型描述必填
模式模式

SidecarPort

Port 描述服务的特定端口的属性。

字段类型描述必填
数字uint32

有效的非负整数端口号。

协议string

端口上公开的协议。必须是 HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS 之一。TLS 可以用于在特定端口上终止非基于 HTTP 的连接,或者根据 SNI 标头将流量路由到目标而无需终止 TLS 连接。

名称string

分配给端口的标签。

OutboundTrafficPolicy.Mode

名称描述
REGISTRY_ONLY

REGISTRY_ONLY 模式下,将丢弃未知的出站流量。必须通过 ServiceEntry 配置将流量目标显式声明到服务注册表中。

注意:Istio 不提供出站流量安全策略。此选项不会充当安全策略或任何形式的出站防火墙。相反,此选项主要用于为用户提供一种方法,通过显式失败来检测缺少的 ServiceEntry 配置。

ALLOW_ANY

ALLOW_ANY 模式下,将允许任何到未知目标的流量。但是,未知目标流量的功能将受到限制,例如可观察性降低。此模式允许没有通过 ServiceEntry 配置注册所有可能的出口目标的用户仍然连接到任意目标。

CaptureMode

CaptureMode 描述如何预期捕获到侦听器的流量。仅当侦听器绑定到 IP 时才适用。

名称描述
默认

环境定义的默认捕获模式。

IPTABLES

使用 IPtables 重定向捕获流量。

不捕获流量。在出口侦听器中使用时,应用程序预计会显式地与侦听器端口或 Unix 域套接字通信。在入口侦听器中使用时,需要小心确保主机上的其他进程未使用侦听器端口。

此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!