当前位置: 首页 > news >正文

阿里云k8s环境下,因slb限额导致的发布事故

一、背景

阿里云k8s容器,在发布java应用程序的时候,客户端访问出现500错误。

后端服务是健康且可用的,网关层大量500错误请求,slb没有流入和流出流量。

经过回滚,仍未能解决错误。可谓是一次血的教训,特此记录下来,如果你也使用的是阿里云slb来实现k8s的service,值得一看,希望对你有所帮助。

在讲述这个事故前,我们还是照旧把系统架构交待清楚。

二、系统架构

在这里插入图片描述

1、kong upsteam

配置的是slb的内网IP+端口号
在这里插入图片描述

2、k8s的服务service

在这里插入图片描述

3、slb监听虚拟服务器

在这里插入图片描述
在这里插入图片描述

下面是重点需要关注的,,虚拟服务器组下的四个服务器,对应的就是4个pod的ip地址。

本文所述的发布事故,就是这里的服务器没有及时更新导致。

在这里插入图片描述

4、pod的ip地址

在这里插入图片描述
绿色的“Running”,表示Pod节点运行健康。
我这里使用了服务注册中心consul,从consul也能佐证java服务是健康无疑。

在这里插入图片描述

当然我还进一步验证,直接访问pod的接口,比如/info和/health接口,返回的版本号和健康状态也都是正常。

三、问题排查

1、kong网关报错

23937#0: *2832787172 connect() failed (111: Connection refused) while connecting to upstream
request: request: "PUT /api/v3/pub/user/extend HTTP/1.1"

在这里插入图片描述

2、slb监控

可以看到,出现故障之后,连接数和流量将至零。也就是说,http请求没有能够进入后端pod节点。

在这里插入图片描述

3、k8s容器的服务service

在这里插入图片描述

Error syncing load balancer [lb-bpxxxxxxxxxx6ndspgh]: Message: There is backend server has reached to the quota limit number of load balancers that it could be related to.

根据错误信息,查找阿里云的帮助文档,https://help.aliyun.com/zh/slb/classic-load-balancer/developer-reference/api-slb-2014-05-15-errorcodes

见下:

在这里插入图片描述
由此可见,是配额限制了。

继续查找文档,
https://help.aliyun.com/zh/slb/classic-load-balancer/product-overview/limits-1

在这里插入图片描述
可以看到,这里是默认50,所以我们到slb的配额设置查看,并申请调整至80。

在这里插入图片描述

申请调额:

在这里插入图片描述

四、踩过的坑

比较明确的一点是,问题出在slb。所以我们的思路,先是换一个,不行之后,又新建一个全新的slb。其实,问题在于我们忽视了k8s对很多指标的配额阈值。

1、slb的每个实例可以保有的监听数量超过了限制

所以尝试把k8s的服务service修改到另外一个slb,结果还是一样报错。

2、新建一个slb,跟上面的报错一样。

service状态一直是创建中

在这里插入图片描述

3、配额限制

我们缺少监控和报警,导致我们的思路,一直不能理解发布为啥会突然出错。
在这里插入图片描述

五、总结

1、Kong upstream配置pod IP

在没有解决问题前,只能在Kong的upstream配置pod IP,而非slb ip。虽然能解决,但是不够动态,显然是临时解决方案。

因为我们没有去做动态注册kong upstream。

2、阿里云的限额配置不直观

说同一台服务器可以重复添加为slb后端服务器的次数使用了53,可是到底是哪些,并不知晓。。为啥不弄个明细给用户可以查看。

3、架构的优化

  • 去slb的依赖
  • kong部署到k8s
  • 引入ingress网关
  • 使用k8s内部的发现机制

相关文章:

  • 云服务器操作系统如果不小心被删除了文件,那岂不是不能进系统了?
  • Spring Boot启动流程详解
  • Java后端 - 一面凉经 - 得物(国际电商)
  • 安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成.
  • Java实战:Spring Boot整合Canal与RabbitMQ实时监听数据库变更并高效处理
  • 2023年第三届中国高校大数据挑战赛(第二场)A题思路
  • EVE-NG桥接虚拟网卡实现与虚拟机通讯
  • RESTful接口规范参考
  • vue element plus Avatar 头像
  • 扼杀网络中的环路:STP、RSTP、MSTP
  • 万界星空科技MES系统中的车间管理的作用
  • 矩阵键盘中为什么有键位并联二极管?
  • Python光速入门 - Flask轻量级框架
  • Kafka 设计之消息传递保障
  • Web开发介绍,制作小网站流程和需要的技术【详解】
  • Docker入门(二) - Dockerfile
  • Linux Process Manage
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 聊聊redis的数据结构的应用
  • 算法系列——算法入门之递归分而治之思想的实现
  • 一些关于Rust在2019年的思考
  • 用Canvas画一棵二叉树
  • 在weex里面使用chart图表
  • 自动记录MySQL慢查询快照脚本
  • hi-nginx-1.3.4编译安装
  • #单片机(TB6600驱动42步进电机)
  • (1)(1.9) MSP (version 4.2)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (BFS)hdoj2377-Bus Pass
  • (二)Linux——Linux常用指令
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (十八)三元表达式和列表解析
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Project Open Day(2011.11.13)
  • .NET 的程序集加载上下文
  • .Net多线程总结
  • .NET基础篇——反射的奥妙
  • /etc/fstab 只读无法修改的解决办法
  • @Autowired和@Resource装配
  • @GetMapping和@RequestMapping的区别
  • @软考考生,这份软考高分攻略你须知道
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [383] 赎金信 js
  • [51nod1610]路径计数
  • [ABC294Ex] K-Coloring
  • [AIGC] Redis基础命令集详细介绍
  • [BZOJ] 2044: 三维导弹拦截
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [Flutter]WindowsPlatform上运行遇到的问题总结
  • [HTML]HTML5实现可编辑表格
  • [JS]数据类型
  • [leetcode 双指针]
  • [LeetCode] Merge Two Sorted Lists