k8s
中刷新nginx
失败,导致整个网络不可用
测试环境中所有新发布的应用全都不可用,瘫痪的1个小时左右.
一路查下来发现问题是nginx刷新异常,记录一下.
基础环境
-
Kubernetes
1.10
现象
新发布的应用无法访问,频繁出现504错误.
-
查询后台日志
发现后台大量的刷新Nginx配置失败问题.问题瞬间定位了. -
upstream不存在
删除了不存在的upstream后网络恢复正常
问题描述
k8s
的集群中使用了Nginx
作为反向代理.
如果你发布一个新的应用,Ingress
会根据规则动态的把配置文件写入到Nginx
的default.conf
中,此时会校验upstream是否存在,如果不存在则会刷新失败.
-
Ingress有bug?
这套流程正常的话,endpoint的访问都是由k8s控制的,原则上是不会有异常的,那么怎么出的问题? -
A/B Testing惹的祸
我们实现灰度发布的方案是依赖于在Nginx中实现Lua脚本,如下:
location / {
....
if ($http_foo = "bar") { //完全匹配
#if ($http_foo ~ "bar") { //正则匹配
proxy_pass http://default-new-nginx-80;
break;
}
proxy_pass http://default-old-nginx-80;
....
}
问题来了,除了k8s
的正常流程外,我们还会通过发布系统来控制应用的生命周期,相当于废除了k8s的控制.
实现了此套方案后只要通过k8s系统直接删除pod或者扩容等操作都会造成异常.
所以现在考虑更优解.
网友评论