:rocket: Персональный кластер Kubernetes. DevOps, GitOps, IaC вот это всё
Конфигурация моего персонального кластера Kubernetes с использованием методологий Infrastructure-as-Code и GitOps.
Основные компоненты разделены по директориям:
Dashy | Proxmox |
ArgoCD | Vault |
Gitea | Jenkins |
Longhorn | Minio |
LibreNMS | Grafana |
Хосты работают на Proxmox в составе кластера.
git
и docker
для запуска контейнера с утилитамиКлонировать репозиторий
git clone --recurse-submodules https://github.com/spirkaa/infra
Перейти в каталог
cd infra
Скопировать env-файл
cp .env.example .env
Указать необходимые значения в env-файле
nano .env
Проверить/изменить значения переменных
Собрать образ с утилитами и запустить контейнер
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 этапа:
virt-customize
устанавливает в образ пакет qemu-guest-agent
и сбрасывает machine-id
, создает ВМ в Proxmox и импортирует образ (но не запускает), преобразует ВМ в шаблон. Готовый шаблон должен оставаться в системе для идемпотентности.Разворачивание ВМ из шаблона выполняется с помощью 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'