Блог-шпаргалка

Картинка

Кластер k8s

Категория -> linux
Обновлено: 2026-05-13

Предлагаю не душнить с описанием того, что такое kubernetes. Раз ты сюда пришёл, значит уже знаешь что это и скорее всего docker'a тебе стало мало

Данное пособие ни в коем случае не претендует на 100% мануал howto. Данное пособие, как и все статьи на этом сайте - это шпаргалка "как делал я и у меня это получилось"

Поехали.

Для организации не просто minikube, а реального кластера k8s и возможной реализации его в боевых условиях, были использованы виртуальные машины, обладающие следующими характеристиками:
CPU - 2 Core
RAM - 4 Gb
HDD - 20 Gb
NET - 10.0.0.0/24

Хостнеймы:
k8s-master
k8s-wn01, k8s-wn02, k8s-wn03

Перед выполнением работ необходимо отключить swap в /etc/fstab

Все действия выполняются от привилегированного пользователя root

Следующую последовательность необходимо выполнить на всех нодах

cat <<EOF | tee /etc/hosts
127.0.0.1 localhost
10.0.0.10 k8s-master
10.0.0.11 k8s-wn01
10.0.0.12 k8s-wn02
10.0.0.13 k8s-wn03
EOF

Добавляем необходимые модули ядра в автозапуск

cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

И загружаем их

modprobe overlay && modprobe br_netfilter

Подправим возможность контроля обработки трафика через bridge в netfilter

cat <<EOF | 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

Применим изменения

sysctl --system

Установим среду выполнения контейнеров

apt update
apt install -y containerd

С containerd поставляется урезанная версия конфига. Давайте сгенерируем необходимую

containerd config default | tee /etc/containerd/config.toml

Для стабильной работы движка необходимо включить SystemdCgroup. Давайте выебнемся и сделаем это sed’ом 😎

sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

Ещё, в сгенерированном конфиге, пути расположения бинарников указаны в /usr/lib/cni, а сам движок, с бинарниками ставится в /opt/cni/bin, поэтому тут, для правильной работы, тоже необходимо внеси изменения. Давайте это сделаем тоже sed’ом

sed -i 's/bin_dir = "\/usr\/lib\/cni"/bin_dir = "\/opt\/cni\/bin"/' /etc/containerd/config.toml

И опять же в нашем сгенерированном конфиге не всё гладко. Версия рантайма указана 3.8, а kubeadm ждёт, что ему скормят 3.10.2. Исправим!

sed -i 's/sandbox_image = "registry.k8s.io\/pause:3.8"/sandbox_image = "registry.k8s.io\/pause:3.10.2"/' /etc/containerd/config.toml

Ну и для применения изменений рестартанём движок

systemctl restart containerd

Теперь устанавливаем kubernetes и компоненты, предварительно выяснив актуальную версию

apt install -y apt-transport-https ca-certificates curl gpg

Добавим ключ цифровой подписи. Обратите внимание, я взял версию из Release history и подставил туда, где выделил жёлтым. На момент написания статьи, она была самой актуальной.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

Создадим файл репозитория

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list

Обновляем кэш пакетов

apt update

ну и ставим заветное

apt install -y kubelet kubeadm kubectl

Для понимания
kubelet - контролирует работу подов и управляет ими
kubeadm - управление кластером kubernetes
kubectl - утилита для ввода команд

Установка завершена! Для просмотра версии скомандуем

kubectl version --client --output=yaml

Инициализация кластера

Следующую последовательность необходимо выполнить только на мастере

kubeadm init --pod-network-cidr=10.244.0.0/16

На какое-то время покажется, что сервер подвис. Надо будет подождать, пока не побегут букафффки и в конце появится Your Kubernetes control-plane has initialized successfully!

Выгрузим переменную KUBECONFIG в /etc/kubernetes/admin.conf

export KUBECONFIG=/etc/kubernetes/admin.conf

Смотрим, что у нас вообще получилось

kubectl get nodes
NAME         STATUS     ROLES           AGE    VERSION
k8s-master   NotReady   control-plane   2m3s   v1.36.1

Отлично! Судя по столбику ROLES считаем, что мастер развёрнут, но статус NotReady свидетельствует тому, что нам, для полноты картины минимального окружения, нехватает инструмента для настройки сетевых интерфейсов - CNI. У большинства на устах - это Calico, так давайте не будем выёбываться с другими и установим его

И -> снова выясним <- какая версия на сегодняшний день актуальная, подставим необходимы цифры в выделенное место и скомандуем

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml

Спустя пару минут можно убедиться

kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   29m   v1.36.1

что статус сменился на Ready и на данном этапе у нас полностью настроенный мастер. Переходим к нодам. Сгенерируем токен для присоединения нод

kubeadm token create --print-join-command

Должна появиться строчка типа

kubeadm join 10.0.0.10:6443 --token dlp1w2.jxvny6z5wivmygiz --discovery-token-ca-cert-hash sha256:831135df3cb9cf8813f66f05c319d7cb3559fed0769c539cb47c32a11b0b28b9

Вводим её на всех вводимых в кластер нодах

Снова побегут букафффки по экрану и в самом конце мы должны будем увидеть строку

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Буквально сразу, на мастере, по знакомой нам уже команде kubectl get nodes увидим, что список пополнился

kubectl get nodes
NAME         STATUS     ROLES           AGE     VERSION
k8s-master   Ready      control-plane   124m    v1.36.1
k8s-wn01     Ready                5m13s   v1.36.1
k8s-wn02     NotReady             1s      v1.36.1
k8s-wn03     NotReady             1s      v1.36.1

Ждём пару минут, чтоб статус всех нод перешёл в Ready

Для просмотра более детальной информации, можно добавить ключ -o с параметром wide

kubectl get nodes -o wide
NAME         STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION                  CONTAINER-RUNTIME
k8s-master   Ready    control-plane   3d20h   v1.36.1   10.0.0.10             Debian GNU/Linux 13 (trixie)   6.12.90+deb13.1-amd64 (amd64)   containerd://1.7.24
k8s-wn01     Ready              3d19h   v1.36.1   10.0.0.11           Debian GNU/Linux 13 (trixie)   6.12.90+deb13.1-amd64 (amd64)   containerd://1.7.24
k8s-wn02     Ready              3d19h   v1.36.1   10.0.0.12           Debian GNU/Linux 13 (trixie)   6.12.90+deb13.1-amd64 (amd64)   containerd://1.7.24
k8s-wn03     Ready              3d19h   v1.36.1   10.0.0.13           Debian GNU/Linux 13 (trixie)   6.12.90+deb13.1-amd64 (amd64)   containerd://1.7.24

Ну всё! Мы кросссафффчЕГИ…! Замоторили кластер кубера. Можно смело добавлять строчку в своё резюме на хэдхантере - невъебенный девопс и ждать оффера с 300к/сек