Конфигурация моего персонального кластера 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.
- 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
- Сервер 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 |
Создать пользователя можно с помощью роли 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
Подготовка выполняется в 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
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'