diff --git a/README.md b/README.md index 1cced60..8d4899c 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ * [Под с SmokePing](kubernetes/k3s_smokeping.md) для мониторинга доступности хостов * [PostgeSQL в K3s](kubernetes/k3s-postresql.md) * [ChartDB в K3s](kubernetes/k3s-chartdb.md) — графический редактор схем баз данных +* [Развертывание Metabase в K3s](kubernetes/k3s-metabase.md) — BI-платформа для анализа данных ## Python * [Устранение проблем при установке Python-коннектора mysqlclient (MySQL/MariaDB)](python/python-mysql.md) diff --git a/kubernetes/k3s-traefik-custom-error-pages.md b/kubernetes/k3s-traefik-custom-error-pages.md new file mode 100644 index 0000000..bf2e4c3 --- /dev/null +++ b/kubernetes/k3s-traefik-custom-error-pages.md @@ -0,0 +1,362 @@ +# Кастомная страница ошибки 404 (и других) в Traefik + +Страницы ошибок Traefik по умолчанию выглядят скучно. Это даже не страницы, а просто текстовые сообщения. Например, +404 выглядит как `404 page not found`. Это позволяет Traefik быть лёгким и быстрым. + +Если хочется сделать страницы статусоы 4xx и 5xx более привлекательными, то кастомизация страниц ошибок — отличная идея! +Для каждого HTTP-сервиса внутри можно сделать свои страницы ошибок на уровне приложения (как например, на Gitea, +на которой ты сейчас сидишь). И это наиболее правильный способ. Но если http-запрос не привязан ни к какому сервису, +и Traefik не знает куда его отправить, то он выдаёт свои страницы ошибок. Например, при обращении по IP. + + +Traefik позволяет кастомизировать страницы ошибок через **middleware** типа `errors`, который перенаправляет запросы +с определёнными кодами ошибок (например, 404) на кастомный сервис, возвращающий нужную html-страницу. И все это +излишество в `k3s` нужно настраивать глобально, с помощью `Middleware` и `IngressRoute`, и применять ко всем маршрутам. + +Чтобы кастомная страница 404 работала для всех запросов в кластере, нужно: + +# Создать сервис, который возвращает кастомную страницу (например, контейнер с Nginx или простой HTTP-сервер). +# Настроить middleware `errors` для перехвата ошибок 404. +# Применить middleware глобально через `IngressRoute` или конфигурацию Traefik. + +Самый простой подход — развернуть лёгкий контейнер (например, Nginx) с HTML-файлом для страницы 404 и настроить +Traefik для перенаправления ошибок на этот контейнер. Ну или, как альтернатива, использовать внешний сервис (по URL), +но это сложнее для глобальной настройки, и создаст зависимость от этого URL. + +#### 2. План действий +- Создать кастомную страницу 404 (HTML-файл). +- Развернуть контейнер с Nginx, который будет отдавать эту страницу. +- Настроить Traefik middleware `errors` для перехвата 404. +- Применить middleware глобально для всех маршрутов в `k3s`. +- Проверить результат. + +--- + +### Настройка кастомной страницы 404 + +#### 1. Создать кастомную страницу 404 +- Создай HTML-файл для страницы 404 на ноде `opi5`: + ```bash + mkdir -p ~/k3s/error-pages + cat > ~/k3s/error-pages/404.html < + + + 404 Not Found + + + +

404 - Page Not Found

+

Oops! Looks like you're lost in the void.

+ + +EOF + ``` + +#### 2. Развернуть Nginx для отдачи страницы +- Создай манифест для Nginx, который будет отдавать `404.html`: + ```bash + cat > ~/k3s/error-pages/error-pages.yaml < + + + 404 Not Found + + + +

404 - Page Not Found

+

Oops! Looks like you're lost in the void.

+ + +EOF + ``` + +- Примени: + ```bash + kubectl apply -f ~/k3s/error-pages/error-pages.yaml + ``` + +- Проверь поды и сервис: + ```bash + kubectl get pod -n error-pages + kubectl get svc -n error-pages + ``` + +#### 3. Настроить Traefik middleware для ошибок +- Создай манифест для middleware `errors`: + ```bash + cat > ~/k3s/traefik/error-middleware.yaml < ~/k3s/traefik/global-error-route.yaml <404 - Page Not Found +

