3.3 destinationRule
destinationRule 和 VirtualService的联系和区别
1)两者之间的关系
在讲解virtualService中,路由目标对象destination中会包含Service子集的subset字段,这个服务子集就是通过DestinationRule定义的。
2) 两者都是用于流量治理,那应用场景有什么区别?
virtualService是一个虚拟的service,描述的是满足什么条件的流量被那个后端处理。类似于根据路径去匹配方法,是更开放的martch条件。
DestinationRule描述的是这个请求到达某个后端后怎么去处理,是方法内的处理逻辑。
所以负载均衡和熔断策略是定义在DestinationRule中的,还可以配置连接池大小、异常实例驱逐规则等功能。
vs和dr中的host:
VS里的hosts指向的就是DR的host;DR的host设置的是底层平台(如k8s)的service名称,因为最终是需要利用平台的dns来把请求导向目的地的。
这种用2个api资源设计的目的之一就是各司其职,VS负责配置路由信息,DR负责配置目标和策略。
3.3.1 destinationRule配置示例
如图
定义了forecast服务的两个版本子集V1和V2,并对两个版本分别配置了随机和轮询负载均衡策略。
3.3.2 destinationRule规则定义
重要属性如下
1)host
必选字段,标识规则的适用对象,取值是服务注册中心中注册的服务名,可以是网格内或以serviceEntry方式注册的网格外的服务。
2)subsets
定义的服务子集,经常用来定义一个服务版本。
3)trafficPolicy
定义规则内容,包括负载均衡、连接池策略、异常点检查扥。
4)exportTo
控制在一个命名空间下定义的资源对象是否可以被其他命名空间下的sidecar执行。
未赋值,则默认全局可见。“.”表示仅应用到当前命名空间,“*”表示应用到所有命名空间。
1 trafficPolicy:流量策略
主要包括四个配置:
◎ loadBalancer:LoadBalancerSettings类型,描述服务的负载均衡算法。
◎ connectionPool:ConnectionPoolSettings类型,描述服务的连接池配置。
◎ outlierDetection:OutlierDetection,描述服务的异常点检查。
◎ tls:TLSSettings类型,描述服务的TLS连接设置。
此外,还包含一个PortTrafficPolicy类型的portLevelSettings,表示对每个端口的流量策略。
2.负载均衡设置(LoadBalancerSettings)
1)simple字段,提供的负载均衡算法如下:
◎ ROUND_ROBIN:轮询算法,如果未指定,则默认采用这种算法。
◎ LEAST_CONN:最少连接算法,算法实现是从两个随机选择的服务后端选择一个活动请求数较少 的后端实例。
◎ RANDOM:从可用的健康实例中随机选择一个。
◎ PASSTHROUGH:直接转发连接到客户端连接的目标地址,即没有做负载均衡。
配置示例如图:
2)consistentHash字段
高级的负载均衡策略,仅对http有效,原因是实现上基于HTTP Header、Cookie的值取hash。如:
◎ httpHeaderName:计算哈希的Header。
◎ httpCookie:计算哈希的Cookie。
◎ useSourceIp:基于源IP计算哈希值。
◎ minimumRingSize:哈希环上虚拟节点数的最小值,节点数越多则负载均衡越精细。
实例如下:
3 连接池设置 - ConnectionPoolSettings
Istio连接池管理在协议上分为TCP流量和HTTP流量治理
1)TCP连接池配置
◎ maxConnections:上游服务的所有实例建立的最大连接数,默认是 1024,属于 TCP层的配
置,对于 HTTP,只用于 HTTP/1.1,因为 HTTP/2对每个主机都使用单个连接。
◎ connectTimeout:TCP连接超时,表示主机网络连接超时,可以改善因调用服务变慢导致整个链路
变慢的情况。
◎ tcpKeepalive:设置TCP keepalives,是Istio1.1新支持的配置,定期给对端发送一个keepalive的探测包,判断连接是否可用。
实例如图:
最大连接数是80,连接超时是25毫秒,并且配置了TCP的 Keepalive探测策略。
2)http连接池配置
◎ http1MaxPendingRequests:最大等待 HTTP 请求数,默认值是 1024,只适用于HTTP/1.1 的服务,因为 HTTP/2 协议的请求在到来时会立即复用连接,不会在连接池等待。
◎http2MaxRequests:最大请求数,默认是1024。只适用于HTTP/2服务,因为HTTP/1.1使用最大连
接数maxConnections即可,表示上游服务的所有实例处理的最大请求数。
◎ maxRequestsPerConnection:每个连接的最大请求数。HTTP/1.1和HTTP/2连接池都遵循此参数。如果没有设置,则没有限制。设置为1时表示每个连接只处理一个请求,也就是禁用了Keep-alive。
◎ maxRetries:最大重试次数,默认是3,表示服务可以执行的最大重试次数。如果调用端因为偶尔
抖动导致请求直接失败,则可能会带来业务损失,一般建议配置重试,若重试成功则可正常返回数据, 只不过比原来响应得慢一点,但重试次数太多会影响性能,要谨慎使用。
不要重试那些重试了也总还是失败的请求;不要对那些消耗大的服务进行重试,特别是那些不会被取消的服务。
◎ idleTimeout:空闲超时,定义在多长时间内没有活动请求则关闭连接。
http一般和tcp设置配合使用,配置如下:
为forecast服务配置最大80个连接,只允许最多有800个并发请求,每个连接 的请求数不超过10个,连接超时是25毫秒
4 异常实例检测设置(OutlierDetection)
符合一般意义的熔断模型。
两种健康检查:
主动型的健康检查:定期探测目标服务实例,根据应答来判断服务实例的健康状态。如负载均衡器中的健康检查
被动型的健康检查:通过实践的访问情况来找出不健康的实例,如isito中的异常点检查。
异常实例检查相关的配置:
◎ consecutiveErrors:实例被驱逐前的连续错误次数,默认是 5。对于 HTTP 服务,返回 502、503 和 504 的请求会被认为异常;对于 TCP 服务,连接超时或者连接错误事件会被认为异常。
◎ interval:驱逐的时间间隔,默认值为10秒,要求大于1毫秒,单位可以是时、分、毫秒。
◎ baseEjectionTime:最小驱逐时间。一个实例被驱逐的时间等于这个最小驱逐时间乘以驱逐的次 数。这样一个因多次异常被驱逐的实例,被驱逐的时间会越来越长。默认值为30秒,要求大于1毫秒,单 位可以是时、分、毫秒。
◎ maxEjectionPercent:指负载均衡池中可以被驱逐的故障实例的最大比例,默认是10%,设置这个 值是为了避免太多的服务实例被驱逐导致服务整体能力下降。
◎ minHealthPercent:最小健康实例比例,是Istio 1.1新增的配置。当负载均衡池中的健康实例数的比 例大于这个比例时,异常点检查机制可用;当可用实例数的比例小于这个比例时,异常点检查功能将被 禁用,所有服务实例不管被认定为健康还是不健康,都可以接收请求。参数的默认值为50%。
实例如图:
含义:
检查4分钟内forecast服务实例的访问异常情况,连续出现5次访问异常的实例将被隔离 10 分钟,被隔离的实例不超过 30%,在第 1次隔离期满后,异常实例将重新接收流量,如果仍然不能正常工 作,则会被重新隔离,第 2 次将被隔离 20 分钟
5 端口流量策略设置
在端口上配置流量策略,且端口上流量策略会覆盖全局的流量策略。
关于配置方法与TrafficPolicy没有大差别,一个关键的差别字段就是 port
实例如图:
为forecast 服务配置了最大连接数 80,但是为端口 3002 单独配置了最大连接数100。
6 服务子集(Subset)
定义服务的子集。可以在VirtualService中使用。
重要属性:
◎ name:Subset的名字,为必选字段。通过VirtualService引用的就是这个名字。
◎ labels:Subset上的标签,通过一组标签定义了属于这个Subset的服务实例。比如最常用的标识服
务版本的Version标签。
◎ trafficPolicy:应用到这个Subset上的流量策略。
实例,给一个特定的Subset配置最大连接数:
3.3.3 DestinationRule的典型应用
1 定义subset
通过DestinationRule定义Subset,就可以配合VirtualService给每个Subset配置路由规 则
2 服务熔断
istio在功能上有异常点检查和连接池管理两种手段,一般结合使用。
连接池配置:
以上配置的效果是:为forecast服务配置最大80个连接,最大请求数为800,每个连接的请求数都不超过10个,连接超时是25毫秒;
异常点检查:在4分钟内若有某个forecast服 务实例连续出现5次访问异常,比如返回5xx错误,则该forecast服务实例将被隔离10分钟,被隔离的实例 总数不超过30%。在第1次隔离期满后,异常的实例将重新接收流量,如果实例工作仍不正常,则被重新 隔离,第2次将被隔离20分钟,以此类推。
3 负载均衡
如下所示为给forecast服务的两个版本Subsetv1和v2分别配置RANDOM和ROUND_ROBIN的负载均衡策略。
如图:
4 TLS认证配置
为一个服务的调用启用双向认证,当然,前提是服务本身已经通过 Config开启了对应的认证方式。以上配置可以使对于forecast服务的访问使用双向TLS,只需将模式配置为 ISTIO_MUTUAL,Istio便可自动进行密钥证书的管理。配置如下:
3.4 Istio服务网关配置:gateway
gateway和VirtualService的关系
gateway:定义了服务从外面怎么访问,在入口处对服务进行统一治理。
VirtualService:定义了匹配到的内部服务怎么流转。
3.4.1 gateway配置实例
含义:外部通过80端口访问网格内的服务
gateway的配置如图:
配合gateway的使用,修改VirtualService,在host上匹配gateway上请求的主机名,并通过gateways字段关联定义的gateway对象。
VirtualService的定义如图
3.4.2 gateway规则定义
gateway主要包含两个关键字段
1)selector
必选字段,通过该标签找到执行gateway规则的envoy。
2)server
必选字段,表示开放的服务列表,gateway的关键内容信息,是一个数组,每个元素都是server类型。
server的描述字段包括:
1)port
必选,描述对外开放的端口
2)hosts
必选,gateway对外发布的地址,FQDN域名,支持左侧通配符来进行模糊匹配。
3)defaultEndpoint
是 Istio 1.1 新增的属性,表示流量转发的默认后端,可以是一个loopback的后 端,也可以是UNIX的域套接字。
4)tls:在实际使用中考虑到安全问题,相关配置如下
◎ httpsRedirect:是否要做HTTP重定向,在这个布尔属性启用时,负载均衡器会给所有HTTP连接都 发送一个301的重定向,要求使用HTTPS。
◎ mode:在配置的外部端口上使用TLS模式时,可以取PASSTHROUGH、SIMPLE、MUTUAL、 AUTO_PASSTHROUGH这4种模式。
◎ serverCertificate:服务端证书的路径。当模式是SIMPLE和MUTUAL时必须指定,配置在单向和双 向认证场景下用到的服务端证书。
◎ privateKey:服务端密钥的路径。当模式是SIMPLE和MUTUAL时必须指定,配置在单向和双向认 证场景下用到的服务端私钥。
◎ caCertificates:CA 证书路径。当模式是 MUTUAL 时指定,在双向认证场景下配置在Gateway上验 证客户端的证书。
◎ credentialName:Istio 1.1 的新特性,用于唯一标识服务端证书和密钥。Gateway使用 credentialName从远端的凭据存储(如 Kubernetes的 Secrets)中获取证书和密钥,而不是使用Mount的文 件。
◎ subjectAltNames:SAN 列表。SubjectAltName 允许一个证书指定多个域名,在Gateways上可以用 来验证客户端提供的证书中的主题标识。
◎ minProtocolVersion:TLS协议的最小版本。
◎ maxProtocolVersion:TLS协议的最大版本。
◎ cipherSuites:指定的加密套件,默认使用Envoy支持的加密套件
3.4.3 gateway的典型应用
1.将网格内的HTTP服务发布为HTTP外部访问,即3.4.1 节的配置示例。
外部服务通过域名http://weather.com访问到应用的入口服务frontend。VirtualService本身定义了 frontend服务从内部和外部访问同样的路由规则,即根据内容的不同,将请求路由到v2版本或v1版本。注意,这里Gateway的协议是HTTP。
2.将网格内的HTTPS服务发布为HTTPS外部访问
这种场景的Gateway配置,重点是:端口为443,协议为HTTPS,TLS模式为 PASSTHROUGH,表示Gateway只透传应用程序提供的HTTPS内容。在本示例中,frontend 入口服务自身是HTTPS类型的服务,TLS需要的服务端证书、密钥等都是由frontend服务自己维护的。
如图所示
3.将网格内的HTTP服务发布为HTTPS外部访问
场景:服务吱声是Http,网格外部通过https访问该服务。
如图
配置Gateway如下,可以看到端口为443,协议为HTTPS。与前一种场景的入口服务自身为 HTTPS不同,这里的TLS模式是SIMPLE,表示Gateway提供标准的单向TLS认证。这时需要通过 serverCertificate和 privateKey提供服务端证书密钥。从图 3-55也可以看到 TLS 认证的服务端是在入口的 Envoy 上创建的,入口服务 frontend 本身保持原有的HTTP方式:
配置如图:
该方式既灵活又满足安全的要求,所以是一种推荐的方式。
4.将网格内的HTTP服务发布为双向HTTPS外部访问
5.将网格内的HTTP服务发布为HTTPS外部访问和HTTPS内部访问
3.5 istio外部服务配置:ServiceEntry
因为有些网格外的服务也需要像网格内的服务一样进行管理,所以需要将网格外的服务加入网格中,即把外部服务加入istio的服务发现。
3.5.1 serviceEntry的配置示例
如图
包装了一个对www.weatherdb.com外部服务的访问。之后再virtualService中就可以做类似的处理了
3.5.2 serviceEntry规则的定义和用法
主要字段包括:
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:表示负载均衡的权重,权重越高,接收的流量占比越大。
3.5.3 ServiceEntry的典型应用
有时对外部服务的访问必须经过一个 对外的 Egress代理的场景,因为只有这个节点有对外的 IP或者这个节点是统一的安全出口等,访问会如 图3-60所示。
如图
这时首先需要创建一个Egress Gateway,创建对外部服务“www.weatherdb.com”的访问:
然后通过如下VirtualService定义流量规则:
◎ 网格内流量:这个Route的gateways是“mesh”关键字,表示来自网格内的流量。这类流量在访 问“www.weatherdb.com”这个外部地址时将被转发到Egress Gateway上。
◎ 网格对外流量:这个 Route匹配的 gateways字段是 Egress,表示匹配来自 Egress的流量,这种流量 将被路由到外部服务“www.weatherdb.com”上。
3.6 istio代理规则配置 sidecar
实现对istio数据面的行为进行更精细的控制。如可以具体到命名空间内的部分服务、输入流量、输出流量做特定的操作与限制。
3.6.1 sidecar配置示例
含义:weather命名空间下的sidecar只可以访问istio-system和news两个命名空间下的服务。
3.6.2 sidecar规则定义
主要包含三个字段
1) workloadSelector:
工作负载的选择器。
设置命名空间下符合特定要求的服务才使用该sidecar的配置,
如果未配置 workloadSelector,则该配置应用到整个命名空间。每个命名空间都 只能定义一个没有workloadSelector的Sidecar
在weather这个命名空间下app标签匹配forecast服务
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。