当我的 kubernetes 服务无法正常工作时 ( ),我尝试获取漂亮的错误页面replicas: 0
。因此,我找到了以下资源:
- https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/customization/custom-errors
- https://github.com/kubernetes/ingress-nginx/tree/master/images/custom-error-pages
- https://tech.holidayextras.com/custom-error-handling-with-the-kubernetes-nginx-ingress-controller-f7861b08ffd7
Go 源代码custom-error-pages
需要编译,我试图避免这一点。因此,我搜索了预构建的 Docker 镜像,并在 quay.io 上找到了一个:
但是,quay.io 抱怨镜像中存在一些安全风险,所以我寻找了另一种解决方案。我的想法是使用标准nginx
Web 服务器获得类似的解决方案。
所需功能:
- 使用 CSS 提供美观的自定义错误页面
- 使用以下方式调用时提供 JSON 回复
Accept: application/json
- 返回标头中给出的 nginx ingress controller 的错误代码
X-Code
- 提供的错误页面应取决于错误代码(4xx 与 5xx)
经过一些研究,我想出了以下解决方案:
server {
listen 0.0.0.0:8080;
server_name default;
root /app;
location /healthz {
return 200 "ok";
}
location /status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
set $uri_and_code "${http_x_original_uri}${http_x_code}";
set $type "html";
if ($http_x_format = 'application/json') {
set $type "json";
}
error_page 403 404 /4xx.${type};
error_page 500 502 503 504 /5xx.${type};
location /4xx { internal; }
location /5xx { internal; }
location / {
if ($http_x_original_uri = '') { return 404; }
if ($uri_and_code = '/403') { return 403; }
if ($uri_and_code = '/404') { return 404; }
if ($uri_and_code = '/502') { return 502; }
if ($uri_and_code = '/503') { return 503; }
if ($uri_and_code = '/504') { return 504; }
try_files $http_x_original_uri $uri $uri/ =404;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;
log_not_found off;
expires max;
}
}
我并不完全满意,因为它依赖if
于location /
(伊菲斯维尔)。还有更好的解决办法吗?
干杯,
弗洛克