# Настройка доступа к панелям управления Lobghorn и Traefik В k3s есть несколько панелей управления, которые можно настроить для доступа извне кластера. # Панель управления блочный хранилищем (Persistent Volume) Longhorn Панель управления Longhorn позволяет управлять блочными хранилищами (Persistent Volume) в k3s. Полезнейшая вещь! Через нее можно не только отслеживать работу тома, но и создавать, удалять и изменять PVC-хранилища, и, главное, делать бэкапы томов и восстанавливать их. Проверим, поды Longhorn, и в нем есть UI (интерфейс управления): ```shell kubectl get pod -n longhorn-system ``` Увидим что-то вроде: ```text NAME READY STATUS RESTARTS AGE ... ... longhorn-ui-f7ff9c74-7bbsw 1/1 Running 2 (26h ago) 21h longhorn-ui-f7ff9c74-b4svq 1/1 Running 3 (26h ago) 21h ... ``` Поды longhorn-ui работают -- интерфейс управления Longhorn -- доступен. Проверим доступные сервисы Longhorn: ```shell kubectl get svc -n longhorn-system ``` Увидим что-то типа: ```text NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE longhorn-admission-webhook ClusterIP 10.43.123.226 9502/TCP 21h longhorn-backend ClusterIP 10.43.226.46 9500/TCP 21h longhorn-conversion-webhook ClusterIP 10.43.243.121 9501/TCP 21h longhorn-frontend ClusterIP 10.43.152.91 80/TCP 21h longhorn-recovery-backend ClusterIP 10.43.205.78 9503/TCP 21h ``` Как видим, есть работающий сервис `longhorn-frontend` с типом `ClusterIP` (внутренний IP-адрес кластера) и портом 80. Это и есть интерфейс управления Longhorn. Проверим, что он доступен по этому адресу: ```shell curl -v http://10.43.152.91 ``` Увидим что-то вроде: ```text * Trying 10.43.152.91:80... * Connected to 10.43.152.91 (10.43.152.91) port 80 (#0) > GET / HTTP/1.1 > Host: 10.43.152.91 > User-Agent: curl/7.81.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Server: nginx/1.21.5 ... ... ``` Как видим, Longhorn доступен, и выдает 200 OK. ### Манифес IngressRoute для доступа к панели управления Longhorn Я настраиваю панель управления Longhorn на доступ по адресу `pvc.local` (достигается через соответствующий DNS-запись в локальном DNS-сервере или редактированием файла `/etc/hosts`). Создадим IngressRoute-манифест для доступа к дашборду Longhorn по домену `pvc.local` (или какому вы там сами пожелаете). ```yaml # IngressRoute-манифест, для доступа к панели управления Longhorn по адресу http://pvc.local apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: longhorn-ui # имя ресурса (пода) namespace: longhorn-system spec: entryPoints: - web routes: - match: Host("pvc.local") # маршрутизируем запросы с хоста pvc.local kind: Rule services: - name: longhorn-frontend # целевой сервис port: 80 ``` Что туту происходит: * `apiVersion: traefik.io/v1alpha1` — стандартный CRD для Traefik в k3s. * `kind: IngressRoute` — ресурс Traefik для маршрутизации. * `metadata`: * `name: longhorn-ui` — имя ресурса (пода) longhorn-ui. * `namespace: longhorn-system` — в пространстве имен longhorn-system. * `spec:` * `entryPoints: web` — используем порт 80 в сервисе traefik * `routes:` — маршруты. * `match: Host("pvc.local")` — маршрутизируем запросы с хоста `pvc.local`. * `kind: Rule` — правило маршрутизации. * `services:` * `name: longhorn-frontend` — целевой сервис. * `port: 80` — порт на котором работает сервис longhorn-frontend. Применим манифест и проверим, что он применился: ```shell kubectl apply -f <путь_к_файлу_с_манифестом> kubectl get ingressroute -n longhorn-system ``` Увидим что-то вроде: ```text NAME AGE longhorn-ui 124m ``` Проверим, что панель управления Longhorn доступна по адресу `pvc.local`: ```shell curl -v http://pvc.local ``` Увидим что-то вроде: ```text * Trying :80... * Connected to pvc.local () port 80 (#0) > GET / HTTP/1.1 > Host: pvc.local > User-Agent: curl/7.81.0 > Accept: */* > GET / HTTP/1.1 > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Server: nginx/1.21.5 ``` Как видим, Longhorn теперь доступен по адресу `pvc.local` и выдает 200 OK. Можно открыть в браузере `http://pvc.local` и увидеть панель управления Longhorn: ![k3s--lonhorn-ui.png](../images/k3s--longhorn-ui.png) ### Изменение числа реплик Longhorn (не обязательно) Если у вас всего одна нода, то в панели управления Longhorn вы можете увидеть, что тома находятся в состоянии `degraded` (деградированное). Это связано с тем, что Longhorn не может создать реплики на других нодах, так как их нет. Исправить это можно, изменив число глобальное число реплик Longhorn с 3 до 1. Это можно сделать через команду: ```shell kubectl edit settings.longhorn.io -n longhorn-system default-replica-count ``` Найти и отредактировать: ```yaml value: "3" ``` Тоже самое, кстати, можно проделать и через панель управления Longhorn **"Setting" → "General" → "Default Replica Count"**. Это изменит число реплик для вновь создаваемых томов, но не изменит значение для уже существующих (они останутся с тремя репликами, пока не измените вручную в UI). Измените в панели управления Longhorn число реплик для каждого тома с 3 до 1, и все тома перейдут в состоянии `healthy` (здоровое). ## Панель управления Traefik Дашборд Traefik позволяет визуализировать маршрутизацию и состояние сервисов. Не так чтоб сильно полезная вещь, но с ней можно поиграться и к ней есть [https://plugins.traefik.io/plugins](множество плагинов и расширений). Я настраиваю панель управления Traefik на доступ по адресу `traefik.local` (достигается через соответствующий DNS-запись в локальном DNS-сервере или редактированием файла `/etc/hosts`). ### Изменение конфигурации Traefik (через Helm) По умолчанию панель управления Traefik недоступна извне кластера. Чтобы это исправить, нужно создать нужно изменить конфигурацию Traefik, чтобы проверить, что панель управления включена и разрешить доступ к ней по HTTP. Это можно сделать через Helm, используя HelmChartConfig. Если у вас уже есть манифест HelmChartConfig для traefik, то просто добавьте в него в блок `spec: valuesContent: additionalArguments:` дополнительные аргументы: `--api.dashboard=true` и `--api.insecure=true`. Если у вас нет HelmChartConfig, то создайте его: ```shell mkdir -p ~/k3s/traefik nano ~/k3s/traefik/traefik-helm-config.yaml ``` И вставьте в него следующее содержимое: ```yaml apiVersion: helm.cattle.io/v1 kind: HelmChartConfig metadata: name: traefik namespace: kube-system spec: valuesContent: | additionalArguments: - --api.dashboard=true # включает панель управления (dashboard) Traefik (обычно он уже включен) - --api.insecure=true # разрешает доступ к dashboard Traefik по HTTP ``` Применим манифест: ```shell kubectl apply -f ~/k3s/traefik/traefik-helm-config.yaml ``` Пезезапустим Traefik, чтобы изменения вступили в силу: ```shell kubectl rollout restart deployment -n kube-system traefik ``` ### Создание IngressRoute для доступа к панели управления Traefik с http Создадим манифест IngressRoute для доступа к панели управления Traefik по домену `traefik.local` (или какому вы там сами пожелаете): ```yaml # IngressRoute-манифест, для доступа к панели управления Traefik по адресу http://traefik.local apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard namespace: kube-system spec: entryPoints: - web routes: - match: Host("traefik.local") && PathPrefix("/dashboard") # доступ к панели управления kind: Rule services: - name: api@internal # имя встроенного в k3s сервиса Traefik для доступа к панели управления kind: TraefikService # тип сервиса - match: Host("traefik.local") && PathPrefix("/api") # доступ к API kind: Rule services: - name: api@internal kind: TraefikService - match: Host("traefik.local") && Path("/") # переадресация чтобы не вызывать по полному пути (`/dashboard`) kind: Rule services: - name: api@internal kind: TraefikService ``` Применим манифест и проверим, что он применился: ```shell kubectl get ingressroute -n kube-system ``` Увидим что-то вроде: ```text NAME AGE traefik-dashboard 4m ``` Проверим, что панель управления Traefik доступна по адресу `traefik.local`: ```shell curl -v http://traefik.local/dashboard/ ``` Увидим что-то вроде: ```text Trying :80... * Connected to traefik.local () port 80 (#0) > GET /dashboard/ HTTP/1.1 > Host: traefik.local > User-Agent: curl/7.81.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Content-Security-Policy: frame-src 'self' https://traefik.io https://*.traefik.io; ... ... ``` Как видим, статус 200 OK, значит панель доступна и работает. ```shell curl -v http://traefik.local/ ``` Увидим что-то вроде: ```text Trying :80... * Connected to traefik.local () port 80 (#0) > GET / HTTP/1.1 > Host: traefik.local > User-Agent: curl/7.81.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 302 Found < Location: /dashboard/ < Date: Sat, 03 May 2025 11:59:19 GMT < Content-Length: 0 ``` Как видим, статус 302 Found, значит переадресация тоже работает. Откроем в браузере `http://traefik.local/dashboard/` и видим панель управления Traefik: ![k3s--traefik-dashboard.png](../images/k3s--traefik-dashboard.png)