From bbaf3c401401420587ec67d838f430989acb03c8 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 25 Feb 2025 13:17:15 +0300 Subject: [PATCH] =?UTF-8?q?add:=20k3s=20(=D0=B2=D1=82=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BC=D0=B0=D1=81=D1=82=D0=B5=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- raspberry-and-orange-pi/k3s.md | 63 +++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/raspberry-and-orange-pi/k3s.md b/raspberry-and-orange-pi/k3s.md index d92c117..5145e97 100644 --- a/raspberry-and-orange-pi/k3s.md +++ b/raspberry-and-orange-pi/k3s.md @@ -23,7 +23,7 @@ IoT-устройства, edge-серверы и т.п.). Для кластер Мне же надо, чтобы как миниум две (а лучше все) ноды могли быть мастерами, так что я буду делать k3s-кластер с использованием *etcd*. -## Установка k3s на первом узле +## Установка k3s на первом узле (мастер) Некоторые требования к узлам: * На всех Orange Pi установлена одинаковая версия Ubuntu (например, 22.04 или 24.04). @@ -33,7 +33,7 @@ IoT-устройства, edge-серверы и т.п.). Для кластер Установливаем первый мастер: ```bash -curl -sfL https://get.k3s.io | sh -s - server --cluster-init --tls-san=192.168.1.10 +curl -sfL https://get.k3s.io | sh -s - server --cluster-init --tls-san=192.168.1.27 ``` Здесь: @@ -44,7 +44,7 @@ curl -sfL https://get.k3s.io | sh -s - server --cluster-init --tls-san=192.168.1 * `--cluster-init` -- добавляет поддержку высокой доступности (HA -- High Availability) через встроенный `etcd`. Это значит, что узел инициализирует новый кластер и готов к тому, чтобы другие мастер-узлы могли к нему подключиться (для создания HA-конфигурации). -* `--tls-san=192.168.1.10` -- добавляет IP 192.168.1.10 в сертификаты API-сервера, чтобы другие узлы и клиенты +* `--tls-san=192.168.1.27` -- добавляет IP 192.168.1.27 в сертификаты API-сервера, чтобы другие узлы и клиенты могли обращаться к нему по этому адресу. Проверим, что все k3s запущен: @@ -129,7 +129,7 @@ kube-system traefik-5d45fc8cc9-t5d58 1/1 Running 0 Можно проверить, что API нашего узла (кластера) отвечает: ```bash -curl -k https://192.168.1.10 +curl -k https://192.168.1.27 ``` Здесь ключ `-k` означает, что мы не проверяем сертификаты (нам важно только, что сервер отвечает). Должны получить @@ -146,8 +146,55 @@ Unauthorized JSON-ответ от API. Что-то вроде: } ``` +## Подключение второго узла (мастер) ----- -На первой ноде запускаем. Пока без кластерного etcd (ока хранение идёт в SQLite) и без Traefik (Traefik -- это -ingress-контроллера в k3s, и в Kubernetes в целом, — это компонент, который управляет входящим сетевым трафиком -кластера и позволяет маршрутизировать HTTP/HTTPS-запросы к соответствующим подам, с динамической конфигурацией \ No newline at end of file +Для начала, на первой ноде получим токен для подключения нового узла к кластеру: +```bash +sudo cat /var/lib/rancher/k3s/server/node-token +``` + +Вывод будет что-то вроде `K10...::server:longrandomstring`. Это и есть токен, который нужно будет использовать. + +Теперь на втором Orange Pi (например, с IP 192.168.1.28) можно запустить второй мастер-узел (вставим токен +из предыдущего шага): +```bash +curl -sfL https://get.k3s.io | sh -s - server --server https://192.168.1.27:6443 --token <ТОКЕН> --tls-san=192.168.1.28 +``` +Здесь ключи: +* `--server https://192.168.1.27:6443` -- указывает на API мастер-узла, чтобы наш новый узел мог подключиться к кластеру. +* `--token` — токен аутентификации из предыдущего шага. +* `--tls-san=192.168.1.28` -- добавляет IP нашего второго мастера в сертификаты (для будущих подключений). + +Проверим какие теперь ноды в кластере: +```bash +sudo k3s kubectl get nodes +``` + +Теперь увидим две ноды: +```text +NAME STATUS ROLES AGE VERSION +opi5plus-2 Ready control-plane,etcd,master 2h v1.31.5+k3s1 +opi5plus-3 Ready control-plane,etcd,master 110s v1.31.5+k3s1 +``` + +Проверим поды кластера и посмотрим на каких нодах они запущены: +```bash +sudo k3s kubectl get pods -A -o wide +``` + +И увидим, что на второй ноде запустились те же поды, что и на первой: +```text +NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +kube-system coredns-ccb96694c-tfjwj 1/1 Running 0 2h 10.42.0.4 opi5plus-2 +kube-system helm-install-traefik-crd-bdbgd 0/1 Completed 0 2h opi5plus-2 +kube-system helm-install-traefik-mlztm 0/1 Completed 1 2h opi5plus-2 +kube-system local-path-provisioner-5cf85fd84d-jwz5n 1/1 Running 0 2h 10.42.0.3 opi5plus-2 +kube-system metrics-server-5985cbc9d7-n9dwz 1/1 Running 0 2h 10.42.0.2 opi5plus-2 +kube-system svclb-traefik-4f8c2580-jddgz 2/2 Running 0 2h 10.42.0.7 opi5plus-2 +kube-system svclb-traefik-4f8c2580-xzt5d 2/2 Running 0 2m35s 10.42.1.2 opi5plus-3 +kube-system traefik-5d45fc8cc9-t5d58 1/1 Running 0 2h 10.42.0.8 opi5plus-2 +``` + +Как видим, у нас появился еще один `svclb-traefik` на второй ноде. Это под -- Service Load Balancer (SLB) для Traefik. +Он эмулирует облачный балансировщик нагрузки (типа AWS ELB), которого нет в локальном окружении вроде Orange Pi. +SLB перенаправляет внешний трафик (например, на порты 80/443) к сервисам типа LoadBalancer внутри кластера.