Гид по технологиям

Установка и настройка Kubernetes на Ubuntu 18.04

• 7 min read • Kubernetes • Обновлено 25 Nov 2025
Kubernetes на Ubuntu 18.04 — установка и настройка
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 должны быть доступны)

Что мы будем делать

  1. Подготовить хосты и установить Docker
  2. Отключить swap
  3. Установить kubeadm, kubelet, kubectl
  4. Инициализировать мастер и развернуть Flannel
  5. Добавить воркеры в кластер
  6. Развернуть тестовый 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 docker

Docker установлен и запущен.

Скриншот: установка Docker и запуск службы

Отключение 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

Дождитесь завершения установки.

Скриншот: установка пакетов 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.yml

Flannel будет создан в пространстве имён kube-system. Подождите минуту или две и проверьте состояние узлов и подов:

kubectl get nodes
kubectl get pods --all-namespaces

Должны быть видны мастер и системные поды (kube-dns, kube-proxy, flannel и т. п.) в состоянии Running.

Скриншот: развёрнутый flannel и состояние подов

Скриншот: список узлов Kubernetes

Шаг 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, запущенные на воркерах.

Скриншот: деплой 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.

Скриншот: тест nginx с curl на worker01

Скриншот: тест nginx с curl на worker02

Поздравляем — базовая установка кластера 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: быстрый свод шагов для развёртывания кластера (минимально)

  1. Настроить /etc/hosts на всех узлах.
  2. На всех узлах: установить docker, отключить swap, установить kubeadm/kubelet/kubectl.
  3. На master: kubeadm init …
  4. На master: скопировать admin.conf в ~/.kube/config.
  5. На master: kubectl apply -f .
  6. На воркерах: выполнить kubeadm join.
  7. На master: kubectl get nodes, kubectl get pods –all-namespaces.
  8. Протестировать деплой приложения и доступ через сервис.

Критерии приёмки

  • Все узлы отображаются в 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 успешно развернут на трёх Ubuntu 18.04 серверах с помощью kubeadm и Flannel. Мы подготовили хосты, установили Docker и kubeadm, инициализировали мастер, добавили два воркера и протестировали кластер с помощью приложения nginx и сервиса NodePort. Следующим шагом можно заменить Flannel на более функциональный CNI (Calico) и внедрить политики безопасности и мониторинг.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро