Подготовка Debian VPS для k0s: sysctl, модули ядра и установка

Published: 2026-04-05

Всё начинается с чистого образа Debian 12 Minimal. Скрипт 01-prepare-vm.sh превращает его в хост, готовый к k0s, примерно за 10 минут.


Swap

bashswapoff -a
sed -i '/\sswap\s/d' /etc/fstab

Планировщик Kubernetes считает лимиты памяти жёсткими. При включённом swap под, исчерпавший память, может уйти в своп вместо завершения — это вызывает непредсказуемые всплески задержек и делает учёт ресурсов бессмысленным. k0s предупреждает при запуске, если swap включён.


Тюнинг sysctl

Записывается в /etc/sysctl.d/99-k0s.conf:

# Обязательно для сетевого стека Kubernetes
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

# Для strongSwan IKEv2 VPN
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_no_pmtu_disc = 1

# Производительность
net.core.somaxconn = 32768
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

Без ip_forward поды не смогут выходить в интернет. Без bridge-nf-call-iptables правила iptables kube-proxy не будут срабатывать для мостового трафика (pod-to-pod).

Лимиты inotify важны для k0s: контроллер следит за большим количеством файлов и ConfigMap. Стандартный лимит Linux (8192) приводит к незаметным сбоям на нагруженных кластерах.

Применить:

bashsysctl --system

Модули ядра

Загружаются при старте через /etc/modules-load.d/k0s.conf:

br_netfilter
overlay
ip_tables
iptable_nat
iptable_filter
nf_conntrack
  • br_netfilter — позволяет iptables видеть мостовой трафик
  • overlay — нужен для overlayfs в containerd
  • ip_tables, iptable_nat, iptable_filter — зависимости kube-proxy
  • nf_conntrack — отслеживание соединений для NAT

Без overlay containerd упадёт или перейдёт на более медленный драйвер.

Загрузить немедленно:

bashmodprobe br_netfilter overlay ip_tables iptable_nat iptable_filter nf_conntrack

Системные пакеты

bashapt-get install -y \
  curl wget gnupg2 ca-certificates \
  iptables ipset \
  nftables \
  socat \
  conntrack \
  ipvsadm

ipvsadm — для IPVS-режима (если используется). conntrack — утилита для netfilter.


Установка k0s

bashcurl -sSLf https://get.k0s.sh | sh
k0s install controller --single

--single — нода запускает и контроллер, и воркер. k0s устанавливается как systemd-сервис k0scontroller и запускает etcd, API-сервер и kubelet в одном дереве процессов.

Сохранить публичный IP для следующих скриптов:

bashcurl -s https://api.ipify.org > /root/.k0s_public_ip

Запустить:

bashsystemctl start k0scontroller
systemctl enable k0scontroller

Доступ к kubectl

bashk0s kubectl config view --raw > /root/.kube/config
chmod 600 /root/.kube/config

С этого момента kubectl и helm работают в штатном режиме. Последующие скрипты используют k0s kubectl (встроенный kubectl) — чтобы не требовать отдельной установки kubectl на сервере.


Проверка готовности кластера

bashk0s status
kubectl get nodes
kubectl get pods -A

Ожидаемый результат: нода в состоянии Ready, системные поды в Running через 2–3 минуты.


Частые проблемы

Нода остаётся в NotReady: проверить k0s status и journalctl -u k0scontroller -f. Частая причина — не загружен модуль br_netfilter.

Поды зависли в ContainerCreating: отсутствует модуль overlay. Выполнить modprobe overlay и перезапустить containerd.

Ошибки inotify в логах: увеличить fs.inotify.max_user_watches до 1048576 для больших кластеров.