Нынешний век - век импортозамещения. Многие компании сейчас сталкиваются с возникшей необходимостью переходить на отечественное ПО. Приходится осваивать вновь появившиеся нюансы, связанные с новым программным обеспечением.
В данной статье мы в подробности рассмотрим настройку и шаг-за шагом настроим single-node kubernetes-кластер в одной из популярных отечественных ОС - RedOS.
Статья больше подойдёт тем, кто хочет разобраться в тонкостях работы kubernetes. В ней мы с вами осуществим "низкоуровневую" настройку кластера с помощью утилиты kubeadm, не используя "высокоуровневые" minikube и kubespray.
Понимая нюансы настройки кубера на RedOS8, описанные в этой статье, вы без проблем сможете осуществить настройку в RedOS8 при помощи kubespray.
Системные требования
Минимальные системные требования для нашей установки: 1CPU / RAM:2Gb / HDD:10GB
Подготовка сервера
Прежде чем начать установку кубера, необходимо подготовить сервера. При установке кубера при помощи kubespray всё это осуществляется автоматически, но мы с вами в познавательных целях сделаем всё это сами.
Отключаем 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
Для работы kubernetes swap больше мешает, чем помогает, поэтому нам нужно его выключить.
В качестве swap в redos используется zram-swap - этот тот же swap-раздел, но только в оперативной памяти, данные при помещение в него сжимаются, тем самым обеспечивается экономия памяти и бОльшая производительность, чем при старом добром swap-разделе на HDD. Для работы kubernetes swap приносит больше проблем, чем пользы, поэтому отключаем zram-swap:
systemctl mask dev-zram0.swap
swapoff -a
Настраиваем параметры ядра:
tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
Запускаем дополнительные модули ядра:
tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
Отключаем 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
Добавляем в систему репозиторий kubernetes:
tee /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
Устанавливаем необходимые пакеты:
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
Устанавливаем 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.
При необходимости, можно присоединить к нашему мини-кластеру дополнительные ноды-воркеры, но это уже будет другая история...