Зачем вообще нужен кластер Kubernetes?
Если ты админ, DevOps или просто интересуешься современными технологиями — важно понимать: Kubernetes — это не просто "модная штука". Это инструмент, который решает реальные задачи, с которыми сталкиваются все, у кого сервисы выходят за рамки одного сервера.
Представь такую ситуацию
У тебя есть веб-приложение (сайт, API, бэкенд). Оно работает на одном сервере. Всё хорошо, пока:
- _traffic_ резко вырос (реклама, хайп, пятница вечером);
- сервер упал, и сайт пропал на час;
- ты не можешь обновить приложение без downtime (пользователи видят ошибку);
- база данных, сайт и почтовый сервис — всё на одном железе, и они мешают друг другу.
Вот тут и приходит Kubernetes.
Что делает кластер?
Он превращает несколько серверов в единый "суперкомпьютер", который умеет:
- Автоматически масштабироваться
При росте нагрузки — добавляет новые копии приложения. Когда нагрузка падает — убирает лишние. Ты не встаёшь ночью, чтобы "поднять ещё один сервер". - Сам восстанавливаться
Если один сервер упал — Kubernetes перезапустит твои приложения на других. Пользователи даже не заметят. - Обновляться без остановки
Можно обновить приложение, и оно будет работать без downtime. Kubernetes постепенно заменит старые версии на новые. - Управлять сложными приложениями
Ты можешь разбить свой сервис на части (микросервисы): отдельно — корзина, оплата, каталог. Kubernetes следит за всем этим хозяйством.
Простой пример: У тебя магазин. Без кластера — один кассир. Когда очередь — все стоят. С кластером — как в супермаркете: открыли 5 касс, пока очередь большая. Потом закрыли. Всё автоматически.
А если у меня маленький проект?
Даже если у тебя небольшой сервис — знание Kubernetes даёт тебе:
- Понимание, как работают настоящие production-системы;
- Возможность быстро развёртывать и тестировать приложения;
- Готовность к росту: когда твой проект станет популярным — ты уже будешь знать, как его масштабировать.
Кластер Kubernetes — это не про "много серверов". Это про надёжность, автоматизацию и готовность к росту.
В этом руководстве мы создадим 3-нодный кластер Kubernetes вручную на Ubuntu Server: один мастер (control-plane) и два рабочих узла (workers). Это отличная практика для понимания внутреннего устройства K8s.
Мы используем актуальные версии и учтём, что старые репозитории Kubernetes больше не работают.
План установки
- Подготовка системы
- Установка Docker
- Установка компонентов Kubernetes (kubelet, kubeadm, kubectl)
- Создание кластера (init + join)
- Настройка CNI (Flannel)
- Работа с подами, деплойментами и сервисами
- Установка Ingress Controller (Contour)
- Установка веб-интерфейса (Kubernetes Dashboard)
- Удаление ноды из кластера
Подготовка системы
Все действия выполняются на всех узлах: 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 и адаптирована под современные реалии.
Комментарии
Пока нет комментариев. Будьте первым!