Категории

Установка и настройка кластера Kubernetes на Ubuntu Server

2025-08-22 11:12:28 | Linux
Установка и настройка кластера Kubernetes на Ubuntu Server

Зачем вообще нужен кластер Kubernetes?

Если ты админ, DevOps или просто интересуешься современными технологиями — важно понимать: Kubernetes — это не просто "модная штука". Это инструмент, который решает реальные задачи, с которыми сталкиваются все, у кого сервисы выходят за рамки одного сервера.

Представь такую ситуацию

У тебя есть веб-приложение (сайт, API, бэкенд). Оно работает на одном сервере. Всё хорошо, пока:

  • _traffic_ резко вырос (реклама, хайп, пятница вечером);
  • сервер упал, и сайт пропал на час;
  • ты не можешь обновить приложение без downtime (пользователи видят ошибку);
  • база данных, сайт и почтовый сервис — всё на одном железе, и они мешают друг другу.

Вот тут и приходит Kubernetes.

Что делает кластер?

Он превращает несколько серверов в единый "суперкомпьютер", который умеет:

  1. Автоматически масштабироваться
    При росте нагрузки — добавляет новые копии приложения. Когда нагрузка падает — убирает лишние. Ты не встаёшь ночью, чтобы "поднять ещё один сервер".
  2. Сам восстанавливаться
    Если один сервер упал — Kubernetes перезапустит твои приложения на других. Пользователи даже не заметят.
  3. Обновляться без остановки
    Можно обновить приложение, и оно будет работать без downtime. Kubernetes постепенно заменит старые версии на новые.
  4. Управлять сложными приложениями
    Ты можешь разбить свой сервис на части (микросервисы): отдельно — корзина, оплата, каталог. Kubernetes следит за всем этим хозяйством.

Простой пример: У тебя магазин. Без кластера — один кассир. Когда очередь — все стоят. С кластером — как в супермаркете: открыли 5 касс, пока очередь большая. Потом закрыли. Всё автоматически.

А если у меня маленький проект?

Даже если у тебя небольшой сервис — знание Kubernetes даёт тебе:

  • Понимание, как работают настоящие production-системы;
  • Возможность быстро развёртывать и тестировать приложения;
  • Готовность к росту: когда твой проект станет популярным — ты уже будешь знать, как его масштабировать.

Кластер Kubernetes — это не про "много серверов". Это про надёжность, автоматизацию и готовность к росту.

В этом руководстве мы создадим 3-нодный кластер Kubernetes вручную на Ubuntu Server: один мастер (control-plane) и два рабочих узла (workers). Это отличная практика для понимания внутреннего устройства K8s.

Мы используем актуальные версии и учтём, что старые репозитории Kubernetes больше не работают.

План установки

  1. Подготовка системы
  2. Установка Docker
  3. Установка компонентов Kubernetes (kubelet, kubeadm, kubectl)
  4. Создание кластера (init + join)
  5. Настройка CNI (Flannel)
  6. Работа с подами, деплойментами и сервисами
  7. Установка Ingress Controller (Contour)
  8. Установка веб-интерфейса (Kubernetes Dashboard)
  9. Удаление ноды из кластера

Подготовка системы

Все действия выполняются на всех узлах: k8s-master1.kubecluster.local, k8s-worker1.kubecluster.local, k8s-worker2.kubecluster.local.

1. Системные требования

  • 2+ CPU
  • 2+ ГБ RAM
  • Уникальные MAC-адрес и product_uuid
  • Сетевая доступность между узлами

2. Настройка имён и hosts

# На master:
sudo hostnamectl set-hostname k8s-master1.kubecluster.local

# На worker1:
sudo hostnamectl set-hostname k8s-worker1.kubecluster.local

# На worker2:
sudo hostnamectl set-hostname k8s-worker2.kubecluster.local

Добавь записи в /etc/hosts на всех узлах:

