Установка и настройка Kubernetes на Ubuntu 18.04
Важно: примеры команд выполняйте под root или с sudo. В примере используется сеть Flannel и версия Kubernetes 1.11.0 — для продакшн-развёртываний выбирайте поддерживаемые версии и CNI, соответствующие требованиям безопасности.
Что такое Kubernetes в одном предложении
Kubernetes — система оркестрации контейнеров с автоматическим масштабированием, распределением нагрузки и централизованным управлением контейнеризированными приложениями.
Основные обозначения
- kubeadm — утилита для быстрой и предсказуемой инициализации кластера Kubernetes.
- kubelet — агент, запускающий контейнеры на каждом узле.
- kubectl — клиент для работы с API Kubernetes.
Содержание
- Предварительные требования
- Шаг 1 — Подготовка и установка kubeadm (на всех серверах)
- Настройка hosts
- Установка Docker
- Отключение swap
- Установка пакетов kubeadm/kubelet/kubectl
- Шаг 2 — Инициализация кластера (на k8s-master)
- Настройка kubeconfig
- Развёртывание сети Flannel
- Шаг 3 — Добавление воркеров (worker01, worker02)
- Шаг 4 — Тестирование (деплой nginx и сервис NodePort)
- Дополнительно: выбор CNI, отладка, чек-листы ролей, критерии приёмки, SOP, безопасность, совместимость, глоссарий
Предварительные требования
- 3 сервера с Ubuntu 18.04:
- 10.0.15.10 k8s-master
- 10.0.15.21 worker01
- 10.0.15.22 worker02
- Доступ с правами root или через sudo
- Доступ между узлами по указанным IP (порты Kubernetes и CNI должны быть доступны)
Что мы будем делать
- Подготовить хосты и установить Docker
- Отключить swap
- Установить kubeadm, kubelet, kubectl
- Инициализировать мастер и развернуть Flannel
- Добавить воркеры в кластер
- Развернуть тестовый nginx и проверить доступ
Шаг 1 — Установка kubeadm (подготовка всех серверов)
Во время этого шага выполните команды на всех трёх серверах (master и оба worker).
Настройка hosts
Отредактируйте файл /etc/hosts на каждом сервере:
sudo vim /etc/hostsВставьте записи хостов:
10.0.15.10 k8s-master
10.0.15.21 worker01
10.0.15.22 worker02Сохраните и выйдите. Проверьте связь по именам:
ping -c 3 k8s-master
ping -c 3 worker01
ping -c 3 worker02Убедитесь, что имена разрешаются в нужные IP.

Установка Docker
В этом руководстве Docker устанавливается из репозитория Ubuntu:
sudo apt update
sudo apt install docker.io -yЗапустите и включите автозапуск служби Docker:
sudo systemctl start docker
sudo systemctl enable dockerDocker установлен и запущен.

Отключение SWAP
Kubernetes требует отключённого swap. Сначала проверьте активный swap и временно отключите его:
sudo swapon -s
sudo swapoff -aЧтобы отключить swap навсегда, закомментируйте соответствующую строку в /etc/fstab:
sudo vim /etc/fstabНайдите строку с разделом swap и добавьте # в начале, например:
#/dev/mapper/hakase--labs--vg-swap_1 none swap sw 0 0Сохраните файл и перезагрузите сервер:
sudo rebootУстановка пакетов kubeadm, kubelet, kubectl
Добавьте репозиторий Kubernetes и установите необходимые пакеты.
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cd /etc/apt/
sudo vim sources.list.d/kubernetes.listВставьте в файл:
deb http://apt.kubernetes.io/ kubernetes-xenial mainПримечание: здесь используется репозиторий «kubernetes-xenial», который применяется для пакетов kubeadm. Обновите списки пакетов и установите компоненты:
sudo apt update
sudo apt install -y kubeadm kubelet kubectlДождитесь завершения установки.

