Kubernetes на CentOS 7 — установка и настройка
Кратко: пошаговое руководство по установке кластера Kubernetes на CentOS 7 с использованием kubeadm, одного мастера и двух рабочих узлов. Включены подготовка серверов, настройка сети (flannel), добавление нод, тестовый развёртывание Nginx, чеклисты, критерии приёмки и рекомендации по безопасности.
Важно: заранее убедитесь, что у вас есть root-доступ к трем машинам и стабильная сеть между ними.
Обзор и цель руководства
Kubernetes — это платформа с открытым исходным кодом для оркестрации контейнеризованных приложений. Это руководство покажет, как подготовить три сервера CentOS 7, установить Docker и Kubernetes (kubeadm/kubelet/kubectl), и создать рабочий кластер с одной нодой master и двумя рабочими нодами. В конце вы развернёте тестовый Pod (nginx) и откроете доступ через NodePort.
Кому пригодится: системным администраторам, инженерам DevOps и разработчикам, которые хотят быстро поднять тестовый или небольшой продакшен-кластер на CentOS 7.
Ключевые понятия в одну строку
- Pod: минимальная единица деплоя в Kubernetes, может содержать один или несколько контейнеров.
- kubeadm: инструмент для инициализации и управления базовой конфигурацией кластера Kubernetes.
- kubelet: агент, запускающий контейнеры на каждом узле.
- kubectl: клиентская утилита для управления кластером.
Основные варианты использования
- Быстрый тестовый кластер для CI/CD и отладки.
- Лабораторная среда перед миграцией приложений в Kubernetes.
- Учебный кейс для освоения kubeadm и сетевых плагинов (flannel).
Предварительные условия
- 3 сервера с CentOS 7
- 10.0.15.10 k8s-master
- 10.0.15.21 node01
- 10.0.15.22 node02
- root или sudo-привилегии на всех серверах
- Прямой сетевой доступ между серверами (порты ниже)
- Наличие доступа в интернет для загрузки пакетов и образов
Советы по ресурсам: для базовой лаборатории достаточно 1 vCPU и 1–2 ГБ ОЗУ на узел, но для стабильной работы рекомендуется 2 vCPU и 4 ГБ RAM для мастера и 2–4 ГБ для рабочих узлов.
Что мы сделаем
- Подготовим сервера и установим Docker и Kubernetes
- Инициализируем мастер-кластер с помощью kubeadm
- Добавим node01 и node02 в кластер
- Проверим кластер, создав первый Pod (nginx)
Порты и протоколы (факты)
- kube-apiserver: TCP 6443 — главный API сервер кластера.
- etcd (если локально): TCP 2379-2380.
- kubelet: TCP 10250 (доступ для kube-proxy/kubectl в некоторых сценариях).
- NodePort: 30000–32767 (по умолчанию диапазон портов для сервисов типа NodePort).
Эти порты должны быть доступными внутри вашей сети между узлами.
Шаг 1 — Подготовка серверов и установка Kubernetes
Все команды ниже выполняйте на всех трёх серверах (мастер и ноды), если не указано иное.
Настройте /etc/hosts
Откройте файл hosts в редакторе:
vim /etc/hostsВставьте записи:
10.0.15.10 k8s-master
10.0.15.21 node01
10.0.15.22 node02Сохраните и закройте.
Отключение SELinux
Чтобы избежать проблем с Docker и CSI-плагинами, временно отключим SELinux (для лабораторной среды). Выполните:
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinuxВажно: в продакшене лучше настроить политику SELinux корректно, а не отключать.
Включение модуля br_netfilter
Модуль br_netfilter необходим, чтобы пакеты, проходящие через bridge, обрабатывались iptables:
modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptablesОтключите swap
Kubernetes требует отключённого swap:
swapoff -aОтредактируйте /etc/fstab и закомментируйте строку со swap UUID.


