Skip to content
/ infra Public

🚀 Персональный кластер Kubernetes. DevOps, GitOps, IaC вот это всё

License

Notifications You must be signed in to change notification settings

spirkaa/infra

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Apr 26, 2025
3a56152 · Apr 26, 2025
Apr 19, 2025
Apr 26, 2025
May 20, 2024
Jul 23, 2022
Apr 6, 2025
Mar 25, 2022
May 20, 2024
Dec 11, 2024
May 27, 2024
Mar 16, 2022
Jan 25, 2025
Apr 6, 2025
Aug 22, 2022
Jul 1, 2024
Feb 13, 2022
Nov 23, 2024
Jul 10, 2024
Mar 22, 2025
May 10, 2022

Repository files navigation

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 - запуск, настройка и управление жизненным циклом ВМ в кластере.

Скриншоты

01 02
Dashy Proxmox
03 04
ArgoCD Vault
05 06
Gitea Jenkins
07 08
Longhorn Minio
09 10
LibreNMS Grafana

Железо

Хосты работают на Proxmox в составе кластера.

  • 1x Custom NAS (Fractal Design Define R6, Corsair RM650x)
    • Intel Xeon E3-1230 v5
    • 64GB DDR4 ECC UDIMM
    • 1TB NVMe SSD (LVM)
    • 512GB NVMe SSD (LVM)
    • 2x 20TB, 3x 18TB HDD (MergerFS + SnapRAID)
    • 2x 12TB HDD (ZFS mirror)
  • 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

Внешние сервисы

Компоненты кластера 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)

База

Сеть

Хранилище

Observability (логи, метрики, трейсы, алерты)

CI/CD, GitOps

Secrets

Auth

Backup

Утилиты

Полезные нагрузки (пользовательские приложения)

Мои разработки

Частное облако

Медиа-сервер

Управление

Запуск кластера

Требования

  • Сервер Proxmox
  • Клиент Linux с установленными git и docker для запуска контейнера с утилитами

Алгоритм запуска

  1. Клонировать репозиторий

    git clone --recurse-submodules https://github.com/spirkaa/infra

  2. Перейти в каталог

    cd infra

  3. Скопировать env-файл

    cp .env.example .env

  4. Указать необходимые значения в env-файле

    nano .env

  5. Проверить/изменить значения переменных

  6. Собрать образ с утилитами и запустить контейнер

    make tools

  7. Запустить развертывание кластера

    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 этапа:

  1. Ansible скачивает образ Ubuntu Cloud, с помощью virt-customize устанавливает в образ пакет qemu-guest-agent и сбрасывает machine-id, создает ВМ в Proxmox и импортирует образ (но не запускает), преобразует ВМ в шаблон. Готовый шаблон должен оставаться в системе для идемпотентности.
  2. Packer клонирует шаблон из п.1, запускает ВМ, настраивает с помощью Ansible, преобразует в шаблон.

Разворачивание ВМ из шаблона выполняется с помощью Terraform.

Выключение/перезагрузка ноды

  1. Снять нагрузку

    kubectl drain k8s-worker-01 --ignore-daemonsets --delete-emptydir-data --pod-selector='app!=csi-attacher,app!=csi-provisioner'
  2. Настроить заглушку уведомлений в Alertmanager

  3. После включения разрешить нагрузку

    kubectl uncordon k8s-worker-01

Замена ноды

  1. Снять нагрузку

    kubectl drain k8s-controlplane-02 --ignore-daemonsets --delete-emptydir-data --pod-selector='app!=csi-attacher,app!=csi-provisioner'
  2. Удалить из k8s

    kubectl delete node k8s-controlplane-02
  3. Удалить из кластера 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>'
  4. Удалить и добавить ноду через 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'