From 19ba8e07e4ef97c86f0aa84305a8f86a034cec6b Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 3 May 2025 15:58:21 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0?= =?UTF-8?q?=20=D0=BA=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D1=8F=D0=BC=20=D1=83?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20Lobgho?= =?UTF-8?q?rn=20=D0=B8=20Traefik?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- images/k3s--longhorn-ui.png | Bin 0 -> 41625 bytes ...shboard.png => k3s--traefik-dashboard.png} | Bin kubernetes/k3s-backup.md | 7 +- .../k3s-setting-up-web-access-to-dashboard.md | 299 ++++++++++++++++++ raspberry-and-orange-pi/k3s.md | 5 +- 6 files changed, 308 insertions(+), 5 deletions(-) create mode 100644 images/k3s--longhorn-ui.png rename images/{k3s--traefic-dashboard.png => k3s--traefik-dashboard.png} (100%) create mode 100644 kubernetes/k3s-setting-up-web-access-to-dashboard.md diff --git a/README.md b/README.md index eb6f92d..f1d7b37 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ * [Проксирование внешнего хоста через Traefik (Ingress-контроллер)](kubernetes/k3s-proxy.md) * [Перенос контейнера Docker в k3s](kubernetes/k3s-migrating-container-from-docker-to-kubernetes.md) (на примере Gitea) * [Резервное копирование k3s](kubernetes/k3s-backup.md) -* +* [Настройка доступа к панелям управления](kubernetes/k3s-setting-up-web-access-to-dashboard.md) Lobghorn и Traefik ## Python * [Устранение проблем при установке Python-коннектора mysqlclient (MySQL/MariaDB)](python/python-mysql.md) * [Python-скрипт как служба Linux](python/python_as_service.md) diff --git a/images/k3s--longhorn-ui.png b/images/k3s--longhorn-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..7f569e27eda2a93d0ed46466e32e09f8fb619e53 GIT binary patch literal 41625 zcmdS9RZv`C@GeRcLU0Me-7UC#aECx}4K~2w?gIf5TnE<#9o*f5Gr*vOySuxe{Qmde zx-a+PR-LEQRl6Tnul~BLcdc*j>fYgBRpl^HiBS;{5HJ+vr8N)`-oX(N5Gjz~{afh^ zQdj%8fbdmWQ|9XC=KA*b`uh6n>gw#`>ipv3=<4p^^7i!n{OIib==9?7^z88XZ1ebX zdvACD@c88P7e{KJC_vm={@Mw4cVCUd)_uz1E zZ};x;X?uHnV|!;~V`FV?ZTWn6@!))J`*>}0`|;^%d3|GLeRFjEXkldyy0X`^v^TJN z(7&+tbUpucHZ*oP51(6@Us_pSUY?(ypO~JRo}QkVn0R@48JV0Ootz$obv15mm&~j+O>dQsuC)`{E{MGrQ;ibWAjLbR{*6Bz3?u zI_ANxiy@8EQO%1X4a*U&@Tm6bsQRJsivBtH&)c=|yN!h3e`{hUA(?Zvw?##_Y3cV* z|4Cb0TW4oyYg=1uM`v?$bA3x&ZEHt;ef`bNO-)Trd3|$PbzMzeT|q_7#r1Vbd3i-e z1*EvRw6wIOq$IbbA}_z-pXBD|X8-<^Q(T@^Sel++oR$ZPjf;DDcu330$jZt}PfrIY zCMG8*$H&KqhK5B(|0fX<5y2rLzkdA+3JUUqj=jFVnisDbL)P^R*ERDu9v>f7ayMmu zZ%Sovd6xEjR;~EfthiRLT9vNamalr(j9L{B80PhAW_O8XY;&jW+&?_Br0miq?h?oC zktghairvGG+4q8`0(v5xa@(AI+fBp6v9hgD&qKK8t6l734T

{F4glipe-AXvsD8^yoXi$>6nLePq={;N9O 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 literal 0 HcmV?d00001 diff --git a/images/k3s--traefic-dashboard.png b/images/k3s--traefik-dashboard.png similarity index 100% rename from images/k3s--traefic-dashboard.png rename to images/k3s--traefik-dashboard.png diff --git a/kubernetes/k3s-backup.md b/kubernetes/k3s-backup.md index 77397fa..99ed9e0 100644 --- a/kubernetes/k3s-backup.md +++ b/kubernetes/k3s-backup.md @@ -273,4 +273,9 @@ sudo crontab -e ```text # Резервное копирование K3S 10 2 * * * /usr/bin/bash /home/opi/script/backup-k3s.sh -``` \ No newline at end of file +``` + +## Настройка резервного копирования томов блочного хранилища Longhorn + +Наиболее удобный способ резервного копирования томов блочного хранилища Longhorn - встроенная в него панель управления. +О том как настроить доступ к ней из браузера, читайте в заметке [Настройка доступа к панели управления Longhorn](k3s-setting-up-web-access-to-dashboard.md). \ No newline at end of file diff --git a/kubernetes/k3s-setting-up-web-access-to-dashboard.md b/kubernetes/k3s-setting-up-web-access-to-dashboard.md new file mode 100644 index 0000000..acb6ef2 --- /dev/null +++ b/kubernetes/k3s-setting-up-web-access-to-dashboard.md @@ -0,0 +1,299 @@ +# Настройка доступа к панелям управления 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]` — используем entryPoint: web (порт 8000, HTTP, но снаружи будет доступен по 80-му порту). + * `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 можно будет изменить число реплик для каждого тома с 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) \ No newline at end of file diff --git a/raspberry-and-orange-pi/k3s.md b/raspberry-and-orange-pi/k3s.md index c53ecec..ea79db0 100644 --- a/raspberry-and-orange-pi/k3s.md +++ b/raspberry-and-orange-pi/k3s.md @@ -424,10 +424,9 @@ metrics-server ClusterIP 10.43.248.208 traefik LoadBalancer 10.43.164.48 192.168.1.26,192.168.1.27,192.168.1.28 80:31941/TCP,443:30329/TCP,9000:32185/TCP 3d ``` -Можем проверить доступность панели `Traefik` через браузер через IP-адрес нового узла и (в нашем случае `http://192.168.1.26:9000/dashboard/#/`) -и увидим, что балаансировщик работает и перенаправляет трафик и с ноды воркера. +Можем так же настроить [web-панель Traefik](../kubernetes/k3s-setting-up-web-access-to-dashboard.md). -![k3s--traefic-dashboard.png](../images/k3s--traefic-dashboard.png) +![k3s--traefic-dashboard.png](../images/k3s--traefik-dashboard.png) Что ж, теперь у нас есть кластер k3s с тремя нодами: двумя мастерами и одним воркером. Но, как я уже говорил, это не идеальная конфигурация, так как у нас четное количество мастер-узлов.