微服务17:微服务治理之异常驱逐

服务,治理,异常,驱逐 · 浏览次数 : 0

小编点评

**微服务系列微服务1:微服务及其演进史** **微服务2:微服务全景架构** **微服务3:微服务拆分策略** **服务注册与发现微服务** **通信之网关微服务** **通信之RPC微服务** **通信之RPC实践篇(附源码)** **服务治理来保证高可用** **系统服务熔断、限流微服务** **熔断、降级的Hystrix实现(附源码)** **流量策略** **云基础场景下流量策略实现原理** **微服务治理之重试** **微服务治理之超时** **微服务治理之熔断、限流**

正文

★微服务系列

微服务1:微服务及其演进史
微服务2:微服务全景架构
微服务3:微服务拆分策略
微服务4:服务注册与发现
微服务5:服务注册与发现(实践篇)
微服务6:通信之网关
微服务7:通信之RPC
微服务8:通信之RPC实践篇(附源码)
微服务9:服务治理来保证高可用
微服务10:系统服务熔断、限流
微服务11:熔断、降级的Hystrix实现(附源码)
微服务12:流量策略
微服务13:云基础场景下流量策略实现原理
微服务14:微服务治理之重试
微服务15:微服务治理之超时
微服务16:微服务治理之熔断、限流

1 介绍

大家都知道,一个主机(或称为节点)可以部署多个Pod,Pod作为Kubernetes中的最小部署单元。是一组一个或多个紧密关联的容器的集合,它们共享相同的网络命名空间和存储卷。
一般来说,服务上云之后,我们的服务会配置 anti-affinity(反亲和调度),他有哪些利弊权衡呢:

  • affinity 可以实现就近部署,增强网络能力实现通信上的就近路由,减少网络的损耗。如同一个BCC聚类多个实例Pod。
  • anti-affinity 反亲和性主要是出于高可靠性考虑,尽量分散实例Pod,某个节点故障的时候,对应用的影响只是 N 分之一或者单实例。

所以,最终的部署结构可能是:
image
同一个服务(如 Service A)的实例不会部署在同一个主机节点上(Node),即Node1上不会同时存在 Service-A-Ins1 和 Service-A-Ins2,这就好比如把鸡蛋分在不同的篮子里,不会因为一个主机节点故障导致全盘失败的风险。
但是依然不能解决一个问题,就是主机上可能部署了别的服务,如Service-A和B、C、D混部,虽然你们运行在不同的主机上,但是如果因为BCD服务导致的故障把整个主机节点都拖垮了,依然会影响你们的稳定性,至少是你们某个实例的稳定性。
所以需要强有力的解决方案来高保你们服务健壮存活着。

2 实例异常之后的解决方案

2.1 对集群的异常实例进行驱逐

下面以Istio为例子说明

服务混部模型下,经常会因为某一个或者某几个实例的故障而导致整个服务可用性降低。适当的把故障的实例短暂的驱逐出集群,可以保证整个集群的健康。
image
★ 这种手段在云基础上我们称之为离群检测(Outlier Detection):
当集群中的服务故障的时候,其实我们最优先的做法是先进行离群,然后再检查问题,处理问题并恢复故障。所以,能否快速的离群对系统的可用性很重要。
Outlier Detection 允许你对上游的服务进行扫描,然后根据你设置的参数来判断是否对服务进行离群。
下面的配置表示每秒钟扫描一次上游主机,连续失败 2 次返回 5xx 错误码的所有主机会被移出负载均衡连接池 3 分钟,上游被离群的主机在集群中占比不应该超过10%。
但无论比例多少,只要你集群下的服务实例>=2个,都将弹出至少1个主机。它有很详细的配置,参考
注意:3分钟之后回群,如果再被离群,则为上次离群时间+本次离群时间,即 3+3;默认恐慌阈值为0,不启用,建议设置30%(可调整比例)被离群,进入恐慌模式,不再驱逐。

outlierDetection:
      consecutiveErrors: 2
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 10

2.2 单(实例)节点的长时间故障不可用

