/infra

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

Primary LanguageHCLMIT LicenseMIT

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'