Поднимаем одно-нодовый kubernetes-кластер на RedOS
Нынешний век — век импортозамещения. Многие компании сейчас сталкиваются с возникшей необходимостью переходить на отечественное ПО. Приходится осваивать вновь появившиеся нюансы, связанные с новым программным обеспечением. В данной статье мы в подробности рассмотрим настройку и шаг-за шагом настроим single-node kubernetes-кластер в одной из популярных отечественных ОС — RedOS.
В качестве подопытного мы используем сервер с RedOS8.
Минимальные системные требования для нашей установки: 1CPU / RAM:2Gb / HDD:10GB
Для начала донастроим наш сервер для возможности использования в качестве ноды kubernetes-кластера.
Отключаем firewalld:
systemctl disable --now firewalld.service
В redos по умолчанию включен кэширующий dns-сервер systemd-resolved, он немного мешает полноценной работе kubernetes, поэтому отключаем:
systemctl mask systemd-resolved.service
echo -e "[global-dns-domain-*]\nservers = 8.8.8.8\n" > /etc/NetworkManager/conf.d/dns.conf
rm -f /etc/resolv.conf
systemctl restart NetworkManager
В качестве swap в redos используется zram-swap — этот тот же swap-раздел, но только в оперативной памяти, данные при помещение в него сжимаются, тем самым обеспечивается экономия памяти и бОльшая производительность, чем при старом добром swap-разделе на HDD. Для работы kubernetes swap приносит больше проблем, чем пользы, поэтому отключаем zram-swap:
systemctl mask dev-zram0.swap
swapoff -a
Настраиваем параметры ядра:
tee /etc/sysctl.d/kubernetes.conf <
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
Применяем сделанные изменения:
sysctl --system
Запускаем дополнительные модули ядра:
modprobe overlay
modprobe br_netfilter
…и настраиваем их автоматически запуск при загрузке ОС:
tee /etc/modules-load.d/containerd.conf <
overlay
br_netfilter
EOF
Отключаем selinux:
setenforce 0
…и настраиваем его отключение при загрузке ОС:
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
В /etc/hosts добавляем соответствие имени нашего хоста с локальным айпи-адресом:
LOCAL_IP=$(ip a s eth0 | grep 'inet' | awk '{print($2)}' | awk -F '/' '{print($1)}')
echo "${LOCAL_IP} ${HOSTNAME}” >> /etc/hosts
Добавляем в систему репозиторий kubernetes:
tee /etc/yum.repos.d/kubernetes.repo <
Устанавливаем необходимые пакеты:
dnf install -y socat iproute-tc containerd kubelet kubeadm kubectl --disableexcludes=kubernetes
Создаём конфигурационый файл для containerd:
containerd config default | \sed 's/SystemdCgroup = false/SystemdCgroup = true/' | \sed 's/sandbox_image = \"registry\.k8s\.io\/pause:3\.8\"/sandbox_image = \"registry\.k8s.io\/pause:3\.9\"/' \> /etc/containerd/config.toml
Включаем сервисы:
systemctl enable --now containerd kubelet
Инициализируем кластер:
kubeadm init
Немного ждём и проверяем работу кластера:
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl get pods --all-namespaces
Видим, что поды coredns не в статусе Pending. Это нормально, их время ещё не пришло.
Устанавливаем NetworkPlugin Cilium:
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-amd64.tar.gz
tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
/usr/local/bin/cilium install
И самый последний штрих: делаем наш кластер одно-нодовым — чтобы обычные поды могли запускаться на нашем мастере:
kubectl taint node ${HOSTNAME} node-role.kubernetes.io/control-plane:NoSchedule-
Ещё немного ждём, чтобы все поды прогрузились и любуемся результатом:
kubectl get pods --all-namespaces
В итоге у нас появилась неплохая песочница для небольших экспериментов и изучения kubernetes.
При необходимости, можно присоединить к нашему мини-кластеру дополнительные ноды-воркеры, но это уже будет другая история…