Установка Kubernetes на RHEL 9.4#

Подготовить 3 виртуальные машины#

Нужны 3+ ВМ с RHEL 9.4, соответствующие минимальным требованиям (2 CPU, 2 GB RAM). Все команды выполняются от имени пользователя с правами sudo.

Обновите индекс пакетов и задайте уникальные имена хостов для каждой машины согласно вашему плану (например, master1worker1worker2).

sudo dnf update -y
# Пример для мастер-ноды. Повторите на воркерах с своими именами.
sudo hostnamectl set-hostname master1.local

Настройка файла /etc/hosts (либо насроить на DNS). На каждой ноде пропишите соответствие IP-адресов и имен хостов, чтобы обеспечить сетевую доступность по именам:

sudo tee -a /etc/hosts > /dev/null <<EOF
192.168.1.150 master1.local master1
192.168.1.151 worker1.local worker1
192.168.1.152 worker2.local worker2
EOF

(Заменить IP-адреса на актуальные для конкретного стенда)

Отключить Swap#

Для Kubernetes рекомендуется отключение swap в системе:

sudo swapoff -a
# Удалите или закомментируйте строку с swap в файле /etc/fstab
sudo sed -i '/swap/d' /etc/fstab

Подготовить сетевые модули ядра#

Проверим модуль br_netfilter:

lsmod | grep br_netfilter
ls -la /proc/sys/net/bridge/

Если строк с модулем нет, то грузим модуль в ядро немеделенно:

sudo modprobe br_netfilter
sudo modprobe overlay

# и снова проверить:
lsmod | grep br_netfilter

Далее, создать конфигурацию под Kubernetes и проверить, что модуль указан там:

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

Проверяем параметры ядра: параметр ядра ip_forward. Проверить, что действительно выключен:

sysctl net.ipv4.ip_forward
# или
cat /proc/sys/net/ipv4/ip_forward

Если нет, то включить параметр ядра немедленно:

sudo sysctl -w net.ipv4.ip_forward=1

Убедиться что файл конфигурации существует и содержит правильную настройку:

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

Подготовить Firewalld#

ВАРИАНТ 1 - Отключить Firewalld#

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl status firewalld

ВАРИАНТ 2 - Настроить Firewalld -  добавить порты#

Откройте порты для Control Plane:

# Kubernetes API server
sudo firewall-cmd --permanent --add-port=6443/tcp
# etcd server client API
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
# Kubelet API
sudo firewall-cmd --permanent --add-port=10250/tcp
# kube-scheduler
sudo firewall-cmd --permanent --add-port=10259/tcp
# kube-controller-manager
sudo firewall-cmd --permanent --add-port=10257/tcp

sudo firewall-cmd --reload

sudo firewall-cmd --list-ports

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

sudo firewall-cmd --reload

# проверить добавленные правила
sudo firewall-cmd --list-ports

Установка Container Runtime#

Для установки containerd надо добавить репозиторий Docker:

# Устанавливаем утилиту dnf-plugins-core (если еще не установлена)
sudo dnf install -y dnf-plugins-core

# Добавляем репозиторий Docker
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

# Устанавливаем containerd
sudo dnf install -y containerd.io

Создаем директорию для конфигурации:

sudo mkdir -p /etc/containerd

Генерируем конфигурацию по умолчанию:

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

Редактируем конфиг для использования systemd cgroup:

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

(Убедитесь, что параметр SystemdCgroup = true установлен в секции [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options])

Это позволит нам включить containerd со стороны systemctl:

sudo systemctl enable containerd --now
sudo systemctl status containerd

Установка Kubernetes (kubeadm, kubelet, kubectl)#

Добавить репозиторий kubernetes (1.35):

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.key
EOF

Теперь можно становить все пакеты:

sudo dnf install -y kubelet kubeadm kubectl

Зафиксировать версию Kubernetes в RHEL (чтобы избежать случайных обновлений), запустить и проверить статус запуска:

sudo dnf install -y dnf-plugins-core python3-dnf-plugin-versionlock

sudo dnf versionlock add kubelet kubeadm kubectl

# проверить:
sudo dnf versionlock list

Запуск Kubernetes:

sudo systemctl enable --now kubelet

sudo systemctl status kubelet

Настройка МАСТЕР-узла (master node)#

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

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

После успешного завершения Вы увидите сообщение Your Kubernetes control-plane has initialized successfully! и команду kubeadm join для подключения воркеров. ВАЖНО сохранить эту команду.

Настройка доступа к кластеру#

Выполните команды, чтобы настроить kubectl для обычного пользователя:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Установка CNI (Flannel)#

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

Необходимо подождать несколько минут, пока компоненты загрузятся, и далее проверьте статус узлов и подов:

kubectl get nodes
kubectl get pods -n kube-flannel # или -n kube-system, в зависимости от версии Flannel

Мастер-нода должна перейти в состояние Ready.

Проверка Flannel#

На всех нодах должен быть файл настроек:

ls -la /run/flannel/subnet.env

Файл имеет вид:

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

На мастер-узле проверить:

kubectl get pods -n kube-flannel -o wide

Подключение рабочих узлов (worker node)#

На каждой рабочей ноде (worker) выполнить все шаги вплоть до “Запуск Kubernetes”, а далее команду kubeadm join, которую вы сохранили после инициализации кластера и сети. Она выглядит примерно так:

sudo kubeadm join 192.168.1.150:6443 --token <your-token> --discovery-token-ca-cert-hash sha256:<your-hash>

Если забыли сохранить команду, то сгенерировать новый токен можно на мастер-ноде с помощью команды kubeadm token create --print-join-command.

Проверка после подключения#

Вернитесь на мастер-ноду и убедитесь, что все узлы кластера находятся в статусе Ready:

kubectl get nodes

Установка Helm#

Самый простой способ установки Helm на RHEL — использовать официальный скрипт:

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Проверка установки:

helm version

Вы должны увидеть вывод с информацией о версии Helm.