Kubernetes自定义Endpoint健康检查

场景描述

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,并统计失败次数。

Kubernetes Custom Endpoints Health Check

问题

故障节点恢复后加入 Ready 列表,监控显示刚恢复时会持续几十秒的慢响应情况。对于大流量业务,可能不适合这种方式,或者需要类似慢启动的方案。

附录

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注