Kubernetes для homelab: пошаговое освоение контейнеров
Отличное руководство по освоению Kubernetes в домашних условиях. От сложной теории до практического развертывания приложений в вашем self-hosting окружении.
Введение в Kubernetes
Kubernetes (K8s) — система для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Может использоваться не только в корпоративной среде, но и дома для обучения и развертывания проектов.
Подготовка системы
Обновляем систему и устанавливаем необходимые пакеты, добавляем репозиторий Docker и устанавливаем Docker.
sudo apt update
sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl gnupg
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USERОтключение swap
Kubernetes не работает с включенным swap, поэтому необходимо его отключить.
sudo swapoff -a
sudo sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstabУстановка компонентов Kubernetes
Добавляем репозиторий Kubernetes и устанавливаем kubeadm, kubelet и kubectl.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectlИнициализация кластера
Запускаем инициализацию управляющей ноды и настраиваем доступ для kubectl.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
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/flannel-io/flannel/master/Documentation/kube-flannel.ymlПроверка кластера
Проверяем, что все поды в пространстве имен kube-system перешли в состояние Running, и статус ноды.
kubectl get pods -n kube-system
kubectl get nodesРазвертывание первого приложения
Создаем деплоймент с NGINX и сервис для доступа к нему извне.
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svcМасштабирование приложения
Увеличиваем количество подов NGINX до трех для демонстрации горизонтального масштабирования.
kubectl scale deployment nginx --replicas=3
kubectl get podsУправление кластером
Основные команды для просмотра ресурсов, логов pod'ов и входа внутрь pod.
kubectl get all
kubectl describe deployment nginx
kubectl logs <имя_пода>
kubectl logs -f <имя_пода>
kubectl exec -it <имя_пода> -- /bin/bashМониторинг кластера
Устанавливаем метрический сервер для просмотра использования ресурсов подами.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top podsKubernetes - это зверь для изучения, но когда он запущен, это действительно приятно
Kubernetes (часто сокращенно K8s) — это мощная система для автоматизации развёртывания, масштабирования и управления контейнеризированными приложениями. На первый взгляд может показаться, что это что-то из разряда корпоративных решений, требующих целых отделов специалистов. Но на самом деле, при правильном подходе, Kubernetes можно запустить и у себя дома, чтобы получить опыт работы с этой технологией, а также удобно развёртывать свои проекты.
Что нам понадобится
Прежде чем начать, определим минимальные требования для домашнего кластера Kubernetes:
- Достаточно мощная машина: Рекомендуется минимум 2 ядра процессора и 4 ГБ оперативной памяти для управляющей ноды. Если планируете развёртывать рабочие нагрузки, лучше 4 ядра и 8 ГБ RAM.
- Операционная система: Ubuntu 20.04 LTS или Debian 11 — наиболее проверенные варианты. Можно использовать CentOS/RHEL, но они потребуют дополнительных действий с SELinux.
- Контейнерный рантайм: Docker — самый распространённый вариант, но Kubernetes работает с различными рантаймами.
- Интернет: Для загрузки образов и пакетов.
Для начала достаточно одного компьютера, где будет управляющая нода. Позже можно добавить рабочие ноды, когда разберётесь с основами.
Выбор способа установки
Существует несколько популярных способов установки Kubernetes в домашних условиях:
- kubeadm — официальный инструмент от Kubernetes для создания кластеров "с нуля". Требует больше ручной настройки, но даёт полное понимание того, как устроен кластер.
- k3s — облегчённая версия Kubernetes от Rancher, оптимизированная для работы на ресурсах. Идеально для домашнего использования.
- minikube — инструмент для запуска однонодочного кластера Kubernetes на вашем локальном компьютере. Отлично подходит для обучения.
В этой статье мы рассмотрим установку через kubeadm, так как она даёт наиболее полное понимание Kubernetes, хотя требует чуть больше усилий.
Установка через kubeadm
Шаг 1: Подготовка системы
Сначала обновим систему и установим необходимые пакеты:
sudo apt update
sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl gnupg
Добавим репозиторий Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Установим Docker:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
Добавляем текущего пользователя в группу docker:
sudo usermod -aG docker $USER
Выйдите и войдите снова, чтобы изменения вступили в силу.
Шаг 2: Отключение swap
Kubernetes не работает с включённым swap. Отключим его:
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Шаг 3: Установка kubeadm, kubelet и kubectl
Добавляем репозиторий Kubernetes:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
Устанавливаем компоненты:
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Шаг 4: Инициализация кластера
Запускаем инициализацию управляющей ноды:
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
Шаг 5: Установка сетевого плагина
Без сетевого плагина поды не смогут общаться друг с другом. Установим Flannel — один из самых простых вариантов:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Шаг 6: Проверка кластера
Дождитесь, пока все поды в пространстве имён kube-system перейдут в состояние Running:
kubectl get pods -n kube-system
Проверим статус нод:
kubectl get nodes
Должна быть одна нода со статусом Ready.
Первые шаги в Kubernetes
Теперь, когда кластер запущен, давайте развёрнем наше первое приложение.
Развёртывание NGINX
Создадим простой деплоймент с NGINX:
kubectl create deployment nginx --image=nginx
Проверим, что под запущен:
kubectl get pods
Создадим сервис для доступа к NGINX извне:
kubectl expose deployment nginx --port=80 --type=NodePort
Проверим созданный сервис:
kubectl get svc
Теперь можно получить доступ к NGINX, используя IP-адрес управляющей ноды и порт из поля NodePort.
Масштабирование приложения
Увеличим количество подов NGINX до трёх:
kubectl scale deployment nginx --replicas=3
Проверим результат:
kubectl get pods
Управление кластером
Просмотр ресурсов
Для просмотра всех ресурсов в кластере используйте:
kubectl get all
Для получения более подробной информации о конкретном ресурсе:
kubectl describe deployment nginx
Логи подов
Для просмотра логов конкретного пода:
kubectl logs <имя_пода>
Для просмотра логов в реальном времени:
kubectl logs -f <имя_пода>
Вход в под
Для интерактивного доступа внутрь пода:
kubectl exec -it <имя_пода> -- /bin/bash
Мониторинг кластера
Для базового мониторинга можно установить метрический сервер:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
После установки метрического сервера можно посмотреть использование ресурсов подами:
kubectl top pods
Более продвинутый вариант — установка Prometheus с Grafana, но это уже отдельная большая тема.
Заключение
Запуск Kubernetes дома — это отличный способ получить практический опыт работы с этой системой, не тратя деньги на облачные сервисы. Конечно, этот гид охватывает только основы, но он даёт прочную базу для дальнейшего изучения.
Следующие шаги могут включать:
- Добавление рабочих нод для создания настоящего кластера
- Изучение контроллеров входа для доступа к приложениям
- Работа с PersistentVolume для сохранения данных
- Использование операторов Helm для управления приложениями
- Настройка непрерывной интеграции и развёртывания
Kubernetes действительно сложен, но каждый час, потраченный на его изучение, окупится с лихвой, когда вы увидите, как элегантно он решает задачи по управлению контейнеризированными приложениями.