发布时间:2023-01-04 20:30
网格外的服务也需要像网格内的服务一样进行管理,所以需要将网格外的服务加入网格中,即把外部服务加入istio的服务发现。
如图
包装了一个对www.weatherdb.com外部服务的访问。之后再virtualService中就可以做类似的处理了.
主要字段包括:
1)hosts:必选字段,表示外部服务的主机名,可以是DNS域名,也可以使用前缀模糊匹配。说明:
◎ HTTP的流量,这个字段匹配HTTP Header的Host或Authority。
◎ HTTPS或TLS的流量,这个字段匹配SNI。
◎ 其他协议的流量,这个字段不生效,使用下面的addresses和port字段。
◎ 当resolution被设置为DNS类型并且没有指定endpoints时,这个字段将用作后端的域名来进行路
由。
2)addresses
与服务关联的虚拟IP地址。对于http流量,该字段被忽略,而是使用header中的Host或Authority。
如果address为空,只能根据目标端口识别,该端口不能别网格内别的服务使用。即Sidecar只是作为一个TCP代理,把某个特定端口 的流量转发到配置的目标后端。
3)ports 与外部服务关联的端口,是一个必选端口
4)location 标识配置的服务是在网格内部还是在网格外部。
MESH_EXTERNAL:标识对应的服务是网格外部的
MESH_INTERNAL: 表示服务是网格内部的。如一些虚拟机上的服务不能通过k8s机制在istio中进行服务注册,通过该方式可以扩展网格管理的服务。
5)resolution
用来设置代理解析服务的方式,即讲一个服务名解析到一个后端的IP地址上。
可以是设置NONE STATIC DNS三种模式,具体如下:
◎ NONE:用于当连接的目标地址已经是一个明确IP的场景。当访问外部服务且应用要被解析到一个特定的IP上时,要将模式设为NONE。
◎ STATIC:用在已经用endpoints设置了服务实例的地址场景中,即不用解析。
◎ DNS:表示用查询环境中的DNS进行解析。
如果没有设置endpoints,代理就会使用在hosts中指定 的DNS地址进行解析,前提是在hosts中未使用通配符;
如果设置了endpoints,则使用endpoints中的DNS地 址解析出目标IP。
6)subjectAltNames:表示这个服务负载的SAN列表。在Istio安全相关配置的多个地方被用到,被 设置时,代理将验证服务证书的SAN是否匹配。
7)endpoints:表示与网格服务关联的网络地址,可以是一个IP,也可以是一个主机名。这个字段 是一个Endpoints的复杂结构。
◎ address:必选字段,表示网络后端的地址。在前面 ServiceEntry 的解析方式中resolution 被设置为 DNS时,address可以使用域名,但要求是明确的地址,不可以使用模糊匹配。
◎ ports:端口列表。
◎ labels:后端的标签。
◎ network:这个高级配置主要用在Istio多集群中。所有属于相同network的后端都可以直接互访,不
在同一个 network 的后端不能直接访问。在使用 Istio Gateway时可以对不同network的后端建立连接。
◎ locality:后端的locality,主要用于亲和性路由。即Envoy可以基于这个标识做本地化路由,优先路 由到本地的后端上。locality表示一个故障域,常见的如国家、地区、区域,也可以分割每个故障域来表
示任意层次的结构。
◎ weight:表示负载均衡的权重,权重越高,接收的流量占比越大。
有时对外部服务的访问必须经过一个 对外的 Egress代理的场景,因为只有这个节点有对外的 IP或者这个节点是统一的安全出口等.
如图
这时首先需要创建一个Egress Gateway,创建对外部服务“www.weatherdb.com”的访问:
然后通过如下VirtualService定义流量规则:
◎ 网格内流量:这个Route的gateways是“mesh”关键字,表示来自网格内的流量。这类流量在访 问“www.weatherdb.com”这个外部地址时将被转发到Egress Gateway上。
◎ 网格对外流量:这个 Route匹配的 gateways字段是 Egress,表示匹配来自 Egress的流量,这种流量 将被路由到外部服务“www.weatherdb.com”上。
二、istio代理规则配置 sidecar
实现对istio数据面的行为进行更精细的控制。如可以具体到命名空间内的部分服务、输入流量、输出流量做特定的操作与限制。
主要包含三个字段
2)egress
控制outbound流量,用来配置 Sidecar 对网格内其他服务的访问,如果没配置,则只要命名空间可见,命名空间里的服务就都可以访问。
IstioEgressListener通过如下几个字段来描述规则。
◎ port:监听器关联的端口,被设定后会作为主机的默认目标端口。
◎ bind:监听器绑定的地址。
◎ captureMode:配置如何捕获监听器的流量,可以有DEFAULT、IPTABLES、NONE三种模式。
DEFAULT表示使用环境默认的捕获规则;IPTABLES指定基于iptabels的流量拦截;NONE表示没有流量 拦截。
◎ hosts:是一个必选字段,表示监听器的服务,为“namespace/dnsName”格式。dnsName需要为 FQDN格式,可以对namespace、dnsName使用通配符
实例如图:
说明:
对于istio-system命名空间下的所有Outbound流量,Sidecar都会进行转发;
对于命名空间 weather下的服务,Sidecar只转发目标是3002端口的流量。
3)ingress:IstioIngressListener类型,配置 Sidecar对应工作负载的 Inbound流量。
IstioIngressListener字段和IstioEgressListener字段有点像,但语义不同。
◎ port:必选字段,监听器关联的端口。
◎ bind:监听器绑定的地址。
◎ captureMode:配置如何捕获监听器的流量,该模式的取值同 IstioEgressListener上的对应字段。
◎ defaultEndpoint:必选字段,为流量转发的目标地址。
实例如图
在命名空间weather下匹配forecast负载的Sidecar规则,允许其接收来自3002端口的HTTP流量,并且将请求转发到127.0.0.1。