# Развертывание кластера Kubernetes из трех нод на Rocky Linux 8 ## Предварительные требования: * **Три машины с Rocky Linux 8:** * Одна машина для Control Plane (например, `kube-master`) * Две машины для Worker Nodes (например, `kube-worker-1`, `kube-worker-2`) * **Доступ с правами суперпользователя (root или sudo) на всех машинах.** * **На всех машинах должны быть настроены имена хостов (hostname).** * **На всех машинах должна быть обеспечена сетевая связность друг с другом (например, через ping).** * **Рекомендуется отключить SELinux и firewalld на время установки (для упрощения, в production необходимо настроить правила).** * **На всех машинах должен быть установлен `containerd` в качестве Container Runtime.** ## Шаг 1: Подготовка всех нод Выполните следующие действия на **ВСЕХ ТРЕХ МАШИНАХ (master и workers)**: 1. **Отключите SELinux (рекомендуется для упрощения):** ```bash sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config ``` 2. **Отключите и остановите Firewalld (рекомендуется для упрощения):** ```bash sudo systemctl disable --now firewalld ``` 3. **Установите необходимые пакеты и настройте репозиторий Kubernetes:** ```bash sudo yum update -y sudo yum install -y kubeadm kubelet kubectl --disableexcludes=kubernetes ``` 4. **Включите и запустите kubelet:** ```bash sudo systemctl enable --now kubelet ``` 5. **Настройте cgroup драйвер для kubelet и containerd:** * Проверьте конфигурацию containerd: ```bash cat /etc/containerd/config.toml | grep systemd ``` Убедитесь, что `SystemdCgroup = true`. Если нет, отредактируйте файл `/etc/containerd/config.toml` и измените значение на `true`. После этого перезапустите containerd: ```bash sudo systemctl restart containerd ``` * Создайте файл конфигурации kubelet (если его нет) `/etc/sysconfig/kubelet` и добавьте следующую строку: ``` KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd" ``` * Перезапустите kubelet: ```bash sudo systemctl restart kubelet ``` ## Шаг 2: Инициализация Control Plane (только на `kube-master`) Выполните следующие действия **ТОЛЬКО НА МАШИНЕ, КОТОРАЯ БУДЕТ CONTROL PLANE (`kube-master`)**: 1. **Инициализируйте Control Plane с помощью `kubeadm init`:** * Выберите IP-адрес интерфейса, который будут использовать worker nodes для связи с master (замените `` на фактический IP-адрес `kube-master`). * Укажите сетевой плагин (здесь используется Calico, но вы можете выбрать другой). ```bash sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=":6443" ``` * **Запомните команду `kubeadm join ...`**, которая будет выведена в конце выполнения этой команды. Она понадобится для присоединения worker nodes к кластеру. Пример команды: ``` kubeadm join :6443 --token --discovery-token-ca-cert-hash sha256: ``` 2. **Настройте `kubectl` для работы с кластером (выполните на `kube-master`):** ```bash mkdir -p $HOME/.kube sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 3. **Установите сетевой плагин (Calico в данном примере):** ```bash kubectl apply -f [https://docs.projectcalico.org/manifests/calico.yaml](https://docs.projectcalico.org/manifests/calico.yaml) ``` * Дождитесь, пока все Pod'ы в пространстве имен `kube-system` перейдут в состояние `Running`. Это может занять несколько минут: ```bash kubectl get pods -n kube-system -w ``` ## Шаг 3: Присоединение Worker Nodes (на `kube-worker-1` и `kube-worker-2`) Выполните следующую команду **НА КАЖДОЙ МАШИНЕ, КОТОРАЯ БУДЕТ WORKER NODE (`kube-worker-1`, `kube-worker-2`)**: 1. **Используйте команду `kubeadm join`, скопированную на шаге 2:** ```bash sudo kubeadm join :6443 --token --discovery-token-ca-cert-hash sha256: ``` * Замените ``, `` и `` на значения, полученные при инициализации Control Plane. ## Шаг 4: Проверка кластера (на `kube-master`) Выполните следующие команды **ТОЛЬКО НА МАШИНЕ CONTROL PLANE (`kube-master`)**, чтобы убедиться, что кластер настроен правильно: 1. **Проверьте состояние узлов:** ```bash kubectl get nodes ``` Вы должны увидеть три узла (`kube-master`, `kube-worker-1`, `kube-worker-2`) в состоянии `Ready`. 2. **Проверьте состояние Pod'ов в системном пространстве имен:** ```bash kubectl get pods -n kube-system ``` Убедитесь, что основные компоненты Kubernetes и сетевой плагин (Calico) запущены и находятся в состоянии `Running`. ## Дополнительные действия (рекомендуется): * **Настройте постоянное хранилище (Persistent Volumes) в зависимости от ваших потребностей.** * **Установите панель управления Kubernetes Dashboard для графического интерфейса.** * **Настройте DNS для кластера (например, CoreDNS, который устанавливается по умолчанию).** * **Включите и настройте firewalld на всех нодах, разрешив необходимые порты Kubernetes (6443, 2379-2380, 10250, 10251, 10252, 10255, порты для сетевого плагина).** * **Усильте безопасность кластера (RBAC, Network Policies и т.д.).** ## Устранение неполадок: * **Проверьте логи kubelet на worker nodes:** `sudo journalctl -u kubelet -f` * **Проверьте логи kubeadm на worker nodes:** `sudo journalctl -u kubeadm -f` * **Проверьте логи kube-apiserver, kube-scheduler и kube-controller-manager на master node:** `sudo journalctl -u kube-apiserver -f`, `sudo journalctl -u kube-scheduler -f`, `sudo journalctl -u kube-controller-manager -f` * **Убедитесь, что сетевая связность между нодами работает.** Эта инструкция представляет собой базовый вариант развертывания кластера Kubernetes. Для production-окружений рекомендуется использовать более продвинутые инструменты и конфигурации.