当一个集群实例保持长时间的异常,或者说在指定时间驱逐回归之后依然是异常状态,则说明该实例的环境(或者该实例所属的主机环境)始终保持在一个不健康的状态。
比较好的自愈办法是:隔离并摘除流量,重启之后调度在另一台主机上去创建一个新实例,重新引入流量,达到故障恢复的目的。
image
实例容器重建能力一般是采用容器健康探针来进行摘流和重启。需要注意的是,极端异常会引发批量重启,这其实是个缺陷。
解决方案是PDB(Pod Disruption Budget),它负责中断预算,避免过度重启导致问题!PDB的作用就是通过控制 minAvailable(maxUnavailable)来控制存活的Pod实例,低于这个数,无论如何都不让重启了。

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: svc-a-pdb
spec:
  minAvailable: 8  #svc-a至少要有8个实例是存活着得
  selector:
    matchLabels:
      app: svc-a

3 总结

云基础场景下的多副本服务的单个副本出故障或者异常的现象在业内还是很常见的,这边讲解了初级版的异常驱逐和容器重启,
而且这种驱逐和重启是在平滑下执行的,对用户无感,让用户有一个更优良的使用体验。
在后续的章节我们在了解下大集群模式下的高可用架构怎么设计。

与微服务17:微服务治理之异常驱逐相似的内容:

微服务17:微服务治理之异常驱逐

★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC 微服务8:通信之RPC实践篇(附源码) 微服务9:服务治理来保证高可用 微服务10:系统服务熔断、

Spring Cloud微服务下如何配置I8n

什么是I8n 国际化(I18n)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和地区的支持。 这样,当产品需要在新的地理区域或语言环境中使用时,只需要添加或更新相应的资源文件,而不

微服务新体验之Aspire初体验

安装aspire 查看vs版本 我这的版本是17.9.7,不支持aspire,所以需要升级 更新VS 点击 帮助->检查更新 点击更新 静等安装升级 创建aspire项目 项目创建成功,如下图 运行Aspire项目 在AspireApp1.AppHost的launchSettings.json文件中

这些负载均衡都解决哪些问题?服务、网关、NGINX

这篇文章解答一下群友的一系列提问: 在微服务项目中,有服务的负载均衡、网关的负载均衡、Nginx的负载均衡,这几个负载均衡分别用来解决什么问题呢? 在微服务项目中,服务的负载均衡、网关的负载均衡和Nginx的负载均衡都用于解决不同的问题: 1. 服务的负载均衡: 先抛出一个问题: 当一个微服务被多个

更安全、更低耗的微服务架构改造之道

摘要:微服务改造是政企客户云原生演进的重头戏,但如何做到成本低、安全性高、性能不变、方便调用等,却是一门学问。本文讲述华为云Stack的解决之道。 本文分享自华为云社区《【华为云Stack】【大架光临】第17期:更安全、更低耗的微服务架构改造之道》,作者:杨奕 华为云技术规划专家。 在以往的文章《云

Ribbon默认负载均衡规则替换为NacosRule

> 近期博主在参与一个 Spring Cloud 搭建,版本为 Hoxton.SR12,服务注册发现组件为 Nacos 的老项目时,发现项目负载均衡组件 Ribbon 的负载均衡规则在某些场景下不够完美,比如新版本上线,需要重启服务。因此写了这边文章与大家分享。 在微服务架构中,负载均衡是实现高可用

[转帖]Skywalking介绍

https://www.jianshu.com/p/ffa7ddcda4ab/ 1.1 2022.01.23 17:23* 字数 1733 阅读 129682评论 0喜欢 16 微服务架构已经是一个很通用的系统架构,常见的技术栈如下图所示,这张架构图基本涵括了当前微服务体系下的各种技术栈,可能不同的

.NET 高效灵活的API速率限制解决方案

前言 FireflySoft.RateLimit是基于.NET Core和.NET Standard构建,支持多种速率限制算法和策略,包括固定窗口、滑动窗口、漏桶、令牌桶等。通过简单的配置和集成,开发者可以快速地将其应用到现有的Web API、微服务或中间件中,实现对请求的精确控制。 同时,该库还支

微服务架构必备技术栈:万变不离其宗的奥义!

前言 之前我们说过,微服务是一种软件设计、架构思想。当然,里面也包含了相关技术点要解决当前要务。学习微服务,我们不能空口而谈,一定要落实到具体的技术栈上。 当今使用比较多两个技术体系,一个是Java,另外一个就是Net。 废话不多说,今天我就把相关“微服务架构”所用到的技术栈罗列出来。(以下是微软相

微服务实践k8s&dapr开发部署实验(3)订阅发布

自托管模式运行dapr 新建订阅webapi项目,取名为backend 项目增加docker支持,取消https支持 修改Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddControll