Подготовка системы

Перед установкой Kubernetes нужна чистая, правильно настроенная операционная система. Эта инструкция проведёт вас от пустого диска до готового сервера: установим Debian 12 или Ubuntu Server, настроим SSH с ключами, статический IP и отключим swap.

Содержание

Запись образа на флешку

Шаг 1. Скачайте образ

Нужен установочный образ одной из двух систем (выберите одну — обе подходят):

Берите 64-битную версию (amd64) — она подходит для любого современного сервера и ПК, даже с процессором Intel (amd64 — историческое название архитектуры x86-64).

Шаг 2. Запишите образ на флешку

Флешка от 4 ГБ. Два удобных инструмента под Windows:

Внимание Запись образа полностью сотрёт содержимое флешки. Проверьте, что выбрали в программе именно флешку, а не внешний диск с данными.

Шаг 3. Загрузитесь с флешки

Вставьте флешку в будущий сервер, включите его и откройте загрузочное меню (обычно клавиши F8, F11, F12 или Esc при старте — зависит от платы). Выберите флешку. Если сервер отказывается грузиться с флешки, проверьте в BIOS/UEFI, что включён режим UEFI и отключён Secure Boot (китайские платы на X99 иногда капризничают с Secure Boot).

Установка системы

Шаг 4. Пройдите установщик

Установщики Debian и Ubuntu Server различаются внешне, но спрашивают одно и то же. Вот рекомендуемые ответы для сервера под кластер:

Шаг 5. Перезагрузитесь и войдите

После установки вытащите флешку, сервер перезагрузится, и вы увидите приглашение входа в текстовой консоли. Войдите под созданным пользователем. Дальше вся работа ведётся через SSH с вашего основного компьютера — серверу больше не нужны ни монитор, ни клавиатура.

Первичная настройка

Шаг 6. Обновите систему

Первым делом приводим систему в актуальное состояние. Команды одинаковы для Debian и Ubuntu:

# обновить списки пакетов и сами пакеты
sudo apt update
sudo apt upgrade -y

Если обновилось ядро (в списке был linux-image), перезагрузите сервер:

sudo reboot

Шаг 7. Убедитесь, что sudo работает

В Ubuntu пользователь, созданный при установке, уже входит в группу sudo. В Debian — не всегда. Проверьте:

sudo whoami
# ожидаемый ответ: root

Если sudo ругается, что пользователя нет в sudoers, войдите под root (в Debian: su - с паролем root) и добавьте пользователя в группу:

# выполняется под root; ivan — замените на своё имя пользователя
usermod -aG sudo ivan

Перелогиньтесь, чтобы группа применилась.

Создание пользователя

Если пользователь уже создан при установке — этот раздел можно пропустить. Но полезно знать, как добавить ещё одного, например отдельного для кластера или для члена семьи:

Шаг 8. Создайте пользователя (при необходимости)

# создать пользователя с домашним каталогом и bash
sudo adduser ivan

# дать права sudo
sudo usermod -aG sudo ivan

adduser интерактивно спросит пароль и необязательные данные (их можно пропустить Enter'ом).

SSH-ключи

Ходить на сервер по паролю — и неудобно, и небезопасно. Настроим вход по ключу: у вас на компьютере будет закрытый ключ, а на сервере — открытая часть.

Шаг 9. Создайте ключ на вашем компьютере

На вашем рабочем компьютере (Windows с PowerShell, Linux или macOS — команда одна и та же):

# создать пару ключей ed25519
ssh-keygen -t ed25519 -C "ivan@home"

На все вопросы можно отвечать Enter — ключ сохранится в стандартное место (~/.ssh/id_ed25519, в Windows — C:\Users\Имя\.ssh\id_ed25519). Парольную фразу (passphrase) для домашнего использования можно оставить пустой, хотя с ней безопаснее.

Шаг 10. Скопируйте открытый ключ на сервер

Из Linux/macOS это делается одной командой:

# ivan — пользователь на сервере, 192.168.1.50 — адрес сервера
ssh-copy-id ivan@192.168.1.50

В Windows в PowerShell ssh-copy-id обычно нет, поэтому копируем вручную одной строкой:

# Windows PowerShell: показать открытый ключ и передать его на сервер
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ivan@192.168.1.50 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Команда спросит пароль пользователя на сервере (в последний раз!).

Шаг 11. Проверьте вход по ключу

ssh ivan@192.168.1.50
# должно пустить без пароля
Совет Не отключайте вход по паролю, пока не убедитесь, что вход по ключу работает. Когда убедитесь — можно ужесточить: в файле /etc/ssh/sshd_config выставить PasswordAuthentication no и перезапустить службу командой sudo systemctl restart ssh.

Статический IP-адрес

Узлы кластера должны жить на постоянных адресах. Есть два способа этого добиться: привязка адреса в настройках роутера (по MAC-адресу, обычно называется «резервирование DHCP») или статическая настройка на самом сервере. Разберём второй путь — он не зависит от роутера.

Сначала узнайте имя сетевого интерфейса и текущий адрес:

ip -4 addr show
# типичные имена интерфейсов: enp3s0, eth0, eno1
ip route | grep default
# покажет адрес роутера (шлюз), например 192.168.1.1

Вариант А: Debian 12 (/etc/network/interfaces)

Шаг 12а. Настройте статический IP в Debian

Откройте файл конфигурации сети:

sudo nano /etc/network/interfaces

Найдите блок вашего интерфейса с dhcp и замените на статический (пример для сети 192.168.1.0/24, сервер получит 192.168.1.50):

# было: allow-hotplug enp3s0 / iface enp3s0 inet dhcp
auto enp3s0
iface enp3s0 inet static
    address 192.168.1.50/24
    gateway 192.168.1.1
    dns-nameservers 192.168.1.1 1.1.1.1

Примените настройки перезапуском сети:

sudo systemctl restart networking

Вариант Б: Ubuntu Server (netplan)

Шаг 12б. Настройте статический IP в Ubuntu

Конфигурация сети в Ubuntu Server живёт в YAML-файлах каталога /etc/netplan/. Посмотрите, какой файл там есть:

ls /etc/netplan/
# например: 00-installer-config.yaml
sudo nano /etc/netplan/00-installer-config.yaml

Приведите его к такому виду (отступы в YAML делаются пробелами, будьте аккуратны):

network:
  version: 2
  ethernets:
    enp3s0:
      dhcp4: false
      addresses: [192.168.1.50/24]
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1, 1.1.1.1]

Примените:

sudo netplan apply
Внимание После смены IP ваше SSH-соединение разорвётся — это нормально. Переподключитесь уже на новый адрес. И убедитесь, что выбранный адрес не выдаётся роутером по DHCP другим устройствам (зарезервируйте его в роутере или возьмите адрес за пределами DHCP-диапазона).

Шаг 13. Пропишите hostname в /etc/hosts

Чтобы сервер знал своё имя локально (Kubernetes это любит):

sudo nano /etc/hosts

Должна быть строка с адресом сервера и его именем:

127.0.0.1       localhost
192.168.1.50    k8s-node1

Отключение swap

Kubernetes не работает со включённым файлом подкачки: kubelet при старте проверяет swap и отказывается запускаться. Это осознанное требование — планировщик должен точно знать, сколько реальной памяти есть на узле. Отключаем swap полностью.

Шаг 14. Отключите swap сейчас

# отключить немедленно
sudo swapoff -a

# проверить: строка Swap должна быть с нулями
free -h

Шаг 15. Отключите swap навсегда

Swap прописан в файле /etc/fstab — его строка начнётся снова после перезагрузки. Закомментируйте её:

sudo nano /etc/fstab

Найдите строку, где в третьей колонке стоит swap, и поставьте в её начало символ #:

# было:
# /dev/mapper/debian--vg-swap_1 none swap sw 0 0
# стало (строка закомментирована):
#/dev/mapper/debian--vg-swap_1 none swap sw 0 0

Проверка после перезагрузки (можно выполнить позже):

swapon --show
# пустой вывод — swap отключён

Часовой пояс и синхронизация времени

Точное время на всех узлах — не формальность: TLS-сертификаты кластера имеют сроки действия, etcd чувствительна к расхождению часов, а логи с разным временем на разных узлах отлаживать мучительно.

Шаг 15. Настройте часовой пояс

# список часовых поясов: timedatectl list-timezones | grep Europe
sudo timedatectl set-timezone Europe/Moscow

# проверка
timedatectl

Шаг 16. Включите синхронизацию времени

В Debian 12 и Ubuntu 24.04 служба systemd-timesyncd обычно уже активна. Проверьте:

timedatectl status
# ищем: System clock synchronized: yes

# если нет — включить:
sudo timedatectl set-ntp true

Если сервер за строгим файрволом и NTP наружу закрыт, укажите локальный источник времени (многие роутеры умеют быть NTP-сервером) в /etc/systemd/timesyncd.conf.

Нужные пакеты

Шаг 17. Установите базовый набор

Эти утилиты пригодятся и при установке кластера, и в повседневной работе:

sudo apt install -y curl wget git htop iotop net-tools dnsutils \
  apt-transport-https ca-certificates gnupg lsb-release

Что здесь зачем:

Шаг 18. Включите нужные модули ядра

Контейнерной сети нужны модули overlay и br_netfilter. Включим их и сделаем загружаемыми при старте:

# загрузить модули сейчас
sudo modprobe overlay
sudo modprobe br_netfilter

# прописать в автозагрузку
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

И настроим параметры ядра, необходимые для маршрутизации трафика подов:

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# применить без перезагрузки
sudo sysctl --system

Шаг 19. Финальная проверка

Убедитесь, что всё готово к установке кластера:

# статический IP на месте?
ip -4 addr show

# интернет доступен?
ping -c 3 debian.org

# swap выключен?
swapon --show

# модули загружены?
lsmod | grep -E "overlay|br_netfilter"
Что дальше Система готова. Переходите к самому интересному — инструкции «Установка», где поднимем кластер k3s одной командой (и разберём классический путь kubeadm для желающих).
Несколько узлов? Если планируете кластер из нескольких машин, повторите всю инструкцию на каждой: у каждой свой hostname (k8s-node2, k8s-node3…) и свой статический IP (192.168.1.51, 192.168.1.52…). Удобно прописать имена всех узлов в /etc/hosts на каждой машине.