From f50b50944070a9e01fe9940deae0dc8846530b53 Mon Sep 17 00:00:00 2001 From: erjemin <erjemin@gmail.com> Date: Wed, 16 Apr 2025 17:42:20 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=BF=D1=80=D0=BE=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20traefik?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + kubernetes/k3s-proxy.md | 100 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 kubernetes/k3s-proxy.md diff --git a/README.md b/README.md index efbb86d..2973951 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ * [Установка k3s на Orange Pi 5 Plus](raspberry-and-orange-pi/k3s.md) * [Под с Shadowsocks-клиент](kubernetes/k3s-shadowsocks-client.md) (k3s) * [Под с 3X-UI](kubernetes/k3s-3xui-pod.md) (k3s) +* [Проксирование внешнего хоста через Traefik (Ingress-контроллер)](kubernetes/k3s-proxy.md) ## Python * [Устранение проблем при установке Python-коннектора mysqlclient (MySQL/MariaDB)](python/python-mysql.md) diff --git a/kubernetes/k3s-proxy.md b/kubernetes/k3s-proxy.md new file mode 100644 index 0000000..5c08cd1 --- /dev/null +++ b/kubernetes/k3s-proxy.md @@ -0,0 +1,100 @@ +# Проксирование внешнего хоста через Traefik (Ingress-контроллер) + +У меня в домашней сети есть хост с сервисом (audiobookshelf), то удобно его прокинуть через Traefik, чтобы не открывать +на внешний IP лишних адресов, портов, использовать домен и включить SSL, и управлять всем этим через из единой +точки. + +В моем случае: +* `<PROXIED-HOST>` -- IP-адрес хоста, где работает сервис, который надо проксировать. +* `<PROXIED-PORT>` -- порт, с которого отвечает сервис. +* `<YOU-DOMAIN-NAME>` -- доменное имя, на которое будет проксировать сервис. + +## Пространство имен + +Чтобы все было аккуратно и серисы и поды не путались, создадим пространство имен для проксируемого сервиса. +Например, `ab-shelf`. +```bash +sudo ubectl create namespace ab-shelf +``` + +Проверяем, что пространство создано: +```bash +sudo kubectl get namespace ab-shelf +``` + +Увидим, что пространство создано и активно: +```text +NAME STATUS AGE +ab-shelf Active 54s +``` + +## Конфигурация IngressRoute, Service и Endpoints + +Для удобства я объединил манифесты в один файл (но можно и по отдельности). Создаем единый манифетст: +```bash +sudo nano ~/k3s/audiobookshelf/audiobookshelf.yaml +``` + +И вставляем в него следующее содержимое (не забудь заменить `<PROXIED-HOST>`, `<PROXIED-PORT>` и `<YOU-DOMAIN-NAME>` +на свои значения... пространство имен `ab-shelf` и имя сервиса `audiobookshelf` можно тоже поменять на свое, если +у вас другой сервис): +```yaml +# Endpoints для внешнего хоста +apiVersion: v1 +kind: Endpoints +metadata: + name: audiobookshelf + namespace: ab-shelf # пространство, например +subsets: + - addresses: + - ip: <PROXIED-HOST> + ports: + - port: <PROXIED-PORT> + protocol: TCP +--- + +# Service для проксируемого хоста (<PROXIED-HOST>:<PROXIED-PORT>) +apiVersion: v1 +kind: Service +metadata: + name: audiobookshelf + namespace: ab-shelf # пространство, например +spec: + ports: + - port: <PROXIED-PORT> + targetPort: <PROXIED-PORT> + protocol: TCP +--- + +# IngressRoute +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: audiobookshelf + namespace: ab-shelf # пространство, например +spec: + entryPoints: + - web-custom # ендпоинт, который "слушает" порт 2055 + routes: + - match: Host("<YOU-DOMAIN-NAME>") + kind: Rule + services: + - name: audiobookshelf + port: <PROXIED-PORT> +``` + +Что тут происходит: +* `Endpoints` -- указываем, что сервис будет проксировать запросы на внешний хост `<PROXIED-HOST>` + и порт `<PROXIED-PORT>`. Ендпоинт -- это конечная точка, к которой будет проксироваться запрос. В данном случае + это IP-адрес и порт, но обычно это имя пода, на который отправляются и который отвечает на запросы. +* `Service` -- создаем сервис, который будет использоваться для проксирования запросов к `Endpoints`. Сервис -- это + абстракция, которая позволяет упрощать доступ к подам. Он может использоваться для балансировки нагрузки между + несколькими потоками, которые обрабатывают запросы. В данном случае мы создаем сервис, который будет проксировать + запросы к `Endpoints` (внешнему хосту). +* `IngressRoute` -- создаем маршрут, который будет проксировать запросы на домен `<YOU-DOMAIN-NAME>` + к сервису `audiobookshelf` в пространстве `ab-shelf`. Маршрут -- это правило, которое определяет, как обрабатывать + запросы, поступающие на определенный адрес. В данном случае мы создаем маршрут, который будет направлять запросы + на домен `<YOU-DOMAIN-NAME>` к сервису `audiobookshelf` в пространстве `ab-shelf`. Внутри маршрута мы указываем, + что запросы должны обрабатываться сервисом `audiobookshelf` на порту `<PROXIED-PORT>`. + В данном случае мы используем `web-custom` как точку входа, которая будет слушать порт 2055. +