Установка Docker CE
Установите зависимости и репозиторий Docker, затем docker-ce:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ceЗапустите Docker и включите автозапуск:
systemctl start docker && systemctl enable dockerДобавление репозитория Kubernetes и установка пакетов
Создайте файл репозитория:
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF Установите kubelet, kubeadm и kubectl:
yum install -y kubelet kubeadm kubectlПерезагрузите серверы после установки (рекомендуется):
sudo rebootПосле перезагрузки снова запустите и включите сервисы Docker и kubelet:
systemctl start docker && systemctl enable docker
systemctl start kubelet && systemctl enable kubeletНастройка cgroup-driver
Docker по умолчанию использует cgroupfs. Убедимся, что kubelet использует тот же драйвер. Проверьте драйвер Docker:
docker info | grep -i cgroupЕсли Docker использует cgroupfs, выполните:
sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl restart kubeletЭто гарантирует согласованность cgroup между Docker и kubelet.
Шаг 2 — Инициализация Kubernetes мастера
Выполните команды на сервере k8s-master (10.0.15.10).
Инициализация кластера через kubeadm. В примере используется flannel и CIDR 10.244.0.0/16:
kubeadm init --apiserver-advertise-address=10.0.15.10 --pod-network-cidr=10.244.0.0/16
Параметры:
- –apiserver-advertise-address: IP интерфейса мастера, по которому API будет доступен.
- –pod-network-cidr: диапазон адресов для сети Pod; выбран для совместимости с flannel.
Сохраните и запишите команду kubeadm join, которую выведет init — она понадобится для добавления рабочих узлов.
Создайте директорию конфигурации kubectl и скопируйте admin.conf в домашний каталог:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configДеплой сетевого плагина flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlПроверьте статус узлов и подов:
kubectl get nodes
kubectl get pods --all-namespacesУбедитесь, что все Pod в namespace kube-system имеют статус Running.

Шаг 3 — Добавление node01 и node02 в кластер
На каждом рабочем узле выполните команду kubeadm join, которую вы получили после инициализации мастера. Пример команды (ваша команда будет другой):
kubeadm join 10.0.15.10:6443 --token vzau5v.vjiqyxq26lzsf28e --discovery-token-ca-cert-hash sha256:e6d046ba34ee03e7d55e1f5ac6d2de09fd6d7e6959d16782ef0778794b94c61e
После выполнения на обеих нодах вернитесь на мастер и проверьте:
kubectl get nodes
kubectl get pods --all-namespacesВы должны увидеть node01 и node02 в состоянии Ready.

Шаг 4 — Тест: создание первого Pod (nginx)
На мастере создайте deployment nginx:
kubectl create deployment nginx --image=nginxПосмотреть описание deployment:
kubectl describe deployment nginxСоздадим сервис NodePort для доступа к nginx извне:
kubectl create service nodeport nginx --tcp=80:80Проверьте Pods и Services:
kubectl get pods
kubectl get svc
В таблице svc вы увидите ClusterIP (внутренний IP) и внешний NodePort (например, 30691). Проверьте доступ через curl с мастер-узла или с другой машины в сети:
curl node01:30691
curl node02:30691

В браузере откройте:
и убедитесь, что отображается стандартная страница Nginx.
Поздравляем — базовый кластер Kubernetes развернут и протестирован.
Критерии приёмки
- Узлы master, node01 и node02 видны в kubectl get nodes и находятся в состоянии Ready.
- Все Pod в kube-system находятся в состоянии Running (или Ready) после нескольких минут ожидания.
- Деплой nginx успешно создан и Pod имеющий статус Running.
- NodePort сервис возвращает корректную страницу Nginx при обращении к любому рабочему узлу.
Если хотя бы один пункт не выполняется, следуйте разделу «Устранение неполадок».
Чеклист команд (быстрый набор)
- Настройка hosts: vim /etc/hosts
- Выключить swap: swapoff -a
- Включить br_netfilter: modprobe br_netfilter
- Установка Docker: yum install -y docker-ce
- Установка kubernetes: yum install -y kubelet kubeadm kubectl
- Инициализация мастера: kubeadm init –apiserver-advertise-address=… –pod-network-cidr=…
- Установка flannel: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- Добавление нод: kubeadm join …
- Создание nginx: kubectl create deployment nginx –image=nginx
- Открыть NodePort: kubectl create service nodeport nginx –tcp=80:80
Роль-based чеклисты
Администратор инфраструктуры:
- Подготовить и проверить сеть между нодами
- Убедиться в наличии root-доступа
- Настроить DNS/hosts
- Проверить доступность портов
DevOps-инженер:
- Установить Docker и Kubernetes-пакеты
- Настроить cgroup-driver
- Запустить kubeadm init и применить сетевой плагин
- Написать манифесты/Helm-чарты для приложений
Разработчик:
- Тестировать приложения в Pod и сервисах
- Использовать kubectl для отладки
- Предоставлять манифесты для деплоя
Устранение неполадок — частые ошибки и решения
Pod в статусе CrashLoopBackOff
- Просмотрите логи: kubectl logs
[-c ] - Проверка описания Pod: kubectl describe pod
- Убедитесь, что образ доступен и конфигурация переменных окружения верна.
- Просмотрите логи: kubectl logs
Узел в состоянии NotReady
- Проверьте kubelet: systemctl status kubelet
- Убедитесь, что swap отключён и br_netfilter включён
- Проверьте сетевые плагины (flannel/Calico) — имеются ли Pod в kube-system
kubeadm join не проходит
- Проверьте токен (он действителен по времени)
- Убедитесь, что мастер доступен по 10.0.15.10:6443
- Проверить корректность discovery-token-ca-cert-hash
Сервис NodePort не отвечает
- Проверить, что Pod запущен: kubectl get pods
- Проверить правила firewall/iptables на нодах
- Проверить, что порт NodePort попадает в указанный диапазон
Безопасность и рекомендации
- В продакшене не отключайте SELinux глобально; вместо этого настройте модули или используйте совместимые образы.
- Регулярно обновляйте Docker и пакеты Kubernetes; придерживайтесь поддерживаемых версий.
- Настройте аутентификацию и RBAC для доступа к кластеру.
- Разделяйте роли: не давайте всем пользователям права cluster-admin.
- Используйте сетевые политики (NetworkPolicy) для ограничения трафика между Pod.
Мини-методология: как тестировать и верифицировать кластер
- После деплоя мастера и сети дождитесь стабильности kube-system (3–5 минут).
- Добавьте одну ноду и проверьте её статус.
- Разверните простой Deployment (nginx) и Service.
- Выполните проверку доступности с каждой ноды (curl node:nodeport).
- Запланируйте короткую нагрузочную проверку (например, несколько параллельных curl).
Примеры, когда этот подход не подходит
- Если вы строите крупный продакшен-кластер, этот метод (kubeadm + flannel) нужно дополнить HA-config для control-plane, управляемым etcd, мониторингом и бэкапами.
- Для облачных сред часто предпочтительнее использовать managed Kubernetes (EKS/GKE/AKS) или провайдерские интеграции.
Полезные шаблоны и сниппеты
Команда для просмотра логов и ошибок kubelet:
journalctl -u kubelet -xeКоманды проверки сети flannel:
kubectl -n kube-system get pods | grep flannel
kubectl -n kube-system describe ds kube-flannel-dsСнять вывод kubeadm init в файл для последующего копирования join-команды:
kubeadm init ... | tee ~/kubeadm-init.logКраткий глоссарий (1 строка)
- Pod: группа контейнеров с общими сетями и томами.
- Node: физический или виртуальный хост, запускающий Pod.
- Master (control plane): узел(ы), управляющие кластером.
- kubeadm: инструмент для первичной настройки кластера.
Сводка
- Подготовьте три сервера с CentOS 7 и root-доступом.
- Установите Docker, kubeadm, kubelet, kubectl.
- Инициализируйте мастер с нужным pod-network-cidr и примените flannel.
- Добавьте рабочие ноды через kubeadm join.
- Проверьте работоспособность, развернув nginx и открыв NodePort.
Переходите к автоматизации (Ansible/Terraform) и добавлению мониторинга/логирования для продакшен-готового кластера.
Ресурсы и ссылки
- Официальная документация Kubernetes: https://kubernetes.io/docs/
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента