码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微服务17:微服务治理之异常驱逐


    ★微服务系列

    微服务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 总结

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

  • 相关阅读:
    SQL没有指定返回结果类型的映射
    shell之df和du命令介绍
    一周时间深扒事务之事务类内部调用失效 超详细源码解析
    pinia 笔记
    携手聚力 共赢数智未来丨物通博联招募生态合作伙伴
    正则表达式replaceFirst()方法具有什么功能呢?
    Android 集成FCM(Google 推送)导致上架失败,提前获取设备信息ANDROID ID
    Vue---$nextTick、$set、$ref、$event、$bus详细理解
    【java8】时间日期的使用与格式化
    Vue3 你可能忽略的 v-model 的巧用
  • 原文地址:https://www.cnblogs.com/wzh2010/p/17206193.html
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号