Предлагаю не душнить с описанием того, что такое 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 Ready5m13s 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.10Debian 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к/сек