Istio 庖丁解牛六:多集群网格应用场景

 
 

随着容器技术的流行,大量互联网公司和传统 IT 企业都在尝试应用容器化和服务上云。容器化是一个持续的过程,伴随着多地域部署、安全等级隔离、多云和混合云等复杂的场景需求。

上篇文章中我们成功将广州和新加坡 2 地的 kubernetes 集群连通为一个服务网格,实现了多集群服务透明共享:recommend v1 和 recommend v2 分别部署在广州和新加坡地域, 但是两地用户都可以无差别的访问到任一版本。

640?wx_fmt=png

接下来我们上述环境中, 尝试几个多集群服务网格的应用场景,包括:

相关代码汇总于:zhongfox/multicluster-demo

异地容灾

要保证系统高可用和良好的用户体验,服务多副本部署、特别是异地多副本部署是必不可少的架构, 即使对于吞吐量低压力小的应用,考虑「墨菲定律」单点部署仍是应该尽量避免的。对于 SLA 要求较高的关键系统,两地部署甚至多地部署应对容灾也是非常必要的。

在已部署的环境中, 我们尝试将广州集群中的 recommend v1 服务副本数删除至 0 个,模拟广州集群 recommend 服务实例不可用:

640?wx_fmt=png

这时候我们分别多次访问广州和新加坡商城应用, 发现任一入口访问, 页面都可以正常显示, 且「推荐商品」板块显示的都是 recommend v2 版本, 也就是部署在新加坡地域的有 banner 的版本:

640?wx_fmt=png

现在我们把广州集群 recommend v1 服务扩容为 1 个副本,将新加坡集群 recommend v2 服务副本数降至 0,类似的, 我们可以验证, 两地访问商城应用, 页面显示都正常,而且显示的都是广州集群无 banner 的 recommend v1 版本:

640?wx_fmt=png


地域感知负载均衡

在多地域部署架构中,地域感知负载均衡需求主要源自以下需求:

Locality Load Balancing 是 istio 1.1 增加的 experimental 特性,接下来我们在上述环境中验证此特性:

首先我们先还原上个场景的修改,将广州地域和新加坡地域的 recommend 服务副本都设置为 1:

% kubectl --context guangzhou -nbase scale deploy/recommend-v1 --replicas=1% kubectl --context singapore -nbase scale deploy/recommend-v2 --replicas=1 kubectl --context guangzhou -nbase scale deploy/recommend-v1 --replicas=1
% kubectl --context singapore -nbase scale deploy/recommend-v2 --replicas=1

然后开启 Locality Load Balancing:设置 Pilot 的环境变量:

% kubectl -n istio-system --context guangzhou edit deploy istio-pilot......env:- name: PILOT_ENABLE_LOCALITY_LOAD_BALANCING  value: "ON"
env:
- name: PILOT_ENABLE_LOCALITY_LOAD_BALANCING
  value: "ON"

稍等片刻,分别通过广州和新加坡地域入口多次访问商城应用,可以发现广州入口一直展示 recommend v1 版本,新加坡地域一直展示 recommend v2 版本:

640?wx_fmt=png

开启「地域感知负载均衡」后, 因为流量都在同一个集群中,所以访问速度开启之前,会提升很多,我们实测一下, 在开启「地域感知负载均衡」前后,使用 ab 工具, 模拟访问 2 个地域各 100 次:

640?wx_fmt=png

上图所示,开启「地域感知负载均衡」功能后,请求平均耗时从大概 1116~ 1159 毫秒下降到了 117~132 毫秒。


多地域负载策略分析

在 kubernetes 平台, istio 根据 kubernetes node 上的约定地域标签,来确定 node 上包含的 pod 的地域亲和度,  在 TKE 上, node 默认有了地域标签:

~ % kubectl --context guangzhou get node --show-labelsNAME172.16.48.35   ......failure-domain.beta.kubernetes.io/region=gz,failure-domain.beta.kubernetes.io/zone=100002~ % kubectl --context singapore get node --show-labelsNAME172.22.0.42   ......failure-domain.beta.kubernetes.io/region=sg,failure-domain.beta.kubernetes.io/zone=900001
172.16.48.35   ......
failure-domain.beta.kubernetes.io/region=gz,
failure-domain.beta.kubernetes.io/zone=100002

~ % kubectl --context singapore get node --show-labels
NAME
172.22.0.42   ......
failure-domain.beta.kubernetes.io/region=sg,
failure-domain.beta.kubernetes.io/zone=900001

failure-domain.beta.kubernetes.io/region表示地域, failure-domain.beta.kubernetes.io/zone表示可用区。

地域负载均衡默认会使用地域优先策略,具体讲,一个具体区域的 envoy 会将其他实例做如下优先级处理:

  1. Priority 0 最高优先级:相同地域且相同区域

  2. Priority 1 第二优先级:相同地域但不同区域

  3. Priority 2 最低优先级:不同地域

考虑开启「地域感知负载均衡」后, 整个服务网格如何做失效转移:

