什么是 default backend

default backend 是 ingress-nginx 中的一个服务,主要用于处理 nginx controller 无法识别的而请求的服务

主要提供了两个接口

  • /healthz that returns 200
  • /that returns 404

如何改default backend 状态码

需求:修改 default backend 状态码 404 为 403

原理:nginx-controller 启动时指定了一个 default backend 容器,如下所示

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
containers:
  - args:
    - /nginx-ingress-controller
    # 这里指的是 default-backend 的名称 {namespace_name}/{service_name}
    - --default-backend-service=$(POD_NAMESPACE)/ingress-nginx-ext-defaultbackend 
    - --publish-service=$(POD_NAMESPACE)/ingress-nginx-ext-controller
    - --election-id=ingress-controller-leader
    - --ingress-class=nginx-yewu-ext
    - --configmap=$(POD_NAMESPACE)/ingress-nginx-ext-controller
    - --validating-webhook=:8443
    - --validating-webhook-certificate=/usr/local/certificates/cert
    - --validating-webhook-key=/usr/local/certificates/key

通常情况下在通过定义配置文件方式改变是不容易做的,ingress-nginx 提供了一种自定义方式 “custom-error-pages“ 可以完成 ,完成后该 defaultBackend 支持使用 X-code方式自定义任意的错误页即错误码。

变更影响范围:

  • 如果使用 helm 通过 upgrade 方式要确保配置只有default-backend
  • 可以直接修改deployment
  • ingress-nginx 在更新时会等待所有连接处理完成才会终止结束,可能 termnating 30分钟甚至以上

上面方式均可以更新 default-backend 方式 都不会对nginx controller 服务挂的域名的业务

default backend 状态码重置

本实例只针对 helm 安装的 ingress-nginx 进行改变

nginx 官方有提供 Customized default backend 方式,通过更改镜像,和注入 configmap 可以把对应的错误页面更改掉

yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
controller:
  config:
    custom-http-errors: "404,503"
defaultBackend:
  enabled: true
  image:
    registry: registry.k8s.io
    image: ingress-nginx/custom-error-pages
    tag: v1.0.2@sha256:b2259cf6bfda813548a64bded551b1854cb600c4f095738b49b4c5cdf8ab9d21
  extraVolumes:
  - name: custom-error-pages
    configMap:
      name: custom-error-pages
      items:
      - key: "404"
        path: "404.html"
      - key: "503"
        path: "503.html"
  extraVolumeMounts:
  - name: custom-error-pages
    mountPath: /www

configMap

yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Custom error page configMap
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-error-pages
data:
  404: |
    <!DOCTYPE html>
    <html>
      <head><title>PAGE NOT FOUND</title></head>
      <body>PAGE NOT FOUND</body>
    </html>    
  503: |
    <!DOCTYPE html>
    <html>
      <head><title>CUSTOM SERVICE UNAVAILABLE</title></head>
      <body>CUSTOM SERVICE UNAVAILABLE</body>
    </html>    

如果想把 404 改成 403 需要自己修改 custom-default-backend 的源码

Reference