通过增加Ingress实现服务降级
近期遇到一个问题,产品升级过程过程中实现所有服务访问定向到升级页面,升级完成后,产品所有服务恢复正常,同时,针对部分服务进行过滤(监控、告警等),升级过程中仍保持可访问状态。
产品通过Nginx-ingress-controller提供http服务,通过升级前创建ingress,升级后删除ingress实现升级过程中的重定向吗,ingress yaml如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingressName
namespace: myNameSpace
annotations:
kubernetes.io/ingress.class: “nginx”
ingress.kubernetes.io/use-regex: “true”
ingress.kubernetes.io/server-snippet: |
if ($uri !~* "(.css)|(.png)") {
rewrite /(.) /getUpgradePage;
}
if ($uri ~ "(.*css)|(.png)") {
rewrite (.) /$1;
}
spec:
rules:
- http:
paths:
//这里不支持标准的正则,例如(!?.*png)(!?.css),无法创建ingress
- path: /(.)
backend:
serviceName: gateway-service
servicePort: 80
遇到的问题:
1、创建ingress后无法重定向到对应的服务
解决办法:使用ingress.kubernetes.io/rewrite-target: /index.html,请求重定向到gateway-service的index.html
2、重定向页面成功,但是删除ingress后页面缓存,导致用户一直在升级页面,除非用户ctrl+F5
解决办法:html的head里增加如下内容
<meta http-equiv=“Cache-Control” content=“private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0”/>
<meta http-equiv=“Pragma” content=“no-cache”/>
<meta HTTP-EQUIV=“expires” CONTENT=“Wed, 26 Feb 1997 08:21:57 GMT”>
<meta HTTP-EQUIV=“expires” CONTENT=“0”>
3、使用带图片的index.html,页面无法正常显示图片
解决办法:原因是配置的ingress每次请求生效,因此当浏览器请求index.html引用的image时,仍然会重定向到index.html,所以图片无法加载,解决思路是配置ingress,当请求包含css、png等资源文件时,不要重定向到index.html,配置方法如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingressName
namespace: myNameSpace
annotations:
kubernetes.io/ingress.class: “nginx”
ingress.kubernetes.io/use-regex: “true”
ingress.kubernetes.io/server-snippet: |
if ($uri !~ "(.css)|(.png)") {
rewrite /(.) /getUpgradePage;
}
if ($uri ~ "(.css)|(.png)") {
rewrite (.) /$1;
}
spec:
rules:
- http:
paths:
//这里不支持标准的正则,例如(!?.png)(!?.css),无法创建ingress
**- path: /(.)*
backend:
serviceName: gateway-service
servicePort: 80
蛋疼的是,这里直接在path进行正则匹配不行,对于(!?.*png)(!?.*css)这样的正则,ingress似乎无法解析,因此才用上述方法
4、带图片的index.html存在缓存现象,用户每次得ctrl+F5
解决办法:页面内容通过getUpgradePage返回,则每次新增、删除ingress后,页面的请求都是200;如果是index.html,则页面返回的结果是302
参考了一些blog,都还行,如下:
正则语法:https://www.runoob.com/regexp/regexp-syntax.html
ingress的配置方法:https://blog.51cto.com/pengjc/1980634
ingress的配置方法以及样例,包括ingress的加载顺序:https://blog.51cto.com/270142877/2338348
在线正则测试:http://tool.oschina.net/regex/