Чтобы обновить страницу ошибки по умолчанию, отредактируйте карту конфигурации nginx -ingress-controller. Вставьте новый ключ custom-http-errors с кодом состояния HTTP, для которого вы хотите изменить страницу ошибки, например:
apiVersion: v1
kind: ConfigMap
data:
custom-http-errors: 404,413,503
enable-vts-status: "false"
metadata:
labels:
app: nginx-ingress
chart: nginx-ingress-1.6.0
component: controller
heritage: Tiller
release: nginx-ingress
name: nginx-ingress-controller
namespace: kube-system
Теперь снова запустите тестовую команду,
curl -i "[http://err-test.192.168.64.5.nip.io/err?code=413](http://err-test.192.168.64.5.nip.io/err?code=413)"
HTTP/1.1 404 Not Found
Server: nginx/1.15.10
Date: Sun, 05 May 2019 11:36:04 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 21
Connection: closedefault backend - 404
Это НЕ , что вы хотите. Входной контроллер Nginx правильно фиксирует код состояния HTTP, который мы хотим настроить. Тем не менее, по умолчанию Nginx «default-backend» (Изображение: k8s.gcr.io/defaultbackend:1.4) просто возвращает статус 404 независимо от фактического кода состояния, который приложение намеревается вернуть. Это вызовет проблему, если код состояния будет использоваться для других целей.
В документации Nginx Ingress Controller вы можете увидеть:
Ожидается, что пользовательский бэкэнд вернет правильный код состояния HTTP вместо 200
. NGINX не изменяет ответ от пользовательского бэкэнда по умолчанию.
Затем в Dockerfile вы должны добавить путь к определенным ошибкам пользовательского бэкэнда:
ADD custom-error-pages /
CMD ["/custom-error-pages"]
Построить образ и пу sh в docker хаб. Повторно разверните рулевую диаграмму Nginx в K3s, она выглядит следующим образом:
apiVersion: k3s.cattle.io/v1
kind: HelmChart
metadata:
name: nginx-ingress
namespace: kube-system
spec:
chart: stable/nginx-ingress
targetNamespace: kube-system
valuesContent: |-
defaultBackend:
enabled: true
name: default-backend
image:
repository: your-image/custom-error-page
tag: latest
В k8s просто выполните:
helm upgrade nginx-ingress stable/nginx-ingress --set defaultBackendService.enabled=true --set defaultBackend.image.repository=your-image/custom-error-page --set defaultBackend.image.tag=latest
Затем снова протестируйте и выполните ту же команду curl:
➜ curl -i "[http://err-test.192.168.64.5.nip.io/err?code=413](http://err-test.192.168.64.5.nip.io/err?code=413)"
HTTP/1.1 413 Request Entity Too Large
Server: nginx/1.15.10
Date: Sun, 05 May 2019 12:09:21 GMT
Content-Type: */*
Transfer-Encoding: chunked
Connection: close4xx html
У вас будет пользовательская страница ошибки с правильным кодом состояния HTTP.
Поскольку вы перехватываете состояние 503, уменьшите масштаб реплики.
Выполните команду:
$ kubectl scale deploy err-status-test --replicas=0
Если вы снова получите доступ к приложению, вы увидите пользовательскую страницу ошибки с ожидаемым кодом состояния 503.
Более подробную информацию вы можете найти здесь: заказ серверные-ошибки .