K3s: установка лёгкого Kubernetes на VPS за 30 секунд

Администрирование
K3s: установка лёгкого Kubernetes на VPS за 30 секунд

Установка K3s — самый короткий путь к настоящему Kubernetes на VPS: одна команда, 30–60 секунд, и у вас работающий кластер на единственном сервере. K3s — это сертифицированный CNCF дистрибутив Kubernetes от SUSE (изначально Rancher Labs), упакованный в один бинарник размером около 70 МБ. Он создавался для edge-устройств и небольших инсталляций, поэтому идеально ложится на одиночный VPS: без ритуалов с kubeadm, без отдельного etcd, со встроенным Ingress-контроллером. В статье установим K3s на Ubuntu 24.04, честно посчитаем ресурсы и задеплоим первое приложение — от манифеста до проверки в браузере.

Что такое K3s и чем он отличается от «большого» Kubernetes

Полноценный кластер Kubernetes — это набор компонентов (API-сервер, etcd, scheduler, controller-manager, kubelet, container runtime), каждый из которых нужно установить, связать сертификатами и обслуживать. K3s собирает всё это в один процесс и агрессивно упрощает:

  • SQLite вместо etcd по умолчанию — для одного узла этого достаточно (etcd можно включить при расширении);
  • containerd встроен — отдельный Docker не нужен;
  • Traefik в комплекте — Ingress-контроллер работает из коробки;
  • ServiceLB — простой балансировщик, который публикует сервисы на IP самого узла;
  • вырезаны легаси-драйверы и облачные провайдеры, которые на VPS не нужны.

При этом API полностью совместим: те же манифесты, тот же kubectl, те же Helm-чарты. Всё, чему вы научитесь на K3s, работает в любом «взрослом» кластере — поэтому K3s так популярен для обучения и pet-проектов. Если вы ещё не работали с контейнерами, начните со статей про Docker на VPS и Docker Compose — понимание образов и контейнеров сильно упростит знакомство с Kubernetes.

Требования к серверу: честно про RAM

Маркетинг K3s говорит «512 МБ достаточно», и формально пустой кластер действительно стартует. Но правда для практики другая: сам K3s с системными подами съедает около 1 ГБ, а дальше начинаются ваши приложения, Ingress, cert-manager, мониторинг. Реалистичная таблица:

СценарийRAMПодходящий тариф Cheap-Host
Попробовать K3s, 1–2 тестовых подаот 4 ГБStart (8 ГБ, 450 ₽/мес) — с запасом
Pet-проекты, staging, несколько приложений с базой8–16 ГБPro (16 ГБ, 750 ₽/мес) — разумный минимум для работы
Рабочие нагрузки, мониторинг, CI-раннеры16–32 ГБUltra (32 ГБ, 1500 ₽/мес) — комфортно

Итого: отправная точка — от 4 ГБ RAM, для рабочих задач берите минимум Pro, а комфортно K3s живёт на Ultra — 20 vCPU и 32 ГБ RAM позволяют не думать о вытеснении подов. Важна и дисковая подсистема: Kubernetes постоянно пишет состояние и тянет образы, поэтому NVMe-диски (они стоят во всех тарифах Cheap-Host) заметно ускоряют и запуск подов, и работу SQLite-базы кластера. Подробнее о расчёте памяти под задачи — в статье сколько RAM нужно серверу.

Установка K3s одной командой

На свежем VPS с Ubuntu 24.04 обновите систему и запустите официальный установщик:

sudo apt update && sudo apt upgrade -y
curl -sfL https://get.k3s.io | sh -

Скрипт скачает бинарник, создаст systemd-службу k3s с автозапуском и стартует кластер. Через 30–60 секунд проверяем:

sudo k3s kubectl get node

Ожидаемый вывод — ваш сервер в статусе Ready:

NAME    STATUS   ROLES                  AGE   VERSION
myvps   Ready    control-plane,master   40s   v1.33.3+k3s1

Чтобы не писать sudo k3s kubectl каждый раз, настройте обычный kubectl для своего пользователя:

mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
source ~/.bashrc
kubectl get pods -A

Последняя команда покажет системные поды: coredns, traefik, metrics-server, local-path-provisioner. Все в статусе Running — кластер готов. Не забудьте про файрвол: наружу достаточно открыть 80, 443 и ваш SSH-порт; порт API 6443 открывайте только если планируете управлять кластером с локальной машины.

Деплой первого приложения

Задеплоим веб-приложение по канону Kubernetes: Deployment (управляет подами), Service (внутренний адрес) и Ingress (маршрутизация снаружи через встроенный Traefik). Создайте файл app.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo-web
  template:
    metadata:
      labels:
        app: demo-web
    spec:
      containers:
        - name: web
          image: nginx:1.27-alpine
          ports:
            - containerPort: 80
          resources:
            requests:
              memory: "64Mi"
              cpu: "50m"
            limits:
              memory: "128Mi"
              cpu: "250m"
