Sidecar

Sidecar

Sidecar 描述了 Sidecar 代理的配置,该代理可将入站和出站通信调解到它所附加的工作负载实例。默认情况下,Istio 将为网格中的所有 Sidecar 代理进行必要的配置,以达到网格中的每个工作负载示例,并接受与工作负载相关的所有端口上的流量。Sidecar 配置提供了一种调优端口集的方法,代理在向工作负载转发流量和从工作负载转发流量时将接受端口集和协议。此外,当转发来自工作负载实例的出站流量时,可以限制代理可以访问的服务集。

网格中的服务和配置被组织到一个或多个命名空间(如 Kubernetes 命名空间或 CF org/space)中。命名空间中的 Sidecar 配置将应用于同一命名空间中使用 workloadSelector 字段筛选出来的一个或多个工作负载实例。在 workloadSelector 字段不存在的情况下,它将应用于同一命名空间中的所有工作负载实例。当确定要应用于工作负载实例的 Sidecar 配置时,将优先选择带有该工作负载实例的 workloadSelector 的资源, 而不是没有任何 workloadSelectorSidecar 配置。

注意1:每个命名空间在没有任何 workloadSelector 的情况下只能有一个 Sidecar 配置。如果给定的命名空间中存在多个无选择器的 Sidecar 配置,则系统的行为是不确定的。如果两个或多个带有 workloadSelectorSidecar 配置选择了相同的工作负载实例,则系统的行为是不确定的。

注意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-us1prod-apisistio-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 元数据应包含 REDIRECTTPROXY 作为其值,这意味着基于 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.xunix:///path/to/udsunix://@foobar(Linux 抽象命名空间)。如果省略,则 Istio 将根据导入的服务、应用此配置的工作负载实例和 captureMode 来自动配置默认值。如果 captureModeNONE,则 bind 默认为 127.0.0.1
captureMode CaptureMode 当绑定地址是 IP 时,captureMode 选项指示如何捕获(或不捕获)到监听器的流量。bind 绑定为 Unix Domain SocketcaptureMode 必须为 DEFAULTNONE
hosts string[] 监听器以 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 设置为 .)将不可用。警告: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 endpointUnix Domain Socket。此配置可用于将到达 Sidecar 上的绑定 IP:Port 的流量重定向到 localhost:port 或应用程序工作负载实例正在监听连接的 Unix Domain Socket。格式应为 127.0.0.1:PORTunix:///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 指定用于确定 GatewaySidecarEnvoyFilter 配置是否可以被应用到代理。匹配条件包括与代理关联的元数据,工作负载实例信息(如 附加到 Pod/VM 的标签)或代理在初始握手期间提供给 Istio 的任何其他信息。如果指定了多个条件,则必须匹配所有条件才能选择工作负载实例。当前,仅支持基于标签的选择机制。

字段 类型 描述 是否必需
labels map<string, string> 一个或多个标签,指定 Sidecar 在其上应用此配置的一组特定的 Pod/VM 。标签搜索的范围仅限于资源所在的配置命名空间

猜你喜欢

转载自blog.csdn.net/miss1181248983/article/details/118910409