Шаг 2 — Инициализация Kubernetes-кластера (на k8s-master)
Все команды в этом разделе выполняйте только на мастер-узле (10.0.15.10).
Инициализируйте кластер kubeadm. В примере задана сеть Flannel с pod-сетью 10.244.10.0/16 и конкретный IP для объявления API-сервера:
sudo kubeadm init --pod-network-cidr=10.244.10.0/16 --apiserver-advertise-address=10.0.15.10 --kubernetes-version "1.11.0"Примечания:
- –apiserver-advertise-address указывает, по какому IP API-сервер будет доступен в сети.
- –pod-network-cidr определяет пул IP для подов; он должен соответствовать требованиям выбранного CNI (в примере — Flannel).
После успешной инициализации в выводе будет строка вида 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Далее разверните планировщик сети — Flannel (в один шаг):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlFlannel будет создан в пространстве имён kube-system. Подождите минуту или две и проверьте состояние узлов и подов:
kubectl get nodes
kubectl get pods --all-namespacesДолжны быть видны мастер и системные поды (kube-dns, kube-proxy, flannel и т. п.) в состоянии Running.


Шаг 3 — Добавление воркеров в кластер
На каждом рабочем узле выполните команду join, которую вы получили при инициализации master. Пример (возьмите вашу команду из вывода kubeadm init):
kubeadm join 10.0.15.10:6443 --token daync8.5dcgj6c6xc7l8hay --discovery-token-ca-cert-hash sha256:65a3e69531d323c335613dea1e498656236bba22e6cf3d5c54b21d744ef97dcdПовторите на worker01 и worker02. После этого на master проверьте список узлов:
kubectl get nodesОжидается, что worker01 и worker02 будут в списке со статусом Ready.


Шаг 4 — Тестирование: деплой nginx и NodePort
Создайте директорию и файл манифеста Deployment:
mkdir -p nginx/
cd nginx/
sudo vim nginx-deployment.yamlВставьте манифест:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.0
ports:
- containerPort: 80Создайте деплоймент:
kubectl create -f nginx-deployment.yamlПроверьте состояние:
kubectl get deployments
kubectl describe deployment nginx-deployment
kubectl get podsВы увидите три реплики nginx, запущенные на воркерах.

Создайте Service типа NodePort:
vim nginx-service.yamlВставьте:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
run: nginx-service
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
selector:
app: nginxПримените манифест:
kubectl create -f nginx-service.yaml
kubectl get service
kubectl describe service nginx-serviceВ выводе будет назначенный NodePort, например 32649. С проверкой со стороны рабочих узлов можно использовать curl:
curl worker01:32649
curl worker02:32649Должна возвращаться HTML-страница по умолчанию nginx.


