add: под с 3X-UI ....
This commit is contained in:
parent
3a1ce1370b
commit
09d32c8cb1
@ -220,6 +220,103 @@ sudo kubectl apply -f ~/k3s/vpn/x-ui/deployment.yaml
|
|||||||
|
|
||||||
## Единая точка входа VPN-соединений через под 3x-ui
|
## Единая точка входа VPN-соединений через под 3x-ui
|
||||||
|
|
||||||
|
Под с 3x-ui может быть запущен k3s на произвольном узле, и может быть произвольно перемещён в кластере на другой узел.
|
||||||
|
Таким образом, если мы хотим предоставить доступ к VPN-соединениям из интернета, нам нужно настроить доступ через
|
||||||
|
единый IP-адрес. Это можно сделать несколькими способами.
|
||||||
|
|
||||||
|
### Доступ через VIP (виртуальный IP) c перенаправлял трафика через Keepalived на узел с подом с 3x-ui
|
||||||
|
|
||||||
|
При [развертывании k3s](../raspberry-and-orange-pi/k3s.md) на Orange Pi 5 Plus мы уже настраивали Keepalived. Теперь
|
||||||
|
надо настроить его так, чтобы узел с подом 3x-ui получал больший приоритет в Keepalived, и тогда виртуальный IP
|
||||||
|
будет получать трафик с этого узла.
|
||||||
|
|
||||||
|
**Лучшим решением будет динамическая настройка приоритета в Keepalived.**
|
||||||
|
|
||||||
|
Лучший способ — настроить так, чтобы приоритет Keepalived ноды автоматически повышался, если под 3x-ui запущен на ней.
|
||||||
|
Это можно сделать с помощью механизма `track_script`, который будет проверять наличие пода и динамически менять
|
||||||
|
приоритет. Такой подход сохранит текущую работу K3s API и [подов Shadowsocks](k3s-shadowsocks-client.md), добавив
|
||||||
|
поддержку 3x-ui.
|
||||||
|
|
||||||
|
Создадим проверочный скрипт (на каждом узле), который будет проверять наличие пода 3x-ui. Скрипт будет
|
||||||
|
расположен в `~/scripts/check_xui.sh`:
|
||||||
|
```bash
|
||||||
|
mkdir -p ~/scripts
|
||||||
|
nano ~/scripts/check_xui.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
И вставим в него следующий код (на каждой ноде):
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/bash
|
||||||
|
NODE_NAME=$(hostname) # Получаем имя текущей ноды
|
||||||
|
POD_NAME=$(kubectl get pods -n x-ui -o jsonpath="{.items[?(@.spec.nodeName=='$NODE_NAME')].metadata.name}")
|
||||||
|
if [ -n "$POD_NAME" ]; then
|
||||||
|
exit 0 # Под есть на этой ноде
|
||||||
|
else
|
||||||
|
exit 1 # Пода нет
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт использует `kubectl`, чтобы проверить, есть ли под `3x-ui` в _namespace_ `x-ui` на текущей ноде. Использование
|
||||||
|
`sudo` не требуется, так как скрипт будет запускаться `keepalived`, который работает от `root`.
|
||||||
|
Убедись, что kubectl доступен на всех нодах и настроен для работы с кластером (например, через kubeconfig).
|
||||||
|
|
||||||
|
Сделаем скрипт исполняемым (на каждой ноде):
|
||||||
|
```bash
|
||||||
|
sudo chmod +x ~/scripts/check_xui.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Обновим конфиг `reepalived`, добавив `vrrp_script` и привязку к нему через `track_script`. Теперь мы переведем все
|
||||||
|
ноды в **BACKUP** (чтобы избежать конфликтов), а приоритет будет динамически меняться в зависимости от наличия пода.
|
||||||
|
|
||||||
|
На перовой мастер-ноде:
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/keepalived/keepalived.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
И теперь там будет вот такой конфиг (не забудь указать правильное имя пользователя `<user>` в пути к скрипту):
|
||||||
|
```text
|
||||||
|
```pycon
|
||||||
|
vrrp_script check_xui {
|
||||||
|
script "/home/<user>/scripts/check_xui.sh"
|
||||||
|
interval 2 # Проверять каждые 2 секунды
|
||||||
|
weight 50 # Добавить 50 к приоритету, если под есть
|
||||||
|
}
|
||||||
|
|
||||||
|
vrrp_instance VI_1 {
|
||||||
|
# state MASTER
|
||||||
|
state BACKUP # Все ноды стартуют как BACKUP
|
||||||
|
interface enP4p65s0
|
||||||
|
virtual_router_id 51
|
||||||
|
priority 100 # Базовый приоритет
|
||||||
|
advert_int 1
|
||||||
|
unicast_src_ip 192.168.1.26
|
||||||
|
unicast_peer {
|
||||||
|
192.168.1.27
|
||||||
|
192.168.1.28
|
||||||
|
}
|
||||||
|
virtual_ipaddress {
|
||||||
|
192.168.1.200
|
||||||
|
}
|
||||||
|
track_script {
|
||||||
|
check_xui # Привязка к скрипту
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Перезапустим Keepalived:
|
||||||
|
```bash
|
||||||
|
sudo service keepalived restart
|
||||||
|
```
|
||||||
|
|
||||||
|
Аналогичным образом настроим конфиги на других узлах (добавить блок `vrrp_script` сверху, и добавить `track_script` в
|
||||||
|
`vrrp_instance`). Не забудь указать проверить `unicast_src_ip` для каждой ноды и перезапустить Keepalived на всех узлах.
|
||||||
|
|
||||||
|
Теперь на каждой ноде cкрипт `~/scripts/check_xui.sh` проверяет наличие пода `x-ui` каждые 2 секунды. Если под есть,
|
||||||
|
Keepalived добавляет 50 к базовому приоритету ноды (например, 100 → 150). Если пода нет, приоритет остаётся базовым
|
||||||
|
(100, 90 или 80). Нода с наивысшим приоритетом становится MASTER и получает виртуальный IP. Таким образом, VIP всегда
|
||||||
|
будет указывать на ноду с подом 3x-ui.
|
||||||
|
|
||||||
|
Теперь панель 3x-ui будет доступна с виртуального IP (192.168.1.200). Все VPN-соединения будут работать через него.
|
||||||
|
Так что если на домашнем роутере настроить перенаправление портов (для 2053-порта веб-панели 3x-ui, и портов которые
|
||||||
|
будем выбирать для VPN-соединений), то можно будет подключаться к 3x-ui и VPN-соединениям из любой точки мира.
|
||||||
|
|
||||||
|
@ -499,6 +499,8 @@ rpi3b Ready <none> 27s v1.31.6+k3s1
|
|||||||
не сработает. Выходом может стать использование воркер-узлов во внешнем интернете. Идея в том, что если какой-нибудь
|
не сработает. Выходом может стать использование воркер-узлов во внешнем интернете. Идея в том, что если какой-нибудь
|
||||||
URL не получится обработать на поде одного узла, то можно попробовать обработать его на другом узле, в другой локации.
|
URL не получится обработать на поде одного узла, то можно попробовать обработать его на другом узле, в другой локации.
|
||||||
|
|
||||||
|
#### Настройка Keepalived
|
||||||
|
|
||||||
Так как узлы k3s взаимодействуют через API на 6443-порте, то для доступа к кластеру из внешнего интернета нужно будет
|
Так как узлы k3s взаимодействуют через API на 6443-порте, то для доступа к кластеру из внешнего интернета нужно будет
|
||||||
обеспечить проброс трафика через роутер сети на один из мастер-узлов. НО у нас три мастер-узла, а значит если упадет
|
обеспечить проброс трафика через роутер сети на один из мастер-узлов. НО у нас три мастер-узла, а значит если упадет
|
||||||
узел на который происходит проброс, то удаленный воркер-узел "отвелится" и потеряет доступ к кластеру. Объединить
|
узел на который происходит проброс, то удаленный воркер-узел "отвелится" и потеряет доступ к кластеру. Объединить
|
||||||
@ -519,7 +521,7 @@ sudo nano /etc/keepalived/keepalived.conf
|
|||||||
```
|
```
|
||||||
|
|
||||||
На первом мастер-узле (хост — `opi5plus-1`, IP — `192.168.1.26`):
|
На первом мастер-узле (хост — `opi5plus-1`, IP — `192.168.1.26`):
|
||||||
```text
|
```pycon
|
||||||
vrrp_instance VI_1 {
|
vrrp_instance VI_1 {
|
||||||
state MASTER # ЭТО ГЛАВНЫЙ ХОСТ. ПО УМОЛЧАНИЮ ТРАФИК С VIP БУДЕТ ПЕРЕНАПРАВЛЯТЬСЯ НА ЭТОТ ХОСТ
|
state MASTER # ЭТО ГЛАВНЫЙ ХОСТ. ПО УМОЛЧАНИЮ ТРАФИК С VIP БУДЕТ ПЕРЕНАПРАВЛЯТЬСЯ НА ЭТОТ ХОСТ
|
||||||
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и хост подключен по интерфейсу enP4p65s0
|
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и хост подключен по интерфейсу enP4p65s0
|
||||||
@ -538,7 +540,7 @@ vrrp_instance VI_1 {
|
|||||||
```
|
```
|
||||||
|
|
||||||
На втором мастер-узле (хост — `opi5plus-2`, IP — `192.168.1.27`):
|
На втором мастер-узле (хост — `opi5plus-2`, IP — `192.168.1.27`):
|
||||||
```text
|
```pycon
|
||||||
vrrp_instance VI_1 {
|
vrrp_instance VI_1 {
|
||||||
state BACKUP # ЭТО ВТОРОЙ ХОСТ. ОН БУДЕТ ПОЛУЧАТЬ ТРАФИК С VIP, ЕСЛИ ГЛАВНЫЙ ХОСТ УПАДЕТ
|
state BACKUP # ЭТО ВТОРОЙ ХОСТ. ОН БУДЕТ ПОЛУЧАТЬ ТРАФИК С VIP, ЕСЛИ ГЛАВНЫЙ ХОСТ УПАДЕТ
|
||||||
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и хост подключен по интерфейсу enP4p65s0
|
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и хост подключен по интерфейсу enP4p65s0
|
||||||
@ -557,7 +559,7 @@ vrrp_instance VI_1 {
|
|||||||
```
|
```
|
||||||
|
|
||||||
И, наконец, на третьем мастер-узле (хост — `opi5plus-3`, IP — `192.168.1.28`):
|
И, наконец, на третьем мастер-узле (хост — `opi5plus-3`, IP — `192.168.1.28`):
|
||||||
```text
|
```pycon
|
||||||
vrrp_instance VI_1 {
|
vrrp_instance VI_1 {
|
||||||
state BACKUP # ЭТО ТРЕТИЙ ХОСТ. ОН БУДЕТ ПОЛУЧАТЬ ТРАФИК С VIP, ЕСЛИ ГЛАВНЫЙ- И БЭКАП-ХОСТ УПАДЕТ
|
state BACKUP # ЭТО ТРЕТИЙ ХОСТ. ОН БУДЕТ ПОЛУЧАТЬ ТРАФИК С VIP, ЕСЛИ ГЛАВНЫЙ- И БЭКАП-ХОСТ УПАДЕТ
|
||||||
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и этот узел подключен по enP4p65s0
|
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и этот узел подключен по enP4p65s0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user