文档说:
当启用 custom-http-errors 选项时,Ingress 控制器会配置 NGINX,以便在出现错误时将多个 HTTP 标头传递到其默认后端: https://kubernetes.github.io/ingress-nginx/user-guide/custom-errors/
我对我的服务进行了健康检查,并且希望在健康检查失败且服务处于离线状态时显示自定义错误页面,而不是默认的简洁的 Nginx 页面。
我配置了默认后台,并且使用:custom-http-errors: "503"
这样就可以了。如果没有此行,则会显示默认的 Nginx 页面。
但是,如果后端服务健康检查正常(即“就绪”),但服务本身因某种原因返回 503 页面,Nginx 会拦截此请求,并且还然后将客户端重定向到默认后端,而不是像平常一样将页面返回给客户端。
文档说:
设置至少一个代码还会启用处理 error_page 所需的 proxy_intercept_errors。
这不是我想要的。
那么,当服务中断并且健康检查失败时,有没有什么方法可以做出友好的自定义响应呢?没有还拦截合法的服务有 503 个响应吗?
同样的问题也适用于 404。如果有人试图访问不存在的服务,我希望入口返回友好的 404 页面,而不会拦截来自有效服务的 404 响应。
答案1
我花了很长时间试图解决这个问题,但似乎没有任何记录在案的解决方案。所以以下是我最终找到的方法。
我们真正想要做的是不是拦截任何错误,而是改变 nginx 的错误页面,理想情况下是从我们的默认后端为它们提供服务,就像我们拦截任何错误一样。
location
因此,您可以通过将以下内容添加到入口控制器的 ConfigMap 来设置一个新的来处理该问题:
server-snippet: |
location @503 {
proxy_set_header X-Code 503;
proxy_set_header X-Format "text/html";
proxy_pass http://default-backend.ingress-nginx;
}
default-backend
(假设您已使用名为 的命名空间中的服务部署了默认后端ingress-nginx
)。
然后在 Ingress 上你想要这种行为,你可以添加一个注释来将 503 错误重定向到我们的新路由:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
error_page 503 = @503;
现在 503 错误会之前直接从 nginx 提供服务,现在则从您的默认后端提供服务,而不会拦截您的应用程序 pod 最终启动并运行时可能返回的任何“真实”503。