add: k3s (подключение внешнего
узла, part-1)
This commit is contained in:
parent
ea88f3065a
commit
a86d2d5ed7
@ -461,3 +461,167 @@ kube-dns 10.42.1.8:53,10.42.2.6:53,10.42.1.8:53 + 3 more... 5d23h
|
||||
|
||||
### Разные архитектуры на узлах кластера (гетерогенность)
|
||||
|
||||
Когда мы подключили узлы (мастеры и воркеры) к кластеру, мы использовали одинаковые Orange Pi 5 Plus. Но, в реальности,
|
||||
кластеры Kubernetes часто состоят из узлов с разными архитектурами и характеристиками. Например, если подключить к
|
||||
к кластеру Raspberry Pi 3B увидим примерно такую картину:
|
||||
```text
|
||||
NAME STATUS ROLES AGE VERSION
|
||||
opi5plus-1 Ready control-plane,etcd,master 3d3h v1.31.5+k3s1
|
||||
opi5plus-2 Ready control-plane,etcd,master 6d3h v1.31.5+k3s1
|
||||
opi5plus-3 Ready control-plane,etcd,master 5d1h v1.31.5+k3s1
|
||||
rpi3b Ready <none> 27s v1.31.6+k3s1
|
||||
```
|
||||
|
||||
Но надо помнить, что разные архитектуры могут быть оказаться несовместимы с некоторыми приложениями и образами.
|
||||
Например, Raspberry Pi 3B — это 32-битный ARMv7 (armv7l), а Orange Pi 5 Plus — 64-битный ARMv8 (aarch64). Если в
|
||||
подах используются бинарные файлы, скомпилированные под определённую архитектуру, то они могут не работать на узлах
|
||||
с другой архитектурой. Также, некоторые образы Docker могут быть доступны только для определённых архитектур.
|
||||
|
||||
В ограниченном объеме можно подключать узлы на других платформах. Например, Windows, может иметь только воркер-узлы на k8s
|
||||
(начиная с версии 1.14), а в k3s экспериментальная поддержка Windows-воркеров (начиная с с версии 1.24). На macOS нет
|
||||
официальной поддержки Kubernetes/k3s для узлов на macOS (можно использовать обходные пути с использованием виртуальныех
|
||||
машин).
|
||||
|
||||
### Добавление узлов во "внешнем" интернете
|
||||
|
||||
В моем проекте (специализированном поисковике) будет нужно парсить и интернет сайты, включая заблокированные сайты.
|
||||
К сожалению современный интернет имеет взаимные региональные блокировки и просто использовать VPN интернет-соединения
|
||||
не сработает. Выходом может стать использование воркер-узлов во внешнем интернете. Идея в том, что если какой-нибудь
|
||||
URL не получится обработать на поде одного узла, то можно попробовать обработать его на другом узле, в другой локации.
|
||||
|
||||
Так как узлы k3s взаимодействуют через API на 6443-порте, то для доступа к кластеру из внешнего интернета нужно будет
|
||||
обеспечить проброс трафика через роутер сети на один из мастер-узлов. НО у нас три мастер-узла, а значит если упадет
|
||||
узел на который происходит проброс, то удаленный воркер-узел "отвелится" и потеряет доступ к кластеру. Объединить
|
||||
IP всеx мастер-узлов в один можно с помощью балансировщика нагрузки **Keepalived**. Он создает виртуальный IP-адрес
|
||||
(VIP), c которого перенапрвляет трафик на один из мастер-узлов, и если этот узел упадет, то трафик перенаправится
|
||||
на другой и так далее.
|
||||
|
||||
Установи `Keepalived` на все мастер-ноды:
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install keepalived
|
||||
```
|
||||
|
||||
Настроим `Keepalived` последовательно на каждом мастере. Для этого отредактируем (создадим) файл конфигурации
|
||||
`/etc/keepalived/keepalived.conf`:
|
||||
```bash
|
||||
sudo nano /etc/keepalived/keepalived.conf
|
||||
```
|
||||
|
||||
На первом мастер-узле (хост -- `opi5plus-1`, IP -- `192.168.1.26`):
|
||||
```text
|
||||
vrrp_instance VI_1 {
|
||||
state MASTER # ЭТО ГЛАВНЫЙ ХОСТ. ПО УМОЛЧАНИЮ ТРАФИК С VIP БУДЕТ ПЕРЕНАПРАВЛЯТЬСЯ НА ЭТОТ ХОСТ
|
||||
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и хост подключен по интерфейсу enP4p65s0
|
||||
virtual_router_id 51
|
||||
priority 100 # Самый высокий приоритет
|
||||
advert_int 1
|
||||
unicast_src_ip 192.168.1.26 # IP текущего хоста (opi5plus-1)
|
||||
unicast_peer {
|
||||
192.168.1.27 # IP второго хоста (opi5plus-2)
|
||||
192.168.1.28 # IP третьего хоста (opi5plus-3)
|
||||
}
|
||||
virtual_ipaddress {
|
||||
192.168.1.200 # Виртуальный IP (VIP), он должен быть исключен из диапазона DHCP
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
На втором мастер-узле (хост -- `opi5plus-2`, IP -- `192.168.1.27`):
|
||||
```text
|
||||
vrrp_instance VI_1 {
|
||||
state BACKUP # ЭТО ВТОРОЙ ХОСТ. ОН БУДЕТ ПОЛУЧАТЬ ТРАФИК С VIP, ЕСЛИ ГЛАВНЫЙ ХОСТ УПАДЕТ
|
||||
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и хост подключен по интерфейсу enP4p65s0
|
||||
virtual_router_id 51
|
||||
priority 90 # Меньший приоритет
|
||||
advert_int 1
|
||||
unicast_src_ip 192.168.1.27 # IP текущего хоста (opi5plus-2)
|
||||
unicast_peer {
|
||||
192.168.1.26 # IP первого хоста (opi5plus-1)
|
||||
192.168.1.28 # IP третьего хоста (opi5plus-3)
|
||||
}
|
||||
virtual_ipaddress {
|
||||
192.168.1.200 # Виртуальный IP
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
И, наконец, на третьем мастер-узле (хост -- `opi5plus-3`, IP -- `192.168.1.28`):
|
||||
```text
|
||||
vrrp_instance VI_1 {
|
||||
state BACKUP # ЭТО ТРЕТИЙ ХОСТ. ОН БУДЕТ ПОЛУЧАТЬ ТРАФИК С VIP, ЕСЛИ ГЛАВНЫЙ- И БЭКАП-ХОСТ УПАДЕТ
|
||||
interface enP4p65s0 # У Orange Pi 5 plus два интерфейса, и этот узел подключен по enP4p65s0
|
||||
virtual_router_id 51
|
||||
priority 80 # Еще меньший приоритет
|
||||
advert_int 1
|
||||
unicast_src_ip 192.168.1.28 # IP текущего хоста (opi5plus-3)
|
||||
unicast_peer {
|
||||
192.168.1.27 # IP первого хоста (opi5plus-1)
|
||||
192.168.1.28 # IP второго хоста (opi5plus-2)
|
||||
}
|
||||
virtual_ipaddress {
|
||||
192.168.1.200 # Виртуальный IP
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Добавим `Keepalived` в автозагрузку на всех мастер-узлах и запустим его:
|
||||
```bash
|
||||
sudo systemctl enable keepalived
|
||||
sudo systemctl start keepalived
|
||||
```
|
||||
|
||||
Теперь, если вы на первом мастер-узле (opi5plus-1) проверить доступные IP-адреса:
|
||||
```bash
|
||||
ip addr show
|
||||
```
|
||||
|
||||
то увидим:
|
||||
```text
|
||||
...
|
||||
...
|
||||
2: enP4p65s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether c0:74:2b:fd:42:3c brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.1.26/24 brd 192.168.1.255 scope global dynamic noprefixroute enP4p65s0
|
||||
valid_lft 68779sec preferred_lft 68779sec
|
||||
inet 192.168.1.200/32 scope global enP4p65s0
|
||||
valid_lft forever preferred_lft forever
|
||||
...
|
||||
```
|
||||
Обратите внимание на виртуальный IP-адрес `192.168.1.200` находится в другой подсети (CIDR) и имеет маску `/32` (то
|
||||
есть с маской подсети `255.255.255.255`). Это "точечная" подсеть, содержащая только один адрес, не привязан к основной
|
||||
подсети интерфейса (/24) и это позволяет VIP "плавать" между узлами, не вызывая конфликтов с основными IP-адресами
|
||||
и не требуя изменения подсети на каждом узле. VIP рассматривается как уникальный адрес, не требующий маршрутизации,
|
||||
он просто "привязан" к интерфейсу.
|
||||
|
||||
Теперь панель `Traefik` доступна по VIP-адресу `http://192.168.1.200:9000/dashboard/#`, т.к. трафик с этого адреса
|
||||
будет перенаправлен на один из мастер-узлов.
|
||||
|
||||
API Kubernetes тоже теперь доступен по VIP-адресу. Все воркер-узлы, подключенные к кластеру, лучше подключать к
|
||||
кластеру через VIP-адрес. Сами мастер узлы знают свои IP и взаимодействую через `etcd`, но воркеры подключаясь
|
||||
через VIP будут более устойчивы к сбоям мастер-узлов. Подсоединить удаленный воркер-узел к кластеру лучше через VIP.
|
||||
Для этого нужно на роутере сети настроить проброс порта `6443` с внешнего IP роутера, на виртуальный IP-адрес внутри
|
||||
сети (тоже на `6443` порт). После проверить, что с внешнего хоста API Kubernetes доступно:
|
||||
```bash
|
||||
curl -k https://<PUBLIC_IP_ROUTER>:6443
|
||||
```
|
||||
|
||||
Если отклик есть (например, `Unauthorized`), то можно подключить удаленый воркер-узел к кластеру:
|
||||
```bash
|
||||
curl -sfL https://get.k3s.io | sh -s - agent --server https://<PUBLIC_IP_ROUTER>:6443 --token <TOKEN>
|
||||
```
|
||||
|
||||
Когда процесс завершится, на любом мастер-узле можно проверить, что воркер-узел подключился:
|
||||
```bash
|
||||
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
|
||||
rpi3b Ready <none> 25h v1.31.6+k3s1
|
||||
vps-sw-eye Ready <none> 7h35m v1.31.6+k3s1
|
||||
```
|
Loading…
Reference in New Issue
Block a user