背景
如题,我目前在 k8s 里面部署了一个 nginx 服务( Deployment )和一个后端服务 backend ( StatefulSet ),backend 创建了三个副本:backend-0, backend-1, backend-2 。
nginx 服务目前充当 API 网关的角色,其核心配置如下:
upstream backend {
hash $request_uri;
server backend-0.backend-headless.default.svc;
server backend-1.backend-headless.default.svc;
server backend-2.backend-headless.default.svc;
}
server {
...
location /api/ {
proxy_pass backend;
}
}
配置说明:nginx 反代 backend 的三个 headless service ,并且使用一致性哈希以达到 对于特定的 URL 的请求,固定转发到唯一的副本。
问题
目前我面临的问题如下:
- 当 backend 更新或重启后,nginx 反代会出错,报错 504 (记不太清了应该是 504 )
这是因为 backend 重启之后,Pod 变了,其 headless service 域名对应的 IP 也变了。但是 nginx 默认只会在启动时解析一遍域名,无法做到动态解析(动态解析功能要商业版 nginx 才有),因此 backend 重启之后 nginx 无法与 backend 建立连接,所以报错。
我在网上搜了一圈,我目前是在用这个第三方模块 + 自己编译 nginx ,但是并不喜欢这个做法,而且该项目兼容的 nginx 版本较低。
我在想有没有其他更好的办法,再不行就换 tengine ,但是 tengine 我还没用过也许可以试一试
- 无法灵活地增减 backend 的副本数
目前 backend 是三个副本,假如我要增加到 5 个副本,我需要手动修改 nginx 配置里面的 upstream server 。虽然我目前是通过环境变量来配置 upstream server 的,但是仍然无法避免需要手动修改环境变量的麻烦。
如果要解决这个问题,似乎只能自己开发和部署一个专门更新配置的小服务,除此之外还有更方便的解决办法吗?
另外想咨询一下有人知道 Kong 能否在上面两个场景中派上用场吗?我打算抽空也去调研一下 Kong
|