---
apiVersion: v1
kind: Service
metadata:
  name: demo-web
spec:
  selector:
    app: demo-web
  ports:
    - port: 80
      targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-web
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: demo-web
                port:
                  number: 80

Применяем и наблюдаем:

kubectl apply -f app.yaml
kubectl get pods
kubectl get ingress

Через несколько секунд оба пода будут Running, и по адресу http://IP_СЕРВЕРА откроется страница nginx — Traefik принял запрос на 80-м порту и направил его в поды. Вместо nginx подставьте свой образ — и это уже настоящий деплой вашего приложения.

Что вы получили по сравнению с ручным запуском контейнеров:

  • самовосстановление — убейте под (kubectl delete pod имя), и Deployment тут же создаст новый;
  • масштабирование одной командойkubectl scale deployment demo-web --replicas=4;
  • rolling-обновленияkubectl set image deployment/demo-web web=nginx:1.28-alpine обновит поды по одному, без даунтайма;
  • лимиты ресурсов — блок resources не даёт одному приложению съесть весь сервер.

Что поставить следом: полезный минимум

  • Helm — пакетный менеджер Kubernetes: curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash. Тысячи готовых чартов — от PostgreSQL до Grafana;
  • cert-manager — автоматические TLS-сертификаты Let's Encrypt для ваших Ingress;
  • k9s — консольный интерфейс для кластера, сильно ускоряет повседневную работу;
  • локальные тома — встроенный local-path-provisioner создаёт PersistentVolume на диске сервера: для одиночного узла этого достаточно.

K3s также удобен как площадка для self-hosted CI: например, раннеры для собственного GitLab хорошо живут в кластере и масштабируются под нагрузку.

Ограничения одного узла: о чём помнить

Честность требует сказать: кластер из одного VPS — это не про отказоустойчивость. Упал сервер — упало всё, никакой магии Kubernetes здесь не спасёт. Один узел стоит выбирать для обучения, staging, внутренних инструментов и pet-проектов; для продакшена со строгим SLA нужны минимум три узла. Хорошая новость — K3s изначально рассчитан на рост: токен из /var/lib/rancher/k3s/server/node-token позволяет присоединять новые серверы командой:

curl -sfL https://get.k3s.io | K3S_URL=https://IP_ПЕРВОГО:6443 \
  K3S_TOKEN=ВАШ_ТОКЕН sh -

А пока узел один, подстрахуйтесь бэкапами: снапшот состояния кластера лежит в /var/lib/rancher/k3s/server/db/, манифесты храните в git. У Cheap-Host при этом можно апгрейдить CPU/RAM/диск без потери данных — если кластер упёрся в ресурсы, переход со Start на Pro или Ultra не потребует переустановки.

FAQ

Сколько RAM реально нужно для K3s?

Пустой кластер — около 1 ГБ, но с приложениями и Ingress закладывайте от 4 ГБ. Для рабочих нагрузок разумный минимум — 16 ГБ (тариф Pro), комфортно — 32 ГБ (Ultra).

Чем K3s отличается от полного Kubernetes?

Один бинарник ~70 МБ: SQLite вместо etcd, встроенные containerd и Traefik, вырезаны облачные и легаси-компоненты. API полностью совместим — манифесты и kubectl те же.

Есть ли смысл в Kubernetes на одном сервере?

Для обучения, staging и pet-проектов — да: декларативные деплои, самовосстановление, опыт с настоящим API. Для продакшена с жёстким SLA — нет: один узел остаётся единой точкой отказа.

Можно ли потом добавить узлы в кластер?

Да: возьмите токен с первого сервера и запустите установщик на новом VPS с переменными K3S_URL и K3S_TOKEN — узел присоединится как agent.

K3s или Docker Compose для одного VPS?

Compose проще и легче, если нужно просто запустить несколько контейнеров. K3s выбирают ради экосистемы Kubernetes: Helm, декларативные манифесты, масштабирование — и ради переносимого опыта.

Вывод

K3s снимает главный барьер входа в Kubernetes — сложность установки: одна команда, минута ожидания, и у вас кластер с Ingress и метриками из коробки. Дальше — обычный kubectl, манифесты и вся экосистема. Главное — не экономить на памяти: от 4 ГБ RAM для знакомства, тариф Pro (16 ГБ) как рабочий минимум и Ultra (32 ГБ, 20 vCPU, 192 ГБ NVMe за 1500 ₽/мес) для комфортной работы с реальными нагрузками. У Cheap-Host такой сервер разворачивается за 45–60 секунд — KVM, полный root, безлимитный трафик. Тарифы — на cheap-host.onl.

Читайте также