Oops! Looks like you're lost in the void.

+ ``` + +- Проверь для другого домена (например, `Bitwarden`): + ```bash + curl -v https:///nonexistent + ``` + +- Проверь логи Traefik: + ```bash + kubectl logs -n kube-system -l app.kubernetes.io/name=traefik | tail -n 20 + ``` + +#### 6. (Опционально) Настроить другие ошибки +- Чтобы добавить кастомные страницы для других кодов (например, 403, 500), обнови middleware: + ```bash + cat > ~/k3s/traefik/error-middleware.yaml < + + 403 Forbidden +

403 - Forbidden

Access denied!

+ + ``` + +- Примени: + ```bash + kubectl apply -f ~/k3s/traefik/error-middleware.yaml + kubectl delete pod -n error-pages -l app=error-pages + ``` + +--- + +### Ответ на твой вопрос +> По умолчанию Traefik выдаёт скучные текстовые страницы для 404 и других ошибок. Как сделать кастомные 404 для всего `k3s` без привязки к домену? Где они лежат, и есть ли простой способ их переопределить? + +- **Где лежат дефолтные страницы**: + - Они встроены в бинарник Traefik и генерируются как текст (не HTML), например: `404 page not found`. + - Физически их нет в виде файлов в кластере. + +- **Почему не HTML**: + - Traefik использует текстовые ответы для минимизации ресурсов. + +- **Как переопределить**: + - Использовать middleware `errors`, который перенаправляет ошибки (например, 404) на кастомный сервис с HTML-страницей. + - Развернуть контейнер (например, Nginx) с кастомной страницей. + - Настроить глобальный `IngressRoute` для применения middleware ко всем доменам. + +- **Простой способ**: + 1. Создать `ConfigMap` с HTML-файлом (`404.html`). + 2. Развернуть Nginx в namespace `error-pages` для отдачи страницы. + 3. Настроить middleware `errors` для перехвата 404. + 4. Применить middleware через глобальный `IngressRoute`. + +- **Для всего `k3s`**: + - Глобальный `IngressRoute` с `HostRegexp` перехватывает все запросы и применяет middleware `errors` для ошибок 404. + +--- + +### Рекомендации +1. Создать и применить страницу 404: + ```bash + kubectl apply -f ~/k3s/error-pages/error-pages.yaml + ``` + +2. Настроить middleware: + ```bash + kubectl apply -f ~/k3s/traefik/error-middleware.yaml + ``` + +3. Применить глобальный маршрут: + ```bash + kubectl apply -f ~/k3s/traefik/global-error-route.yaml + ``` + +4. Проверить: + ```bash + curl -v https://git.cube2.ru/nonexistent + curl -v https:///nonexistent + ``` + +5. Проверить логи: + ```bash + kubectl logs -n kube-system -l app.kubernetes.io/name=traefik | tail -n 20 + ``` + +6. (Опционально) Добавить другие ошибки: + - Обновить `ConfigMap` и middleware для 403, 500 и т.д. + +--- + +### Итог +Дефолтные страницы ошибок Traefik — это встроенные текстовые ответы, которые можно переопределить с помощью middleware `errors` и кастомного сервиса (например, Nginx с HTML-страницей). Для глобальной настройки в `k3s` мы развернули контейнер с `404.html`, настроили middleware для перехвата ошибок 404, и применили его ко всем доменам через `IngressRoute` с `HostRegexp`. Это простой и универсальный способ сделать страницы ошибок яркими и весёлыми! 😄 Теперь твои 404 будут выглядеть стильно, и ты можешь добавить такие же для других ошибок. + +**Действия**: +1. Применить: + ```bash + kubectl apply -f ~/k3s/error-pages/error-pages.yaml + kubectl apply -f ~/k3s/traefik/error-middleware.yaml + kubectl apply -f ~/k3s/traefik/global-error-route.yaml + ``` +2. Проверить: + ```bash + curl -v https://git.cube2.ru/nonexistent + ``` + +**Напиши**: +1. Получилась ли кастомная страница 404? (`curl -v https://git.cube2.ru/nonexistent`) +2. Работает ли для других доменов? (`curl -v https:///nonexistent`) +3. Хочешь настроить страницы для других ошибок (403, 500)? + +Теперь можно расслабиться и наслаждаться яркими страницами ошибок! 🚀 \ No newline at end of file