Поздравляем — базовая установка кластера Kubernetes на Ubuntu 18.04 завершена.
Когда этот подход не сработает (типичные причины и контрпримеры)
- Swap не отключён — kubelet откажется запускать поды.
- Брандмауэр/межсетевой экран блокирует необходимые порты (например, 6443, 2379–2380, 10250, CNI-порты).
- Несовместимые версии kubeadm/kubelet/kubectl (в продакшн-кластере версии компонентов должны быть совместимы).
- Используемое облачное окружение или сетевая политика мешают выбранному CNI (требуется адаптация конфигурации сети).
Альтернативные подходы (выбор CNI и способов установки)
- Flannel — простой и быстрый для небольших кластеров (как в этом руководстве).
- Calico — поддерживает сетевые политики и масштабируется лучше в более строгих сетевых сценариях.
- Weave Net — простая настройка, поддерживает шифрование межузлового трафика.
- Развёртывание через managed Kubernetes (GKE, EKS, AKS) — если вы не хотите управлять control plane самостоятельно.
Mermaid-диаграмма: выбор CNI
flowchart TD
A[Нужна сетевая политика?] -->|Да| B[Используйте Calico]
A -->|Нет| C[Простой кластер]
C --> D[Flannel]
C --> E[Weave Net если нужен шифрованный трафик]Ролевые чек-листы (что проверить до/после развёртывания)
Администратор кластера (master):
- Убедиться, что /etc/hosts настроен и доступен по именам.
- Инициализировать кластер: kubeadm init.
- Скопировать /etc/kubernetes/admin.conf в $HOME/.kube/config.
- Развернуть CNI (flannel/calico).
- Проверить kube-system поды.
Оператор воркера:
- Установить Docker и отключить swap.
- Установить kubeadm, kubelet, kubectl.
- Запустить kubeadm join с корректным токеном.
- Проверить статус узла на мастере (kubectl get nodes).
Сетевой инженер:
- Проверить, открыты ли порты, требуемые Kubernetes и CNI.
- Убедиться, что выбранный CNI совместим с сетью компании.
SOP: быстрый свод шагов для развёртывания кластера (минимально)
- Настроить /etc/hosts на всех узлах.
- На всех узлах: установить docker, отключить swap, установить kubeadm/kubelet/kubectl.
- На master: kubeadm init …
- На master: скопировать admin.conf в ~/.kube/config.
- На master: kubectl apply -f
. - На воркерах: выполнить kubeadm join.
- На master: kubectl get nodes, kubectl get pods –all-namespaces.
- Протестировать деплой приложения и доступ через сервис.
Критерии приёмки
- Все узлы отображаются в kubectl get nodes со статусом Ready.
- kube-system поды находятся в состоянии Running.
- Деплой nginx создан, 3 пода в статусе Running.
- Сервис NodePort возвращает HTML nginx с каждого воркера.
Отладка и распространённые команды
- Проверка состояния kubelet:
systemctl status kubelet
journalctl -u kubelet -xe- Посмотреть логи проблемного пода:
kubectl logs -n - Проверить подробности объекта:
kubectl describe pod -n
kubectl describe node - Если join токен истёк, сгенерировать новый на master:
kubeadm token create --print-join-command- Проверить CNI-поды и их состояние:
kubectl get pods -n kube-system | grep flannel
kubectl describe daemonset kube-flannel-ds -n kube-systemБезопасность и hardening (рекомендации)
- Отключите ненужные порты и ограничьте доступ к API-серверу через брандмауэр.
- Используйте RBAC и минимальные права для сервисных аккаунтов приложений.
- Разграничьте сети для приложений с помощью сетевых политик (Calico/NetworkPolicy).
- Обновляйте сертификаты и следите за сроком их действия.
Совместимость и примечания по версиям
- В примере использована версия Kubernetes 1.11.0 — это старая версия; перед развёртыванием в продакшн проверьте матрицу совместимости kubeadm/kubelet/kubectl.
- apt-key постепенно считается устаревшим в новых версиях Ubuntu; при необходимости используйте подпись репозитория через signed-by в apt sources.
Тесты и приёмочные критерии (короткий список тест-кейсов)
- kubeadm init возвращает успешный вывод и предлагает join-команду.
- kubectl get nodes показывает 3 узла: 1 master, 2 worker, все Ready.
- kubectl get pods –all-namespaces показывает Running для kube-system.
- curl
: возвращает страницу nginx.
Короткий глоссарий (1 строка на термин)
- Pod: минимальная единица развертывания в Kubernetes, содержащая один или несколько контейнеров.
- Node: сервер (виртуальная/физическая машина), на котором запущены поды.
- Deployment: контроллер, управляющий состоянием набора реплик приложения.
- Service: абстракция, предоставляющая стабильный доступ к набору подов.
Ссылки и ресурсы
- Официальная документация Kubernetes: https://kubernetes.io/docs/home/
Краткое резюме
Kubernetes успешно развернут на трёх Ubuntu 18.04 серверах с помощью kubeadm и Flannel. Мы подготовили хосты, установили Docker и kubeadm, инициализировали мастер, добавили два воркера и протестировали кластер с помощью приложения nginx и сервиса NodePort. Следующим шагом можно заменить Flannel на более функциональный CNI (Calico) и внедрить политики безопасности и мониторинг.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента