istio系列:第三章-目的地规则

本文深入探讨了Istio的DestinationRule,它定义了路由后的服务流量策略,包括负载均衡、连接池配置和异常检测。重点讲解了LoadBalancer的随机、轮询和最小请求策略,以及一致性哈希负载均衡。此外,还介绍了连接池的TCP和HTTP设置,如最大连接数、超时时间和重试策略。DestinationRule的Subsets功能则允许进行A/B测试和灰度发布。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值