为了减少低效的跨地域访问,istio 会尽量保证按照地域优先级负载均衡;但是当本地域服务的可用性降低时,流量应该适当的转移一部分到下一优先级的地域去,流量的转移应该尽量平滑。流量转移的时机不应该等到本区域服务可用性降至零后才开始, 因为这会有服务中断甚至雪崩的风险。

在 envoy 负载均衡策略中,有一个很重要的参数:Overprovisioning Factor 可以翻译为 「预留资源」参数,区域流量降级的时机和比例,会受到本区域的「服务可用性」和「预留资源」参数共同决定。istio 中「预留资源」参数默认是 1.4。

可以这样理解「预留资源」参数:指定区域部署的服务资源, 通常会高于系统实际需要的服务资源,以应对可能出现的各种异常导致的可用性降低。比如本区域 recommend 服务预估 100 副本可以满足用户需求,按照容灾经验我们可能会部署 140 副本。当本区域因为异常导致副本数下降,可用性降低时, 系统应该判断,只有副本数低于 100 时,才开始将多余流量转移到下一级地域。

基于以上网格环境, 我们对地域负载策略进行验证:

在广州集群中, 我们再部署一个新的 recommend deployment,名为 recommend-unhealthy,这个副本的推荐接口直接返回状态码 502,用以模拟不可用的服务实例:

get '/recommend' do  status 502enddo
  status 502
end

同时我们给 recommd 服务加上断路器:

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: recommend  namespace: basespec:  host: recommend.base.svc.cluster.local  trafficPolicy:    tls:      mode: ISTIO_MUTUAL    outlierDetection:      consecutiveErrors: 3      interval: 30s      baseEjectionTime: 3m
metadata:
  name: recommend
  namespace: base
spec:
  host: recommend.base.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
    outlierDetection:
      consecutiveErrors: 3
      interval: 30s
      baseEjectionTime: 3m

表示 recommend 服务实例,如果连续 3 次访问失败,将标记为不可用。不可用实例将被隔离于可用实例之外,持续 3 分钟。

以上操作可以通过执行以下命令实现:

kubectl --context guangzhou -nbase apply -f install/locality-load-balancing.yaml
640?wx_fmt=png

广州集群 2 个  recommend 共同组成该地域的服务 endpoints, 广州 recommend 服务的健康度(可用性)可以表示为:

health = recommend-v1-replicas / (recommend-v1-replicas + recommend-unhealthy-replicas)

按照默认 Overprovisioning Factor 为 1.4,广州集群负载均衡流量百分比数为:

guangzhou-LB = min(100, 1.4 * 100 * health)

新加坡流量百分比数:

singapore-LB = 100 - guangzhou-LB

编写一个 ruby 程序 进行验证:

最初 recommend v1 副本数为 14, recommend unhealthy 副本数为 0, 一直保持 2 个 deployment 的副本总和为 14, 逐渐增加 unhealthy 副本的比重, 等待所有 pod ready 后, 使用广州网关入口发起 1000 次请求, 然后根据响应内容判断 recommend 服务的负载均衡情况:如果内容不包含 recommend banner,是由广州集群提供服务, 如果内容包括 recommend banner, 那么请求就是转移到了新加坡集群,测试结果如下图:

ruby ./install/recommend_stat.rb --ip 134.175.211.151 --count 1000
640?wx_fmt=png

数据统计可以看出,广州健康副本(v1)由 14 个下降到 10 个的过程中,不会出现流量降级到新加坡,当广州健康副本数低于 10 个后,部分流量将会被负载均衡的新加坡集群:

640?wx_fmt=png

只要广州主集群的健康度不为 0(v1 副本 > 0), 则第一优先级的广州集群负载流量也会大于 0,保证剩余的可用性尽量满足地域就近负载。

随着 unhealthy 副本数的增加,我们可以看到访问的错误请求数目并未按比例增加,一直保持在一个平稳的错误值,这是因为我们上面给 recommend 服务配置了断路器,因此服务整体的高可用性得以保证。


在更多个集群连通的网格中,负载算法支持多层降级,另外每个地域也可以显示指定流量降级时的下级集群, 各集群的负载权重也可以手动设置。

利用 Istio 和 envoy 的以上能力,结合各集群的资源情况和业务规划,可以让我们调配出高可用、高性能的多集群服务网格。

 推荐阅读 

        Istio 庖丁解牛五:多集群网格实现分析

        Istio 庖丁解牛四:pilot discovery

        Istio 庖丁解牛三:galley

        Istio 庖丁解牛一:组件概览

第六届 Service Mesh Meetup 广州站

让各位久等了,第六届Service Mesh Meetup广州站开放报名了!涵盖 Kubernetes、微服务和 Service Mesh 话题,8 月 11 日(星期日),广州见!报名地址:https://tech.antfin.com/community/activities/781


640?wx_fmt=jpeg


640?wx_fmt=jpeg

点击 阅读原文 查看更多



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值