istio系列:第三章-目的地规则
DestinationRule定义在路由发生后应用于服务的流量的策略。这些规则指定负载平衡的配置、sidecar 的连接池大小以及异常值检测设置,以检测并从负载平衡池中驱逐不健康的主机。
下面是DestinationRule的具体属性
type DestinationRule struct {
Host string
TrafficPolicy *TrafficPolicy
Subsets []*Subset
ExportTo []string
WorkloadSelector *v1beta1.WorkloadSelector
}
让我们对属性一一分析
Host
服务注册表中的服务名称
TrafficPolicy
应用的流量策略(负载平衡策略、连接池大小、异常值检测)
type TrafficPolicy struct {
//负载平衡器算法的设置
LoadBalancer *LoadBalancerSettings
//请求连接数
ConnectionPool *ConnectionPoolSettings
//从负载平衡池中逐出不健康主机的设置
OutlierDetection *OutlierDetection
//TLS请求设置
Tls *ClientTLSSettings
//特定于各个端口的流量策略
PortLevelSettings []*TrafficPolicy_PortTrafficPolicy
Tunnel *TrafficPolicy_TunnelSettings
}
我们重点关注前两个属性
LoadBalancer
type LoadBalancerSettings struct {
// 负载均衡策略,两种实现
// LoadBalancerSettings_Simple 默认值
// LoadBalancerSettings_ConsistentHash 基于一致性哈希的负载均衡
LbPolicy isLoadBalancerSettings_LbPolicy
// 本地负载均衡器设置
LocalityLbSetting *LocalityLoadBalancerSetting
WarmupDurationSecs *duration.Duration
}
对于负载均衡里的LoadBalancerSettings_Simple有以下集中策略
- LoadBalancerSettings_RANDOM 随机负载均衡器选择一个随机的健康主机。 随机的如果没有运行状况,负载均衡器通常比轮询执行得更好。
- LoadBalancerSettings_ROUND_ROBIN 循环负载
- LoadBalancerSettings_LEAST_REQUEST 最小请求负载
对于LoadBalancerSettings_ConsistentHashLB要复杂一些
可以使用基于一致性哈希的负载均衡来提供软基于 HTTP 标头、cookie 或其他的会话亲和性特性。
type LoadBalancerSettings_ConsistentHashLB struct {
// The hash key to use.
//
// Types that are assignable to HashKey:
// *LoadBalancerSettings_ConsistentHashLB_HttpHeaderName
// *LoadBalancerSettings_ConsistentHashLB_HttpCookie
// *LoadBalancerSettings_ConsistentHashLB_UseSourceIp
// *LoadBalancerSettings_ConsistentHashLB_HttpQueryParameterName
HashKey isLoadBalancerSettings_ConsistentHashLB_HashKey
//哈希的最小虚拟节点数 默认为 1024。环尺寸越大,粒度越大加载分布。 如果负载均衡中的主机数
// 池大于环大小,每个主机将被分配一个
// 单个虚拟节点。
MinimumRingSize uint64
}
对于LocalityLbSetting来说,我们可以设置错误转移策略、POD优先级等
type LocalityLoadBalancerSetting struct {
//根据标签对来源的划分,进行权重配置
//比如from: us-west/zone1/*
// to:
// "us-west/zone1/*": 80
// "us-west/zone2/*": 20
Distribute []*LocalityLoadBalancerSetting_Distribute
// 里面有两个属性form与to,form为源地址,假设原地址访问失败就会重定向到to配置的地址里面
Failover []*LocalityLoadBalancerSetting_Failover
// 根据label匹配数计算权重进行基于优先级的负载均衡
// 假设有配置了N个标签 算法为,全匹配 为P(0),n-1个标签匹配为p(1),
//第一个没有匹配就为p(n)最低的优先级,原理为仅当前 n-1 个标签匹配时,才会认为第 n 个标签匹配。
FailoverPriority []string
//启用局部负载平衡
Enabled *wrappers.BoolValue
}
connectionPool
type ConnectionPoolSettings struct {
// tpc连接池配置
Tcp *ConnectionPoolSettings_TCPSettings
// http连接池配置
Http *ConnectionPoolSettings_HTTPSettings
}
Tcp
type ConnectionPoolSettings_TCPSettings struct {
// 最大连接数
MaxConnections int32
// 连接超时时间
ConnectTimeout *duration.Duration
// 设置 SO_KEEPALIVE 以启用 TCP Keepalives
TcpKeepalive *ConnectionPoolSettings_TCPSettings_TcpKeepalive
}
http
type ConnectionPoolSettings_HTTPSettings struct {
// 对目标的最大挂起 HTTP 请求数。默认 2^32-1
Http1MaxPendingRequests int32
// 对后端的最大请求数。默认 2^32-1。http2.0默认为长连接
Http2MaxRequests int32
//每个连接到后端的最大请求数。将此参数设置为 1 将禁用保持活动。默认为 0,表示“无限制”,最大为 2^29。
MaxRequestsPerConnection int32
// 最大重试次数
MaxRetries int32
//连接的空闲超时
IdleTimeout *duration.Duration
// 指定是否应将关联目标的 http1.1 连接升级到 http2。
H2UpgradePolicy ConnectionPoolSettings_HTTPSettings_H2UpgradePolicy
//设置为 true,客户端协议将在发起与后端的连接时保留
UseClientProtocol bool
}
Subsets
服务的端点子集。子集可用于 A/B 测试或路由到特定服务版本等场景
type Subset struct {
//子集的名称
Name string
//标签在服务注册表中的服务端点上应用过滤器
Labels map[string]string
// 适用于此子集的流量策略,如果配置,覆盖父集的策略配置
TrafficPolicy *TrafficPolicy
}
在VirtualService中,我们就可以使用destination规则与子集实现灰度发布等功能。
##ExportTo
此目标规则引用到的命名空间列表
WorkloadSelector
过滤可以被使用的POD与VM