Розгортання легковагового Kubernetes кластера K3s на одному VPS: від встановлення до першого застосунку
TL;DR
У цьому детальному посібнику ми крок за кроком налаштуємо легковаговий Kubernetes кластер K3s на одному віртуальному приватному сервері (VPS). Ви дізнаєтеся, як підготувати сервер, встановити K3s, розгорнути перший тестовий застосунок та забезпечити його доступність через Ingress-контролер з TLS. Матеріал орієнтований на власників VPS, яким потрібен простий та ефективний спосіб оркестрації контейнеризованих застосунків без надлишкових ресурсів чи складності повномасштабного Kubernetes.
Підготовка VPS: встановлення базових утиліт, налаштування безпеки (SSH, Fail2ban, Firewall).
Встановлення K3s: розгортання сервера K3s версії 1.31.x на Ubuntu 24.04 LTS.
Конфігурація: налаштування доступу до кластера, розгортання Ingress-контролера Traefik та автоматичного TLS з Caddy.
Розгортання застосунку: запуск тестового веб-застосунку та його публікація у зовнішній світ.
Обслуговування: рекомендації щодо резервних копій, оновлень та усунення типових проблем.
Що ми налаштовуємо і навіщо
Схема: Що ми налаштовуємо і навіщо
Ми будемо розгортати K3s — легковаговий, сертифікований Kubernetes дистрибутив, розроблений Rancher Labs. На відміну від "великого" Kubernetes, K3s спроєктований для роботи в умовах обмежених ресурсів, таких як IoT-пристрої, периферійні обчислення (edge computing) або, в нашому випадку, одиночний VPS. Він ідеально підходить для розробників, стартапів та ентузіастів, яким потрібен надійний інструмент для оркестрації контейнерів без складності та ресурсоємності, притаманної стандартним Kubernetes-інсталяціям.
У підсумку ви отримаєте повністю функціонуючий Kubernetes кластер на одному сервері, здатний запускати та керувати вашими контейнеризованими застосунками. Це дозволить вам використовувати всі переваги Kubernetes (самовідновлення, декларативне управління, масштабування) без необхідності вкладати кошти у дорогі хмарні сервіси або підтримувати складну інфраструктуру з кількох серверів. Ви зможете легко розгортати веб-сервіси, бази даних, ігрові сервери та інші застосунки, забезпечуючи їх стабільну роботу та доступність.
Існують альтернативи, такі як повністю керовані хмарні Kubernetes-сервіси (EKS, GKE, AKS) або традиційні інсталяції Kubernetes за допомогою kubeadm на кількох VPS. Хмарні сервіси зручні, але дорогі та прив'язують вас до конкретного провайдера. Традиційний Kubernetes вимагає більше ресурсів, часу на налаштування та глибоких знань для підтримки. K3s на власному VPS пропонує золоту середину: ви зберігаєте повний контроль над інфраструктурою, мінімізуєте витрати та отримуєте значно спрощений, але при цьому повнофункціональний Kubernetes-досвід. Це чудовий вибір для тих, хто хоче вивчити Kubernetes або розгорнути невеликі/середні проєкти, де кожен долар і мегабайт ОЗП на рахунку.
Який VPS-конфіг потрібен для цього завдання
Схема: Який VPS-конфіг потрібен для цього завдання
Вибір відповідного VPS-конфігу критичний для стабільної роботи K3s та ваших застосунків. K3s сам по собі досить легковаговий, але застосунки, які ви будете на ньому запускати, можуть вимагати значних ресурсів.
Мінімальні вимоги для K3s (без застосунків):
CPU: 1 ядро (наприклад, Intel Xeon E3/E5).
RAM: 1 ГБ (для K3s та базової ОС).
Диск: 20 ГБ NVMe/SSD (для ОС, K3s та зберігання базових контейнерних образів).
Мережа: 100 Мбіт/с.
Рекомендований VPS-план для одного K3s кластера з кількома застосунками (наприклад, веб-сервіс + БД):
CPU: 2-4 ядра (наприклад, Intel Xeon E3/E5 або AMD EPYC).
RAM: 4-8 ГБ.
Диск: 50-100 ГБ NVMe/SSD (для ОС, K3s, контейнерних образів, логів та даних застосунків).
Мережа: 1 Гбіт/с або вище.
VPS із зазначеними характеристиками можна взяти у різних провайдерів. Наприклад, VPS із зазначеними характеристиками підійде для більшості завдань. Якщо ви плануєте запускати ресурсоємні бази даних, високонавантажені веб-сервіси або ігрові сервери з великою кількістю гравців, розгляньте варіант з 8+ ГБ RAM та 4+ CPU ядрами.
Коли потрібен dedicated, а не VPS
Dedicated-сервер стає виправданим, коли ваші застосунки вимагають максимальної продуктивності, гарантованих ресурсів, дуже великого обсягу дискового простору (наприклад, для зберігання резервних копій або медіафайлів), або коли ви запускаєте безліч K3s кластерів (наприклад, для різних клієнтів). Якщо ви бачите, що ваш VPS постійно завантажений на 80-90% по CPU або RAM, або вам потрібно більше 100-200 ГБ швидкого сховища, то перехід на dedicated-сервер, такий як відповідний dedicated, буде логічним кроком. Для більшості одиночних K3s інсталяцій на старті VPS буде більш ніж достатньо.
Локація: на що впливає
Вибір локації VPS впливає на затримку (latency) між вашим сервером та кінцевими користувачами. Чим ближче сервер до вашої цільової аудиторії, тим швидше завантажуватимуться сторінки та відгукуватимуться сервіси. Наприклад, для користувачів з Європи краще вибирати VPS у Німеччині, Нідерландах або Фінляндії. Для Азії — Сінгапур або Гонконг. Також враховуйте юридичні аспекти та закони про захист даних в обраній країні.
Підготовка сервера
Схема: Підготовка сервера
Перед встановленням K3s необхідно виконати мінімальне налаштування сервера для забезпечення безпеки та зручності роботи. Ми будемо використовувати Ubuntu Server 24.04 LTS.
1. Підключення по SSH та створення користувача
Підключіться до вашого VPS як користувач root, використовуючи IP-адресу та пароль, надані провайдером. Потім створіть нового користувача з правами sudo для повсякденної роботи:
# Створюємо нового користувача (замініть 'ваш_пользователь' на бажане ім'я)
sudo adduser ваш_пользователь
# Додаємо користувача до групи sudo
sudo usermod -aG sudo ваш_пользователь
Вийдіть із сесії root та увійдіть під новим користувачем.
2. Налаштування SSH-ключів
Для підвищення безпеки та зручності використовуйте SSH-ключі замість паролів. На вашій локальній машині згенеруйте ключ (якщо його немає):
# На вашій локальній машині
ssh-keygen -t rsa -b 496
Скопіюйте публічний ключ на сервер:
# На вашій локальній машині (замініть IP та ім'я користувача)
ssh-copy-id ваш_пользователь@ваш_ip_сервера
Тепер ви можете відключити автентифікацію за паролем для SSH. Відредагуйте файл /etc/ssh/sshd_config:
3. Оновлення системи та встановлення базових утиліт
Обов'язково оновіть усі пакети та встановіть необхідні утиліти, такі як curl, wget, git, unzip, net-tools, які можуть знадобитися для встановлення та налагодження.
# Оновлення списку пакетів
sudo apt update
# Оновлення всіх встановлених пакетів
sudo apt upgrade -y
# Встановлення базових утиліт
sudo apt install -y curl wget git unzip net-tools htop
4. Налаштування файрволу (UFW)
Увімкніть UFW (Uncomplicated Firewall) та дозвольте лише необхідні порти. Для K3s та SSH:
SSH: 22/tcp
K3s Server: 6443/tcp (API-сервер Kubernetes)
HTTP/HTTPS: 80/tcp, 443/tcp (для Ingress-контролера та застосунків)
# Дозволяємо SSH
sudo ufw allow ssh
# Дозволяємо порт K3s API
sudo ufw allow 6443/tcp
# Дозволяємо HTTP та HTTPS для веб-застосунків
sudo ufw allow http
sudo ufw allow https
# Вмикаємо файрвол
sudo ufw enable
# Підтвердіть 'y'
Перевірте статус файрволу:
# Перевіряємо статус UFW
sudo ufw status verbose
5. Встановлення Fail2ban
Fail2ban захищає сервер від атак методом підбору паролів, блокуючи IP-адреси, з яких відбувається занадто багато невдалих спроб входу.
Базова конфігурація Fail2ban вже досить ефективна. Для більш тонкого налаштування можна скопіювати та відредагувати файл /etc/fail2ban/jail.conf у /etc/fail2ban/jail.local.
# Копіюємо базовий конфіг для змін
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Відкриваємо для редагування (опціонально, для налаштування)
sudo nano /etc/fail2ban/jail.local
Переконайтеся, що секція [sshd] активна (enabled = true).
Встановлення ПЗ — покроково
Схема: Встановлення ПЗ — покроково
У цьому розділі ми встановимо K3s на наш підготовлений VPS. Ми будемо використовувати останню стабільну версію K3s на 2026 рік, припускаючи, що це буде версія в діапазоні 1.31.x - 1.32.x, сумісна з Kubernetes 1.31.x - 1.32.x. Для зручності ми використовуємо офіційний інсталяційний скрипт.
1. Встановлення K3s сервера
K3s можна встановити однією командою. Скрипт автоматично завантажить бінарники, налаштує системні сервіси та запустить K3s. За замовчуванням K3s використовує контейнерний рушій containerd, який буде встановлено автоматично.
# Устанавливаем K3s сервер (предполагаем версию 1.31.x для 2026 года)
# Используем INSTALL_K3S_VERSION для фиксации версии, чтобы избежать автоматических обновлений до мажорных версий.
# INSTALL_K3S_EXEC="--disable traefik" отключает встроенный Traefik, так как мы будем использовать Caddy/Ingress.
# K3S_TOKEN - это токен, который будет использоваться для добавления агентов, если вы решите расширить кластер.
# Скопируйте его после установки.
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.31.5+k3s1" K3S_TOKEN="SUPERSECRETTOKEN12345" sh -s - --disable traefik
Ця команда встановить K3s, відключить вбудований Ingress-контролер Traefik (ми будемо використовувати інший), і запустить всі необхідні компоненти. Процес може зайняти кілька хвилин.
2. Перевірка статусу K3s
Після встановлення переконайтеся, що K3s запущено та працює коректно. K3s встановлюється як системний сервіс.
# Проверяем статус сервиса K3s
sudo systemctl status k3s
Ви повинні побачити статус active (running).
3. Налаштування змінної оточення KUBECONFIG
Для взаємодії з кластером Kubernetes (через kubectl) необхідно вказати шлях до файлу конфігурації. K3s розміщує його за адресою /etc/rancher/k3s/k3s.yaml.
# Создаём директорию для kubeconfig
mkdir -p ~/.kube/
# Копируем kubeconfig файл
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
# Устанавливаем правильные права доступа
sudo chmod 600 ~/.kube/config
# Настраиваем переменную окружения KUBECONFIG для текущей сессии
export KUBECONFIG=~/.kube/config
# Добавляем KUBECONFIG в .bashrc для постоянного использования
echo "export KUBECONFIG=~/.kube/config" >> ~/.bashrc
# Применяем изменения .bashrc
source ~/.bashrc
4. Встановлення kubectl
kubectl — це утиліта командного рядка для керування кластерами Kubernetes. K3s за замовчуванням не встановлює kubectl у PATH, тому його потрібно встановити окремо або створити символічне посилання.
Збережіть цей токен у безпечному місці. Він знадобиться для приєднання нових робочих нод до вашого K3s кластера.
Конфігурація
Схема: Конфігурація
Після встановлення K3s кластер готовий до роботи, але для публікації застосунків у зовнішній світ та забезпечення їхньої безпеки (HTTPS) знадобиться додаткове налаштування. Ми розгорнемо Ingress-контролер і налаштуємо автоматичне отримання TLS-сертифікатів за допомогою Caddy.
Хоча K3s за замовчуванням включає Traefik, ми його відключили, щоб мати більше контролю. Замість нього ми встановимо популярний Nginx Ingress Controller, який добре себе зарекомендував.
# Устанавливаем Nginx Ingress Controller через Helm
# Сначала добавляем репозиторий Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Устанавливаем Ingress Controller в namespace ingress-nginx
# Предполагаем версию 4.10.x для 2026 года
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080 \
--set controller.service.nodePorts.https=30443 \
--version 4.10.1
Ми використовуємо NodePort для публікації Ingress-контролера на портах 30080 (HTTP) та 30443 (HTTPS) на VPS. Це дозволить нам проксіювати трафік через Caddy.
Перевірте, що поди Ingress-контролера запущені:
# Проверяем поды Ingress-контроллера
kubectl get pods -n ingress-nginx
Переконайтеся, що всі поди в статусі Running.
2. Встановлення Caddy як Reverse Proxy та ACME-клієнта
Caddy — це потужний веб-сервер з автоматичним HTTPS. Ми будемо використовувати його як зовнішній reverse proxy, який прийматиме трафік з портів 80/443, автоматично отримуватиме та оновлюватиме TLS-сертифікати, а потім проксіюватиме запити на Ingress-контролер K3s.
Створіть файл конфігурації Caddy за шляхом /etc/caddy/Caddyfile:
# Создаём директорию для конфига Caddy
sudo mkdir -p /etc/caddy
# Открываем файл Caddyfile для редактирования
sudo nano /etc/caddy/Caddyfile
Вставте наступний вміст, замінивши your-domain.com на ваш домен:
# /etc/caddy/Caddyfile
{
email [email protected]
# Включаем логирование для отладки
log {
output file /var/log/caddy/caddy.log
level INFO
}
}
your-domain.com {
# Автоматический HTTPS
reverse_proxy localhost:30080 {
# Необходимо для корректной работы Ingress-контроллера
header_up Host {http.request.host}
header_up X-Real-IP {http.request.remote}
header_up X-Forwarded-For {http.request.remote}
header_up X-Forwarded-Proto {http.request.scheme}
}
}
Збережіть файл (Ctrl+X, Y, Enter).
Створіть директорію для логів Caddy:
# Создаём директорию для логов Caddy и устанавливаем права
sudo mkdir -p /var/log/caddy
sudo chown caddy:caddy /var/log/caddy
Встановіть Caddy. Ми будемо використовувати офіційний репозиторій для Ubuntu:
# Проверяем поды Nginx
kubectl get pods -l app=nginx
# Проверяем сервис Nginx
kubectl get service nginx-service
# Проверяем Ingress Nginx
kubectl get ingress nginx-ingress
Переконайтеся, що под Nginx запущений, сервіс та Ingress існують.
4. Перевірка працездатності
Тепер, коли все налаштовано, відкрийте ваш домен (https://your-domain.com) у браузері. Ви повинні побачити стандартну вітальну сторінку Nginx. Якщо ви бачите її, значить, K3s, Nginx Ingress Controller та Caddy працюють коректно, і HTTPS-сертифікат був автоматично випущений та встановлений.
Ви також можете використовувати curl для перевірки доступності:
# Проверяем HTTP-доступ
curl http://your-domain.com
# Проверяем HTTPS-доступ
curl -k https://your-domain.com # -k игнорирует проверку сертификата, если есть проблемы
Резервне копіювання та обслуговування
Схема: Резервне копіювання та обслуговування
Регулярне резервне копіювання та своєчасне обслуговування — запорука стабільності та безпеки вашого K3s кластера.
Що резервувати
Для K3s на одному вузлі, ключові дані для резервного копіювання:
Конфігурація K3s: Файли /etc/rancher/k3s/k3s.yaml та /var/lib/rancher/k3s/server/node-token.
Стан кластера (etcd): K3s використовує SQLite за замовчуванням, тому файл бази даних знаходиться за шляхом /var/lib/rancher/k3s/server/db/state.db. Якщо ви переналаштували K3s на використання зовнішнього etcd, вам потрібно резервувати etcd.
Дані додатків: Якщо ваші додатки використовують постійні томи (Persistent Volumes), переконайтеся, що їхні дані резервуються. Для K3s за замовчуванням використовується локальний провізіонер PV, що означає, що дані зберігаються на диску самого VPS. Шлях зазвичай /var/lib/rancher/k3s/storage/....
Ніколи не зберігайте резервні копії на тому ж сервері, який резервуєте. Розгляньте наступні варіанти:
Зовнішнє S3-сумісне сховище: Дешеве та надійне рішення (наприклад, Backblaze B2, DigitalOcean Spaces). Використовуйте s3cmd або rclone для завантаження.
Окремий VPS: Ви можете орендувати невеликий VPS лише для зберігання резервних копій та використовувати rsync з SSH-ключами для їх передачі.
NFS-шара: Якщо у вас є мережеве сховище.
Оновлення: rolling vs maintenance window
Для K3s на одному вузлі концепція "rolling update" непридатна, оскільки немає інших вузлів, на які можна перенести навантаження. Оновлення K3s завжди означатиме простій кластера на короткий час.
Оновлення K3s: Регулярно перевіряйте нові версії K3s (наприклад, кожні 3-6 місяців). Оновлення K3s здійснюється шляхом повторного запуску інсталяційного скрипта з новою версією або за допомогою утиліти k3s-upgrade.
# Приклад оновлення K3s до нової версії
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.32.0+k3s1" sh -s - --disable traefik
Це призведе до перезапуску K3s та короткочасного простою.
Оновлення ОС та пакетів: Регулярно оновлюйте операційну систему: sudo apt update && sudo apt upgrade -y. Плануйте ці оновлення в період низького трафіку, оскільки вони можуть вимагати перезавантаження сервера.
Оновлення додатків: Оновлюйте свої контейнерні образи та Helm-чарти. Kubernetes дозволяє робити це без простою, використовуючи rolling updates для Deployment'ів.
Завжди тестуйте оновлення на тестовому стенді, перш ніж застосовувати їх до продакшн-сервера.
Вирішення проблем + FAQ
У цьому розділі ми розглянемо типові проблеми, з якими можна зіткнутися при роботі з K3s, та дамо відповіді на часті запитання.
Не можу підключитися до кластера за допомогою kubectl
Що перевірити: Переконайтеся, що змінна оточення KUBECONFIG встановлена правильно (echo $KUBECONFIG має повернути /home/ваш_пользователь/.kube/config). Перевірте права на файл ~/.kube/config (мають бути 600). Переконайтеся, що K3s сервіс запущено (sudo systemctl status k3s) і файрвол (UFW) дозволяє порт 6443/tcp.
Як виправити: Перезапустіть K3s: sudo systemctl restart k3s. Перевірте логи K3s: sudo journalctl -u k3s --no-pager. Переконайтеся, що у файлі ~/.kube/config IP-адреса сервера вказана коректно.
Мій додаток недоступний через домен, Caddy видає помилку
Що перевірити: Перевірте DNS-запис для вашого домену (A-запис має вказувати на IP вашого VPS). Переконайтеся, що Caddy запущено (sudo systemctl status caddy) і його Caddyfile налаштовано правильно, вказуючи на localhost:30080. Перевірте логи Caddy (sudo journalctl -u caddy --no-pager) на предмет помилок з Let's Encrypt або проксіюванням. Переконайтеся, що Ingress-контролер запущено і його поди в статусі Running (kubectl get pods -n ingress-nginx).
Як виправити: Виправте DNS-записи. Перевірте синтаксис Caddyfile командою sudo caddy validate --config /etc/caddy/Caddyfile. Перезапустіть Caddy: sudo systemctl reload caddy. Переконайтеся, що ваш Ingress-ресурс у Kubernetes (kubectl get ingress) має правильний хост і посилається на існуючий сервіс та порт.
Поди додатків знаходяться в статусі Pending або CrashLoopBackOff
Що перевірити: Якщо под у статусі Pending, це часто означає нестачу ресурсів (CPU/RAM) або проблеми з Persistent Volume. Якщо CrashLoopBackOff, це означає, що додаток всередині контейнера постійно падає. Перевірте логи пода: kubectl logs <ім'я_пода> та опис пода: kubectl describe pod <ім'я_пода>.
Як виправити: Для Pending: збільште ресурси VPS або зменшіть запити ресурсів у маніфесті пода. Для CrashLoopBackOff: вивчіть логи додатка, можливо, проблема в його конфігурації, змінних оточення або відсутності необхідних залежностей.
Який VPS-конфіг мінімально підійде?
Для K3s без важких додатків достатньо 1 CPU ядра, 1 ГБ RAM та 20-30 ГБ SSD. Цього вистачить для запуску самого K3s та кількох дуже легких сервісів. Однак, якщо ви плануєте запускати реальні веб-додатки або бази даних, рекомендується мінімум 2 CPU ядра, 4 ГБ RAM та 50 ГБ SSD для комфортної роботи та можливості масштабування.
Що обрати — VPS чи dedicated для цього завдання?
Для розгортання K3s на одному вузлі для більшості особистих проектів, стартапів або тестових середовищ VPS є оптимальним вибором за співвідношенням ціна/продуктивність. Dedicated-сервери виправдані, коли потрібна максимальна продуктивність, гарантовані ресурси, дуже великий обсяг дискового простору або якщо ви плануєте запускати безліч ресурсоємних кластерів/додатків, де VPS вже не справляється з навантаженням або обмеженнями по CPU/RAM/IOPS.
K3s не запускається після перезавантаження сервера
Що перевірити: Переконайтеся, що сервіс K3s увімкнено для автозапуску: sudo systemctl is-enabled k3s. Якщо його не увімкнено, виконайте sudo systemctl enable k3s. Перевірте логи сервісу: sudo journalctl -u k3s --no-pager.
Як виправити: Якщо в логах є помилки, пов'язані з файрволом або мережею, переконайтеся, що UFW дозволяє всі необхідні порти, а мережеві інтерфейси підняті. Якщо це помилка бази даних, можливо, пошкоджено файл /var/lib/rancher/k3s/server/db/state.db. У такому випадку може знадобитися відновлення з резервної копії.
Як оновити K3s до нової версії?
Що перевірити: Перед оновленням обов'язково зробіть резервну копію кластера. Перевірте офіційну документацію K3s на предмет змін у новій версії, які можуть вплинути на ваші додатки або конфігурацію.
Як виправити: Оновлення K3s на одному вузлі виконується шляхом повторного запуску інсталяційного скрипта із зазначенням нової версії: curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="vX.Y.Z+k3s1" sh -. Це автоматично завантажить нову версію, оновить бінарники та перезапустить K3s. Ваші додатки тимчасово будуть недоступні під час оновлення K3s.
Висновки та наступні кроки
Схема: Висновки та наступні кроки
Вітаємо! Ви успішно розгорнули легковажний Kubernetes кластер K3s на своєму VPS, налаштували Ingress-контролер з автоматичним HTTPS та опублікували перший додаток. Тепер у вас є потужна та гнучка платформа для хостингу ваших контейнеризованих додатків, керована декларативно та з мінімальними накладними витратами.
Куди рухатися далі?
Моніторинг та логування: Встановіть системи моніторингу, такі як Prometheus та Grafana, а також централізоване логування (наприклад, Loki або ELK стек) для відстеження стану кластера та додатків.
Керування секретами: Вивчіть інструменти для безпечного зберігання та керування секретами в Kubernetes (наприклад, HashiCorp Vault, Sealed Secrets) замість використання змінних оточення або файлів.
Масштабування та відмовостійкість: Якщо ваш проект зросте, розгляньте можливість додавання додаткових робочих нод K3s або міграцію на повноцінний багатоузловий Kubernetes кластер для підвищення відмовостійкості та продуктивності.