sudo vi /etc/hosts
# Добавь:
192.168.0.15    k8s-master1.kubecluster.local k8s-master1
192.168.0.20    k8s-worker1.kubecluster.local k8s-worker1
192.168.0.25    k8s-worker2.kubecluster.local k8s-worker2

3. Обновление системы и установка утилит

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https git net-tools

4. Отключение swap

Кубернетес не рекомендует использовать swap. Это может вызвать нестабильность.
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

5. Загрузка модулей ядра

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
EOF

sudo modprobe br_netfilter
sudo modprobe overlay

6. Настройка параметров ядра

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

Установка и настройка Docker

Контейнерный runtime обязателен. Мы используем Docker с containerd.
sudo apt install -y docker.io
sudo systemctl enable docker
sudo usermod -aG docker $USER

Настройка cgroupdriver=systemd — критично для стабильной работы!

sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl restart docker

Установка компонентов Kubernetes

Важно! Старые репозитории apt.kubernetes.io и packages.cloud.google.com удалены с 4 марта 2024 года. Используйте только новые репозитории pkgs.k8s.io.

1. Добавление ключа и репозитория

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key

echo 'deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

2. Установка пакетов

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Проверка версии:

kubectl version --client --short

Создание кластера

1. Инициализация master-ноды

Выполняется только на k8s-master1.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

После успешного завершения, выполни команды из вывода, чтобы настроить kubectl:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2. Установка CNI (Flannel)

Без CNI узлы останутся в статусе NotReady.

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

3. Присоединение worker-нод

Сгенерируй команду на мастере:

kubeadm token create --print-join-command

Выполни полученную команду на каждом воркере (с правами root).

4. Проверка состояния

kubectl get nodes

Ожидаемый вывод:

NAME                       STATUS   ROLES           AGE   VERSION
k8s-master1.kubecluster.local   Ready    control-plane   5m    v1.30.0
k8s-worker1.kubecluster.local   Ready              2m    v1.30.0
k8s-worker2.kubecluster.local   Ready              1m    v1.30.0

Работа с подами и деплойментами

Создание пода

kubectl run nginx --image=nginx:alpine --port=80

Проброс порта (для теста)

kubectl port-forward pod/nginx --address 0.0.0.0 8080:80

Создание деплоймента

kubectl create deploy myapp --image=httpd:alpine

Масштабирование

kubectl scale deploy/myapp --replicas=3

Автомасштабирование (HPA)

kubectl autoscale deploy/myapp --min=2 --max=5 --cpu-percent=70

Сервисы (Services)

# ClusterIP (внутри кластера)
kubectl expose deploy/myapp --port=80

# NodePort (доступ снаружи)
kubectl expose deploy/myapp --type=NodePort --port=80

Проверка:

kubectl get svc

Установка Ingress Controller (Contour)

Contour — лёгкий и надёжный Ingress-контроллер на базе Envoy.
kubectl apply -f https://projectcontour.io/quickstart/contour.yaml

Установка веб-интерфейса (Kubernetes Dashboard)

1. Установка Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

2. Создание админ-аккаунта

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

3. Получение токена

kubectl -n kubernetes-dashboard create token admin-user

4. Доступ через NodePort

Измени тип сервиса:

kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'

Найди порт:

kubectl get svc -n kubernetes-dashboard

Перейди по https://: и войди по токену.

Удаление ноды из кластера

# На мастере:
kubectl drain k8s-worker2.kubecluster.local --ignore-daemonsets --delete-emptydir-data
kubectl delete node k8s-worker2.kubecluster.local

# На самой ноде:
sudo kubeadm reset

Заключение

Теперь у тебя есть полностью рабочий 3-нодный кластер Kubernetes на Ubuntu с CNI, Ingress и веб-интерфейсом.

Это отличная основа для изучения K8s, CI/CD, Helm, GitOps и других технологий.

Не забывай про обновления безопасности и мониторинг в продакшене!

Инструкция основана на официальной документации Kubernetes и адаптирована под современные реалии.

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион