Установка NGINX и балансировщик нагрузки в Kubernetes на Ubuntu 18.04

Kubernetes — это оркестратор контейнеров для автоматического развёртывания и масштабирования. В этом пошаговом руководстве показано, как подготовить два сервера Ubuntu 18.04, установить Docker и Kubernetes, присоединить воркер-узел и развернуть NGINX с NodePort-сервисом для тестирования балансировки нагрузки.
Краткое определение
Kubernetes — система для управления контейнерами, позволяющая автоматически масштабировать, самовосстанавливать и распределять приложения по кластеру узлов.
Что вам понадобится
- Два сервера с Ubuntu 18.04.04 LTS (или совместимая версия).
- Как минимум 2 ГБ оперативной памяти на каждом сервере.
- Доступ root или права sudo на обоих серверах.
- Статические IP-адреса или надёжное DNS/hosts, чтобы узлы видели друг друга.
Важные замечания
Внимание: Kubernetes не работает при включённом swap. Перед установкой обязательно отключите swap и, при необходимости, удалите запись в /etc/fstab.
Примечание: в примерах используется сеть подсети Pod 192.168.0.0/16 и IP мастер-узла 192.168.0.103. Подставьте свои значения при необходимости.
Подготовка серверов — быстрое обновление и отключение swap
Обновите пакеты на обоих серверах:
apt-get update -y
apt-get upgrade -yПерезагрузите серверы, чтобы применять обновления. Затем временно отключите swap:
swapoff -aЧтобы отключить swap постоянно, отредактируйте /etc/fstab и закомментируйте строку swap, затем примените изменения:
nano /etc/fstab(закомментируйте строку с swap, например добавив # в начале)
mount -aНастройка разрешения имён (hosts)
Добавьте в /etc/hosts сопоставления IP и имён на каждом сервере, чтобы узлы могли обращаться друг к другу по именам:
nano /etc/hostsДобавьте строки, например:
192.168.0.103 master
192.168.0.100 slaveСохраните и закройте файл.
Установка Docker и Kubernetes (kubelet, kubeadm, kubectl)
Установите необходимые пакеты и добавьте GPG-ключ Docker:
apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -Добавьте репозиторий Docker CE:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"Установите Docker CE:
apt-get update -y
apt-get install docker-ce -yПроверьте статус Docker:
systemctl status dockerЕсли демон запущен — продолжайте. Если есть предупреждения о cgroup или swap, проверьте конфигурацию ядра и параметры контейнера.
Добавьте репозиторий Kubernetes и установите пакеты kubelet, kubeadm, kubectl:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update -y
apt-get install kubelet kubeadm kubectl -yПосле установки можно перейти к настройке мастер-узла.
Инициализация Master-узла
На Master выполните инициализацию кластера, указав свой частный IP и CIDR для Pod-сети:
kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.0.103После успешной инициализации команда выдаст инструкции по настройке kubectl и пример команды kubeadm join для воркеров. Настройте kubectl для обычного пользователя:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/configРазвёртывание сетевого плагина (CNI)
Кластер без CNI не позволит подам общаться между собой. В примере используется Calico (совместимая версия по ссылке в примере):
kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yamlПроверьте namespaces и состояние системных подов:
kubectl get namespaces
kubectl get pods -n kube-systemДождитесь, пока системные поды перейдут в состояние Ready.
Подключение Slave (воркер) к кластеру
На воркере выполните команду, которую kubeadm init показал при инициализации, например:
kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436cНа мастере проверьте список узлов:
kubectl get nodesОжидаемый пример вывода:
NAME STATUS ROLES AGE VERSION
master Ready master 25m v1.15.3
slave Ready 2m v1.15.3Если воркер не в Ready, проверьте логи kubelet и состояние CNI.
Развёртывание NGINX и создание сервиса NodePort
Создайте деплоймент NGINX на мастере:
kubectl create deployment nginx --image=nginxПроверьте деплоймент:
kubectl get deploymentsОжидаемый вывод:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 99sСоздайте сервис типа NodePort, чтобы получить доступ к приложению извне через порт узла:
kubectl create service nodeport nginx --tcp=80:80Посмотрите сервисы и назначенный ClusterIP и порт NodePort:
kubectl get svcПример вывода:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.152.183.1 443/TCP 15m
nginx ClusterIP 10.152.183.199 80:32456/TCP 60sТеперь можно обратиться к приложению по любому узлу кластера на порту NodePort (в примере 32456): http://
Критерии приёмки
- kubeadm init успешно завершён на мастере.
- CNI задеплоен и pod’ы kube-system находятся в Ready.
- Воркеры добавлены и имеют статус Ready.
- Деплоймент nginx доступен и сервис NodePort возвращает страницу NGINX.
Чек-лист по ролям
- Администратор инфраструктуры: проверить сетевые правила, IP-адреса, отключение swap и доступ по SSH.
- DevOps-инженер: установить Docker, kubeadm, настроить kubelet, применить CNI.
- Разработчик/QA: задеплоить приложение и проверить доступность через NodePort, собрать логи при ошибках.
Альтернативные подходы и CNI
- Flannel: проще в установке, подходит для базовых сценариев.
- Calico: продвинутая политика сетевой безопасности и маршрутизация.
- Weave Net: удобен для простых сетевых конфигураций и шифрования.
Выбор зависит от требований к политике безопасности, фрагментации сети и производительности.
Когда это может не сработать (контрпримеры)
- Swap включён на узле — kubelet может перейти в ошибку.
- Неправильная настройка /etc/hosts или межузловые firewall-правила блокируют порты Kubernetes (6443, 2379-2380, 10250, 10251, 10252 и др.).
- Несовместимые версии Docker и kubelet/kubeadm приводят к проблемам запуска подов.
Мини-методология проверки и устранения проблем
- Проверить статус узлов: kubectl get nodes.
- Проверить системные поды: kubectl get pods -n kube-system.
- Проверить логи kubelet: journalctl -u kubelet -xe.
- Проверить, что CNI установлена и её DaemonSet/Pod’ы работают.
- При сетевых проблемах проверить iptables/ufw и межсерверные правила.
Быстрый план отката/rollback
- Если после установки Kubernetes что-то идёт критично не так, можно выполнить на каждом узле:
kubeadm reset -f
systemctl restart docker- Очистите /etc/kubernetes и, при необходимости, пересоздайте кластер с другими параметрами.
Безопасность и дополнительные рекомендации
- Отключайте открытые NodePort в продуктиве; используйте Ingress-контроллеры и LoadBalancer при наличии облачной сети.
- Настройте RBAC и ограничьте права сервиса, используемого приложением.
- Регулярно обновляйте версии Kubernetes и Docker, тестируя обновление на стенде прежде, чем применять в продакшн.
Частые проблемы и отладка
- Pod остаётся в состоянии CrashLoopBackOff: kubectl describe pod
и kubectl logs укажут причину. - Node в статусе NotReady: проверьте kubelet, сетевой плагин и доступ к API-серверу.
- Проблемы с DNS в кластере: проверьте CoreDNS/ kube-dns поды и их логи.
Ресурсы и ссылки
- Официальная документация Kubernetes: https://kubernetes.io/docs/
- Calico Getting Started: https://docs.projectcalico.org/
Итог
Вы подготовили два сервера Ubuntu, установили Docker и Kubernetes, присоединили воркер к кластеру, развернули Calico как CNI и развернули NGINX с доступом через NodePort. На следующем этапе можно настроить Ingress-контроллер и автоматическое масштабирование для продуктивных нагрузок.
Ключевые команды сохраните в заметке или репозитории конфигураций. Если нужно, помогу адаптировать инструкции под вашу сеть или заменить NodePort на Ingress/LoadBalancer.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента