Sidecar CRD说明

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-us1prod-apisistio-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流量。

展开查看Sidecar YAML

apiVersion: networking.istio.io/v1beta1
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/*"

示例四:为命名空间中包含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 YAML

apiVersion: networking.istio.io/v1beta1
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"

展开查看ServiceEntry YAML

该YAML用于路由到mysql.foo.com:3306

apiVersion: networking.istio.io/v1beta1
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

字段说明

Sidecar

Sidecar描述被附加到工作负载上的Sidecar代理的配置,由Sidecar代理去调制工作负载的入站和出站通信。

字段

类型

是否必选

说明

workloadSelector

WorkloadSelector

用于选择哪些Pod适用于此Sidecar配置的条件。如果省略,Sidecar配置将应用于同一命名空间中的所有工作负载实例。

ingress

IstioIngressListener[]

用于指定代理处理其关联的工作负载入站流量时的配置。

  • 如果省略,服务网格将根据从编排平台获取的有关工作负载的信息(例如暴露的端口、服务等)自动配置Sidecar。

  • 如果指定,当且仅当工作负载实例与服务关联时才配置入站端口。

egress

IstioEgressListener[]

用于指定代理处理其关联的工作负载出站流量时的配置。如果未指定,则继承系统从命名空间范围或全局范围检测到的默认Sidecar。

outboundTrafficPolicy

OutboundTrafficPolicy

外部流量策略配置。如果您的应用程序使用了一个或多个未注册的外部服务,则将策略设置为ALLOW_ANY会导致Sidecar将应用程序发起的任何未知流量路由到其请求的目标。如果未指定,则继承系统从命名空间范围或全局范围检测到的默认Sidecar。

IstioIngressListener

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

字段

类型

是否必选

说明

port

Port

与监听器关联的端口。

bind

string

监听器应绑定的IP地址(IPv4或IPv6)。在入口监听器的绑定字段中不允许使用Unix域套接字地址。如果省略,服务网格将根据导入的服务和应用此配置的工作负载自动配置默认值。

captureMode

CaptureMode

指定如何捕获(或不捕获)到监听器的流量。

defaultEndpoint

string

流量应转发到的IP端点或Unix域套接字。此配置可用于将到达Sidecar上IP:Port的流量重定向到localhost:Port或应用工作负载正在监听的Unix域套接字。不支持任意IP。格式如下:

  • 127.0.0.1:PORT

  • [::1]:PORT(转发到本地)

  • 0.0.0.0:PORT

  • [::]:PORT(转发到实例IP)

  • unix:///path/to/socket(转发到Unix域套接字)

tls

ServerTLSSettings

一组与TLS相关的选项。这些选项将启用Sidecar对于来自网格外部的请求的TLS终止。仅支持SIMPLE和MUTUAL TLS模式。

IstioEgressListener

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

字段

类型

是否必选

说明

port

Port

与监听器关联的端口。如果使用Unix域套接字,请使用0作为端口号,并使用有效协议。如果指定了端口,将使用该端口作为导入主机关联的默认目标端口。如果省略端口,Istio将根据导入的主机推断监听器端口。

当指定多个出口监听器,其中存在监听器具有特定端口,而其他监听器没有端口时,暴露在监听器端口上的主机将基于具有最具体端口的监听器。

bind

string

监听器应绑定的IP地址(IPv4或IPv6)。如果bind不为空,则必须指定port字段。格式如下:

  • IPv4或IPv6地址格式

  • unix:///path/to/uds

  • unix://@foobar(Linux抽象命名空间)。

如果省略,Istio将根据导入的服务、应用此配置的工作负载实例和captureMode自动配置默认值。如果captureModeNONE,则bind将默认为127.0.0.1

captureMode

CaptureMode

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

hosts

string[]

监听器暴露的服务主机,格式为namespace/dnsName。指定命名空间中dnsName匹配的服务将被暴露。相应的服务可以是服务注册表中的服务或使用ServiceEntry或VirtualService声明的服务。您也可以使用同一命名空间中关联到此Pod的DestinationRule。

  • namespace可以设置为*.~,分别代表任何、当前或无命名空间。

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

示例如下:

  • */foo.example.com表示从任何可用的命名空间中选择服务。

  • ./foo.example.com表示仅从Sidecar所在的命名空间中选择服务。

  • 如果主机设置为*/*,则Istio将配置Sidecar以能够到达网格中导出到Sidecar的命名空间的每个服务。

  • ~/*可用于仅接收流量并响应但不进行自己的出站连接的Sidecar的配置。

只能引用导出到Sidecar命名空间(例如exportTo值为*)的服务和配置文件。私有配置(例如exportTo设置为.)将不可用。关于exportTo字段的详细说明,请参见Virtual ServiceDestination RuleService Entry

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

对外部服务的访问策略。取值说明如下:

  • REGISTRY_ONLY:出站流量只允许服务注册表中定义的服务以及通过ServiceEntry配置定义的服务。

  • ALLOW_ANY:如果目标端口没有服务或ServiceEntry配置,将允许到未知目标的出站流量。

CaptureMode

CaptureMode描述如何捕获传入监听器的流量。仅当监听器绑定到IP时适用。

字段

说明

DEFAULT

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

IPTABLES

使用IPtables重定向捕获流量。

NONE

不捕获流量。在出口监听器中使用时,应用程序必须明确与监听器端口或Unix域套接字通信。在入口监听器中使用时,需确保主机上没有其他进程使用监听器端口。