From 8634efc350a23dfa08df8805537aee566572a8a3 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 7 Mar 2025 12:09:22 +0300 Subject: [PATCH] =?UTF-8?q?add:=20k3s=20(=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BD=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=B5=D0=B3=D0=BE=20=D1=83=D0=B7=D0=BB=D0=B0,=20part-fin?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspberry-and-orange-pi/k3s.md | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/raspberry-and-orange-pi/k3s.md b/raspberry-and-orange-pi/k3s.md index 3a06484..e1bbb5b 100644 --- a/raspberry-and-orange-pi/k3s.md +++ b/raspberry-and-orange-pi/k3s.md @@ -619,9 +619,33 @@ sudo k3s kubectl get nodes Получим, например: ```text NAME STATUS ROLES AGE VERSION -opi5plus-1 Ready control-plane,etcd,master 5d4h v1.31.5+k3s1 -opi5plus-2 Ready control-plane,etcd,master 8d v1.31.5+k3s1 -opi5plus-3 Ready control-plane,etcd,master 7d2h v1.31.5+k3s1 +opi5plus-1 Ready control-plane,etcd,master 1d4h v1.31.5+k3s1 +opi5plus-2 Ready control-plane,etcd,master 1d v1.31.5+k3s1 +opi5plus-3 Ready control-plane,etcd,master 1d2h v1.31.5+k3s1 rpi3b Ready 25h v1.31.6+k3s1 -vps-sw-eye Ready 7h35m v1.31.6+k3s1 -``` \ No newline at end of file +vps-sw-eye Ready 35m v1.31.6+k3s1 +``` + +#### Проблема Flannel для внешних узлов + +Узлы во внешнем интернете создаются и управляются через Kubernetes API, используя порт `6443/TCP`. Но, для того чтобы +передавать трафик и данные между узлами k3s использует сетевой плагин **Flannel**. Он встроен в бинарник k3s (в отличие +от k8s, где Flannel работают как поды) и использует overlay-сеть (`10.42.x.x`). Это внутренняя сеть k3s, VXLAN-туннель +между всеми узлами кластера (мастерами и воркерами). Flannel использует порт `8472/UDP`. + +К сожалению проброс порта `8472` с внешнего хоста в домашнюю сеть через роутер не поможет, так обмен идёт не через TCP-, +а UDP-порт. Внешний узел отправит пакеты через overlay-сеть Flannel (10.42.x.x) через 8472/UDP к мастеру, но Мастер +отвечает через свой реальный IP (192.168.1.x), который недоступен напрямую из интернета без обратного проброса или VPN. +Проброс :8472 → >:8472 позволяет трафику от внешнего хоста доходить до домашней сети, но ответный +трафик от мастеров к VPS (например, от :8472 к :8472) не будет проходить, потому что NAT в роутере + "односторонний" — он не знает, как маршрутизировать UDP-ответы от мастеров обратно к VPS через интернет. + +Таким образом, для управления удаленным узлом нужно чтобы он имел локальный IP-адрес в домашней сети, а не внешний. +SSH-тоннель с помощью `autossh` и упаковкой UDP-трафика в TCP через `socat` не сработает (а я надеялся). Таким образом +"пробросить" Flannel для полноценного подключения удаленного k3s-узла -- VPN-туннель между каждой мастер-нодой на +удаленный узел. Это вполне рабочия вариант, если удаленные узлы -- полноценные и произвольные хосты. Но в моём +случае удаленный узел -- хост на 1 ядро и 1 ГБ ОЗУ. К тому же он на платформе x86_64, а не ARM, а значит ради одного +узла не стоит заморачиваться с VPN. + +Другим вариантом является подключение внутри самих подов на удаленном узле к необходимым сервисам напрямую. Но таким +образом порты базы данных, менеджеров очередей и т.д. будут доступны из интернета, что небезопасно и в целом плохая идея.