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, и управлять всем этим через из единой +точки. + +В моем случае: +* `` -- IP-адрес хоста, где работает сервис, который надо проксировать. +* `` -- порт, с которого отвечает сервис. +* `` -- доменное имя, на которое будет проксировать сервис. + +## Пространство имен + +Чтобы все было аккуратно и серисы и поды не путались, создадим пространство имен для проксируемого сервиса. +Например, `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 +``` + +И вставляем в него следующее содержимое (не забудь заменить ``, `` и `` +на свои значения... пространство имен `ab-shelf` и имя сервиса `audiobookshelf` можно тоже поменять на свое, если +у вас другой сервис): +```yaml +# Endpoints для внешнего хоста +apiVersion: v1 +kind: Endpoints +metadata: + name: audiobookshelf + namespace: ab-shelf # пространство, например +subsets: + - addresses: + - ip: + ports: + - port: + protocol: TCP +--- + +# Service для проксируемого хоста (:) +apiVersion: v1 +kind: Service +metadata: + name: audiobookshelf + namespace: ab-shelf # пространство, например +spec: + ports: + - port: + targetPort: + protocol: TCP +--- + +# IngressRoute +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: audiobookshelf + namespace: ab-shelf # пространство, например +spec: + entryPoints: + - web-custom # ендпоинт, который "слушает" порт 2055 + routes: + - match: Host("") + kind: Rule + services: + - name: audiobookshelf + port: +``` + +Что тут происходит: +* `Endpoints` -- указываем, что сервис будет проксировать запросы на внешний хост `` + и порт ``. Ендпоинт -- это конечная точка, к которой будет проксироваться запрос. В данном случае + это IP-адрес и порт, но обычно это имя пода, на который отправляются и который отвечает на запросы. +* `Service` -- создаем сервис, который будет использоваться для проксирования запросов к `Endpoints`. Сервис -- это + абстракция, которая позволяет упрощать доступ к подам. Он может использоваться для балансировки нагрузки между + несколькими потоками, которые обрабатывают запросы. В данном случае мы создаем сервис, который будет проксировать + запросы к `Endpoints` (внешнему хосту). +* `IngressRoute` -- создаем маршрут, который будет проксировать запросы на домен `` + к сервису `audiobookshelf` в пространстве `ab-shelf`. Маршрут -- это правило, которое определяет, как обрабатывать + запросы, поступающие на определенный адрес. В данном случае мы создаем маршрут, который будет направлять запросы + на домен `` к сервису `audiobookshelf` в пространстве `ab-shelf`. Внутри маршрута мы указываем, + что запросы должны обрабатываться сервисом `audiobookshelf` на порту ``. + В данном случае мы используем `web-custom` как точку входа, которая будет слушать порт 2055. +