infra
infra copied to clipboard
:rocket: Персональный кластер Kubernetes. DevOps, GitOps, IaC вот это всё
Infra (Home Kubernetes)
Конфигурация моего персонального кластера Kubernetes с использованием методологий Infrastructure-as-Code и GitOps.
- Предыдущая версия на основе Docker внутри LXC, без k8s - spirkaa/ansible-homelab.
- Для вдохновения можно посмотреть, как делают другие - k8s-at-home.
Обзор
Основные компоненты разделены по директориям:
- ansible - роли для настройки шаблонов ВМ, первоначального запуска кластера c помощью kubeadm, обновления секретов Vault.
- сluster - конфигурация приложений в виде чартов Helm, kustomize и простых манифестов k8s, разворачиваемых с помощью ArgoCD.
- packer - создание шаблонов ВМ.
- terraform - запуск, настройка и управление жизненным циклом ВМ в кластере.
Скриншоты
![]() |
![]() |
|---|---|
| Dashy | Proxmox |
![]() |
![]() |
| ArgoCD | Vault |
![]() |
![]() |
| Gitea | Jenkins |
![]() |
![]() |
| Longhorn | Minio |
![]() |
![]() |
| LibreNMS | Grafana |
Железо
Хосты работают на Proxmox в составе кластера.
- 1x Custom NAS (Fractal Design Define R6, Corsair RM650x)
- 2x Lenovo IdeaCentre G5-14IMB05
- Intel Core i5-10400
- 32GB DDR4
- 1TB NVMe SSD (LVM)
- 512GB NVMe SSD (LVM)
- 1x Ubiquiti EdgeRouter X
- 1x Ubiquiti EdgeSwitch 24 Lite
- 1x CyberPower CP900EPFC
Внешние сервисы
- DNS - selectel.ru. Бесплатный, есть API и вебхук для cert-manager.
- VPS - sale-dedic.com.
- Мониторинг выполнения cron - healthchecks.io.
- Мониторинг доступности сервисов - uptimerobot.com.
- Сертификаты - letsencrypt.org.
Компоненты кластера Kubernetes
Виртуальные машины Ubuntu 22.04
- 3x Control Plane (2 vCPU, 4 GB)
- 3x Worker (4/6 vCPU, 16 GB)
- 2x Control Plane Load Balancer (1 vCPU, 1 GB)
База
Сеть
- Calico
- MetalLB
- ingress-nginx
- cert-manager + cert-manager-webhook-selectel
- Keepalived + HAProxy вне кластера для Control Plane
- consul
Хранилище
Observability (логи, метрики, трейсы, алерты)
CI/CD, GitOps
Secrets
Auth
Backup
Утилиты
Полезные нагрузки (пользовательские приложения)
Мои разработки
Частное облако
Медиа-сервер
Управление
Запуск кластера
Требования
- Сервер Proxmox
- Клиент Linux с установленными
gitиdockerдля запуска контейнера с утилитами
Алгоритм запуска
-
Клонировать репозиторий
git clone --recurse-submodules https://github.com/spirkaa/infra -
Перейти в каталог
cd infra -
Скопировать env-файл
cp .env.example .env -
Указать необходимые значения в env-файле
nano .env -
Проверить/изменить значения переменных
- ansible/roles/**/**/defaults/main.yml
- packer/variables.pkr.hcl
- terraform/locals.tf
-
Собрать образ с утилитами и запустить контейнер
make tools -
Запустить развертывание кластера
make cluster
После запуска автоматически выполняются следующие шаги:
| Описание | Инструменты | |
|---|---|---|
| 8 | Создать пользователя для API Proxmox | Ansible |
| 9 | Подготовить шаблоны ВМ | Packer, Ansible |
| 10 | Создать ВМ из шаблонов, развернуть кластер | Terraform, Ansible |
| 11 | Развернуть приложения в кластере | ArgoCD |
Пользователь для доступа Packer и Terraform к API Proxmox
Создать пользователя можно с помощью роли pve/api_user или вручную, выполнив команды в консоли сервера Proxmox и сохранив вывод последней. Для работы с кластером Proxmox назначены дополнительные права, не указанные в документации провайдера telmate/proxmox
pveum role add Provisioner -privs "Datastore.AllocateSpace Datastore.Audit Pool.Allocate Pool.Audit Sys.Audit Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Console VM.Monitor VM.PowerMgmt"
pveum user add hashicorp@pve
pveum aclmod / -user hashicorp@pve -role Provisioner
pveum user token add hashicorp@pve packer-terraform --privsep 0
Базовый шаблон ВМ (cloud-init)
Подготовка выполняется в 2 этапа:
- Ansible скачивает образ Ubuntu Cloud, с помощью
virt-customizeустанавливает в образ пакетqemu-guest-agentи сбрасываетmachine-id, создает ВМ в Proxmox и импортирует образ (но не запускает), преобразует ВМ в шаблон. Готовый шаблон должен оставаться в системе для идемпотентности. - Packer клонирует шаблон из п.1, запускает ВМ, настраивает с помощью Ansible, преобразует в шаблон.
Разворачивание ВМ из шаблона выполняется с помощью Terraform.
Выключение/перезагрузка ноды
-
Снять нагрузку
kubectl drain k8s-worker-01 --ignore-daemonsets --delete-emptydir-data --pod-selector='app!=csi-attacher,app!=csi-provisioner' -
Настроить заглушку уведомлений в Alertmanager
-
После включения разрешить нагрузку
kubectl uncordon k8s-worker-01
Замена ноды
-
Снять нагрузку
kubectl drain k8s-controlplane-02 --ignore-daemonsets --delete-emptydir-data --pod-selector='app!=csi-attacher,app!=csi-provisioner' -
Удалить из k8s
kubectl delete node k8s-controlplane-02 -
Удалить из кластера etcd (для control plane)
Получить список и скопировать нужный <MEMBER_ID>
kubectl -n kube-system exec -it etcd-k8s-controlplane-04 -- sh -c 'ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key" member list -w table'Удалить участника <MEMBER_ID>
kubectl -n kube-system exec -it etcd-k8s-controlplane-04 -- sh -c 'ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key" member remove <MEMBER_ID>' -
Удалить и добавить ноду через Terraform
Дефрагментация etcd
https://etcd.io/docs/v3.5/op-guide/maintenance/#defragmentation
kubectl -n kube-system exec -it etcd-k8s-controlplane-04 -- sh -c 'ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key" defrag --cluster'









