当前位置: 首页 > 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内部的发现机制
http://www.lryc.cn/news/313348.html

相关文章:

  • 【STM32+OPENMV】矩形识别
  • 在吗?腾讯云服务器优惠价格表曝光_2023年3月报价请过目!
  • Revit-二开之创建Plane-(7)
  • 【操作系统学习笔记】文件管理1.2
  • 算法归纳【数组篇】
  • 【随笔】程序员如何选择职业赛道,目前各个赛道的现状如何,那个赛道前景巨大
  • 进程之舞:操作系统中的启动、状态转换与唤醒艺术
  • Java面试(4)之 Spring Bean生命周期过程
  • JavaSE——面向对象高级一(1/4)-static修饰成员变量、应用场景,static修饰成员方法、应用场景
  • 轻量脚本语言Lua的配置与c++调用
  • 力扣每日一道系列 --- LeetCode 160. 相交链表
  • 设计模式-建造者模式实践案例
  • freeRTOS_20240308
  • 利用chatgpt写论文使用教程
  • SMiC矩阵将于3月6日正式上线,开启数字化经济新纪元
  • 备战蓝桥杯---动态规划的一些思想2
  • 卫星导航 | 坐标系---地理坐标系与UTM坐标系
  • JavaEE之volatile关键字
  • 代码学习记录10
  • java——2024-03-03
  • Ubuntu安装conda以后,给jupyter安装C++内核
  • 【谈判】核心思想(抓大放小)
  • 洛谷P5908 猫猫和企鹅 做题反思(2024.3.7)
  • 常见的验证码
  • 11. C语言标准函数库
  • 2016年认证杯SPSSPRO杯数学建模C题(第一阶段)如何有效的抑制校园霸凌事件的发生解题全过程文档及程序
  • 设计模式-抽象工厂模式实践案例
  • 用readproc函数读取进程的状态
  • 在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)
  • redis最新版本在Windows系统上的安装