场景描述
Kubernetes 的 Service 可以添加自定义的 Endpoints,这样通过 Ingress Nginx 就可以给集群外部的 Web 服务做负载均衡,但是会有一个问题,Ingress Nginx 用 Lua 来处理 upstream,已经移除了以下两个 annotation:
nginx.ingress.kubernetes.io/upstream-max-fails
nginx.ingress.kubernetes.io/upstream-fail-timeout
there is no support for those features. The reason for this is related to the way the load balancing is handled now in lua and the lack of support to check upstreams (out of the box)
https://github.com/kubernetes/ingress-nginx/issues/4773
而 Kubernetes 本身也没有针对自定义 Endpoints 的健康检查(截至 1.12 版本未找到相关信息)。就导致这种使用方式有不能摘除故障节点的问题。
功能实现
为了和 Pod 的 Endpoints 区分开,将 自定义的 Endpoints 打上 type=external
的标签。获取 Endpoints 时只获取带标签的。处理流程如下:
- 获取所有带
type=external
标签的 Endpoints,存入全局变量ep
- 并发检测所有 Endpoints 的 IP:port
- 如果检测失败,将此端点 加入
NotReady
列表 - 一个 Endpoints 对象检测完成之后,如果
NotReady
列表非空,则更新该 Endpoints。并发送微信报警 - 等待指定时间,进行下一轮检测
演示
提供一个统计界面,用来实时查看自定义 Endpoints 的健康情况,用红色标记出不可达的 IP,并统计失败次数。
问题
故障节点恢复后加入 Ready
列表,监控显示刚恢复时会持续几十秒的慢响应情况。对于大流量业务,可能不适合这种方式,或者需要类似慢启动的方案。
附录
- 参考代码:Github。
发表回复