k3s: лёгкий Kubernetes на VPS
k3s — сертифицированный дистрибутив Kubernetes весом меньше 100 МБ. Он ставится одной командой и отлично живёт на одном VPS. Развернём кластер, задеплоим приложение и откроем его через встроенный Ingress.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему k3s, а не ванильный Kubernetes
Полноценный Kubernetes требователен: несколько компонентов control-plane, etcd, минимум пара гигабайт RAM только под систему. k3s от Rancher собирает всё в один бинарник, заменяет etcd на SQLite и включает Traefik как Ingress «из коробки».
- Один бинарник, старт за секунды.
- SQLite вместо etcd для single-node — меньше накладных расходов.
- Встроенные Traefik, local-path storage и servicelb.
- Полная совместимость с kubectl и Helm.
Минимум для комфортной работы — 2 ГБ RAM, лучше 4. На тарифах MAATRIX с AMD EPYC + NVMe control-plane отвечает быстро, а local-path тома пишутся на NVMe без просадок. etcd (когда вы перейдёте на HA) особенно чувствителен к задержкам диска, и медленный HDD там становится узким местом всего кластера.
k3s удобен и как учебный полигон: вы получаете настоящий Kubernetes API за минуту и можете отрабатывать манифесты, Helm-чарты и Ingress ровно так, как они будут работать в большом кластере, но за деньги одного VPS.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для KubernetesУстановка кластера
Ставим k3s одной командой. Скрипт скачает бинарник, создаст systemd-сервис k3s и запустит его.
curl -sfL https://get.k3s.io | sh -
sudo systemctl status k3s
sudo kubectl get nodes
Через минуту нода должна быть в состоянии Ready. kubeconfig лежит в /etc/rancher/k3s/k3s.yaml — скопируйте его на свою машину, заменив 127.0.0.1 на публичный IP сервера, чтобы работать с кластером локально.
sudo cat /etc/rancher/k3s/k3s.yaml
# на локальной машине правим server: https://<VPS_IP>:6443
Деплой приложения
Опишем Deployment и Service. Сохраните в app.yaml и примените через kubectl.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels: { app: web }
template:
metadata:
labels: { app: web }
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector: { app: web }
ports:
- port: 80
targetPort: 80
kubectl apply -f app.yaml
kubectl get pods
kubectl get svc
Здесь replicas: 2 держит два экземпляра nginx: если один под упадёт, второй продолжит обслуживать трафик, а k3s поднимет замену упавшему. Selector по метке app: web связывает Service с подами — Service стабилен по имени, а поды за ним могут пересоздаваться сколько угодно.
Проверить, что приложение отвечает изнутри кластера, можно временным подом:
kubectl run tmp --rm -it --image=curlimages/curl -- \
curl -s http://web/
Ingress через Traefik
Traefik уже установлен, поэтому достаточно описать Ingress-ресурс. Он направит трафик с домена на сервис web.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
kubectl apply -f ingress.yaml
kubectl get ingress
Направьте A-запись домена на IP VPS — и приложение откроется по app.example.com. Для HTTPS добавьте cert-manager или используйте встроенный ACME-резолвер Traefik. В большинстве случаев cert-manager с ClusterIssuer для Let's Encrypt — самый чистый путь: сертификаты выпускаются и продлеваются автоматически, а вам достаточно указать аннотацию на Ingress.
Полезная привычка — следить за событиями кластера при выкате. Команда kubectl get events --sort-by=.lastTimestamp показывает, что происходит с подами в реальном времени: скачивание образа, провал healthcheck, нехватку ресурсов. Это первое место, куда стоит смотреть, если под не переходит в Ready.
Частые ошибки
- kubectl требует sudo — kubeconfig принадлежит root. Экспортируйте
KUBECONFIG=/etc/rancher/k3s/k3s.yamlили скопируйте в~/.kube/configс правкой прав. - Под в CrashLoopBackOff — смотрите
kubectl logs <pod>иkubectl describe pod <pod>. - Ingress не отвечает — не проброшены порты 80/443 или домен указывает не на тот IP.
- Нехватка RAM — на 1 ГБ k3s душит поды по OOM. Берите минимум 2 ГБ.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для KubernetesОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
k3s — это настоящий Kubernetes?
Да, k3s сертифицирован CNCF как соответствующий дистрибутив Kubernetes. Манифесты, kubectl и Helm работают без изменений.
Можно добавить вторую ноду?
Да. Установите k3s-agent на втором VPS с указанием URL сервера и node-token — нода присоединится к кластеру.
Чем заменить SQLite для HA?
Для отказоустойчивости запускают embedded etcd на трёх нодах или внешнюю БД. Для одного VPS SQLite достаточно.