Kubernetes提示和技巧:NGINX Ingress中的个性化错误页面



在本文中,我想谈谈与显示个性化错误页面有关的两个NGINX Ingress功能,以及它们中存在的局限性和解决方法。

1.更改默认后端


默认情况下,NGINX Ingress使用默认后端,该后端执行相应的功能。 这意味着当我们使用不在Ingress资源中的主机查询Ingress时,我们将获得一个带有404响应代码的页面:



但是,越来越多的客户提出要求而不是标准404来显示带有公司徽标和其他便利设施的页面。 为此,NGINX Ingress具有内置的功能来覆盖default-backend-service 。 将具有相同名称的选项作为参数namespace/servicename格式记录。 服务端口必须为80。

为此,请使用您的应用程序创建自己的pod(部署)和服务(来自ingress-nginx存储库的YAML中的示例实现 ),该应用程序将代替默认后端提供。

这是一个小插图:

 ~$ curl -i -XGET http://sadsdasdas.kube-cloud.my/ HTTP/1.1 404 Not Found Date: Mon, 11 Mar 2019 05:38:15 GMT Content-Type: */* Transfer-Encoding: chunked Connection: keep-alive <span>The page you're looking for could not be found.</span> 

因此,所有未通过YAML明确创建的,具有以下kind: Ingress所有域kind: Ingress都属于default-backend。 在上面的清单中, sadsdasdas已成为该领域。

2.使用默认后端处理应用程序中的HTTP错误


另一种情况是对应用程序的请求,在该应用程序中,无法处理此类情况(未生成相应的漂亮页面)的HTTP情况(404、500、502 ...)以HTTP错误结束。 也可能是由于开发人员希望在许多应用程序中提供相同的错误页面而引起的。

为了在服务器端实现这种情况,我们需要:

  1. 请按照上述有关默认后端的说明进行操作;
  2. 例如,将custom-http-errors键添加到配置ConfigMap nginx-ingress,其值为404,503 (显然,它对应于新规则覆盖的错误代码)。

可以达到预期的结果:当客户端应用程序正在运行并且收到错误代码为404或503的错误时,该请求将自动重定向到新的默认后端...

但是,在为默认后端和自定义HTTP错误开发应用程序时,您需要考虑一个重要功能:

 !!! Important The custom backend is expected to return the correct HTTP status code instead of 200. NGINX does not change the response from the custom default backend. 

事实是,重定向请求时,标头将包含有用的信息以及先前的响应代码和其他信息( 此处提供了它们的完整列表)。

这意味着您自己必须注意正确的响应代码 。 这是文档的工作方式示例 。

到不同的应用程序-不同的默认后端


因此,该解决方案不是针对整个集群的全局解决方案,而是仅适用于特定的应用程序,首先您需要检查Ingress的版本。 如果它匹配0.23或更高版本 ,请使用Ingress本机注释:

  1. 我们可以通过注释为每个 Ingress重新定义default-backend ;
  2. 我们可以使用注释为每个 Ingress覆盖custom-http-errors 。

结果,Ingress资源将如下所示:

 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ .Chart.Name }}-app2 annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/custom-http-errors: "404,502" nginx.ingress.kubernetes.io/default-backend: error-pages spec: tls: - hosts: - app2.example.com secretName: wildcard-tls rules: - host: app2.example.com http: paths: - path: / backend: serviceName: {{ .Chart.Name }}-app2 servicePort: 80 

在这种情况下,错误404和502将被重定向到带有所有必要标头的错误页面服务。

在以前的Ingress版本中,这是不可能的 ( 致命的提交为0.23 )。 并且,如果您的集群中运行着2个完全不同的应用程序,并且您想为它们指定不同的default-backend-service并处理不同的错误代码,则您将为此使用变通办法,其中有两个。

入口<0.23:方法一


这个选项比较简单。 作为提供页面的应用程序,我们有常规的HTML,它不知道如何查看标题并提供正确的响应代码。 这样的应用程序将通过带有url /error-pages Ingress推出,并且HTML将在ws目录中给出。

YAML中的插图:

 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: {{ .Chart.Name }}-app2 annotations: kubernetes.io/ingress.class: "nginx" ingress.kubernetes.io/server-snippet: | proxy_intercept_errors on; error_page 500 501 502 503 504 @error_pages; location @error_pages { rewrite ^ /error-pages/other/index.html break; proxy_pass http://error-pages.prod.svc.cluster.local; } spec: tls: - hosts: - app2.example.com secretName: wildcard-tls rules: - host: app2.example.com http: paths: - path: / backend: serviceName: {{ .Chart.Name }}-app2 servicePort: 80 

此部署的服务必须是ClusterIP类型。

同时,在处理错误的应用程序中,在Ingress中,我们添加了具有以下内容的服务器代码段或配置代码段:

 nginx.ingress.kubernetes.io /server-snippet: | proxy_intercept_errors on; error_page 500 501 502 503 504 @error_pages; location @error_pages { rewrite ^ /error-pages/ws/index.html break; proxy_pass http://error-pages.prod.svc.cluster.local; } 

入口<0.23:方法二


可以处理标头的应用程序的选项...无论如何,这是从custom-http-errors借来的更正确的路径。 手动使用(复制)将不会更改全局设置。

步骤如下。 我们使用可以侦听必要标头并正确响应的应用程序创建相同的部署 。 使用以下内容将服务器摘要应用程序添加到Ingress:

 nginx.ingress.kubernetes.io /server-snippet: | proxy_intercept_errors off; error_page 404 = @custom_404; error_page 503 = @custom_503; location @custom_404 { internal; proxy_intercept_errors off; proxy_set_header X-Code 404; proxy_set_header X-Format $http_accept; proxy_set_header X-Original-URI $request_uri; proxy_set_header X-Namespace $namespace; proxy_set_header X-Ingress-Name $ingress_name; proxy_set_header X-Service-Name $service_name; proxy_set_header X-Service-Port $service_port; proxy_set_header Host $best_http_host; rewrite ^ /error-pages/ws/index.html break; proxy_pass http://error-pages.prod.svc.cluster.local; } location @custom_503 { internal; proxy_intercept_errors off; proxy_set_header X-Code 503; proxy_set_header X-Format $http_accept; proxy_set_header X-Original-URI $request_uri; proxy_set_header X-Namespace $namespace; proxy_set_header X-Ingress-Name $ingress_name; proxy_set_header X-Service-Name $service_name; proxy_set_header X-Service-Port $service_port; proxy_set_header Host $best_http_host; rewrite ^ /error-pages/ws/index.html break; proxy_pass http://error-pages.prod.svc.cluster.local; } 

如您所见,对于我们要处理的每个错误,您都需要确定位置,在该位置将替换所有必需的标头,如“本地” custom-error-pages中所示 。 因此,即使对于单个位置和服务器,我们也可以创建带有错误的不同个性化页面。

聚苯乙烯


K8s提示和技巧周期中的其他内容:


另请参阅我们的博客:

Source: https://habr.com/ru/post/zh-CN445596/


All Articles