Giter Site home page Giter Site logo

7u4 / infra Goto Github PK

View Code? Open in Web Editor NEW

This project forked from spirkaa/infra

0.0 0.0 0.0 717 KB

Домашний кластер Kubernetes. DevOps, GitOps, IaC вот это всё

License: MIT License

Shell 12.85% Makefile 18.06% Smarty 1.78% HCL 43.67% Dockerfile 1.38% Jinja 22.26%

infra's Introduction

Infra (Home Kubernetes)

Конфигурация моего домашнего кластера Kubernetes с использованием методологий Infrastructure-as-Code и GitOps.

  • Предыдущая версия на основе Docker внутри LXC, без k8s - spirkaa/ansible-homelab.
  • Для вдохновения можно посмотреть, как делают другие - awesome-home-kubernetes.

Обзор

Основные компоненты разделены по директориям:

  • 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
    • 512GB NVMe SSD (lvm)
    • 10x 8 TB HDD (mergerfs+snapraid)
    • 2x 12 TB HDD (zfs mirror)
  • 2x Lenovo IdeaCentre G5-14IMB05

    • Intel Core i5-10400
    • 32GB DDR4
    • 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, 1GB)

База

Сеть

Хранилище

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

GitOps

Secrets

Auth

Backup

Утилиты

Пользовательские приложения

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

Требования

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

Пользователь для доступа Packer и Terraform к API Proxmox

Создать пользователя можно с помощью роли pve/api_user или вручную, выполнив команды в консоли сервера 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

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

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

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

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

    cd infra

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

    cp .env.example .env

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

    nano .env

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

    make tools

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

    make cluster

Базовый шаблон ВМ (cloud-init)

Подготовка выполняется в 2 этапа:

  1. Ansible скачивает образ Ubuntu Cloud, с помощью virt-customize устанавливает в него пакет qemu-guest-agent, создает ВМ в 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'

infra's People

Contributors

spirkaa avatar renovate-bot avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.