ingress异常导致整体网络不可用

k8s中刷新nginx失败,导致整个网络不可用

测试环境中所有新发布的应用全都不可用,瘫痪的1个小时左右.
一路查下来发现问题是nginx刷新异常,记录一下.

基础环境

  • Kubernetes 1.10

现象

新发布的应用无法访问,频繁出现504错误.

  • 查询后台日志
    发现后台大量的刷新Nginx配置失败问题.问题瞬间定位了.
  • upstream不存在
    删除了不存在的upstream后网络恢复正常

问题描述

k8s的集群中使用了Nginx作为反向代理.
如果你发布一个新的应用,Ingress会根据规则动态的把配置文件写入到Nginxdefault.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或者扩容等操作都会造成异常.
所以现在考虑更优解.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容