https://github.com/hfrog/otus-k8s
Yandex Cloud
ОС Ubuntu 20.04
Kubernetes 1.28
Виртуальные машины устанавливает Terraform. Кластер Kubenetes устанавливается скриптами с помощью kubeadm. Доступ к API реализован через haproxy с балансировкой нагрузки на мастеры.
CNI - Cilium. Планировал настроить BGP, но облако не пропускает трафик для сетей, отличных от сети виртуалок. Единственный вариант - статический маршрут в облаке, так я смаршрутизировал сеть LoadBalancer на мастер, чтобы ingress был доступен с haproxy.
CSI - csi-s3 с хранением данных в Yandex Object Storage.
Для маршрутизации HTTP/HTTPS используется ingress-nginx, для автоматического получения сертификатов - cert-manager, staging чтобы не превышать лимиты при отладке.
Для сбора, хранения и отображения метрик используется стек Prometheus+Grafana, а для логов - Loki+Promtail, отображение также Grafana.
Для демонстрации работоспособности системы используется microservices-demo, тестовый сайт доступен по адресу https://msd-dev.51.250.96.180.hfrog.ru
Приложение деплоится с помощью werf.
Для хранения образов используется Yandex Container Registry.
Система не требует ручной донастройки и готова к работе сразу же по окончании работы установочных задач.
GitHub Actions
Настроены три workflow:
- terraform
- k8s-cluster
- app
Workflows запускаются руками.
Все секретные ключи, пароли, идентификаторы хранятся в секретах GitHub и не видны в выводе GitHub Actions.
Для передачи динамической информации между задачами в GitHub Actions, например адресов ВМ и конфига kubectl, используется Yandex Object Storage.
- Хранит состояние в Yandex Object Storage
- Настраивает статический маршрут для сети сервисов типа LoadBalancer на адрес мастера
- Кол-во мастеров и воркеров задаётся переменными, скрипты установки умеют добавлять в кластер Kubernetes тех и других
- Доступ снаружи ограничен портами 22, 80, 443, 6443
Первый мастер устанавливается с помощью kubeadm init
.
Остальные мастера и воркеры добавляются в кластер командами соответственно kubeadm join --control-plane
либо kubeadm join
.
Токены и другая информация, необходимая для подключения, вычисляется автоматически.
Терраформом зарезервирован для ВМ c haproxy статический адрес, который не меняется при остановке ВМ.
Haproxy настраивается скриптами в зависимости от адресов ВМ и сети LoadBalancer.
Grafana доступна снаружи по адресу https://grafana.51.250.96.180.hfrog.ru, пароль у меня.
Доски для ingress-nginx и логов создаются автоматически через ConfigMap, а для Kubernetes, Cilium, Loki, Prometeus включены встроенные доски.
Созданы зависимые чарты по всем микросервисам, импортированы исходники образов. Werf собирает все образы и деплоит приложение одним запуском werf converge
.
Микросервис loadgenerator
для запуска требует frontend
. Для того, чтоб он запускался без ошибок, ему средствами werf понижен приоритет деплоя.
Время развёртывания от начала до конца - 20 минут
- перейти на Ubuntu 22.04 и Kubernetes 1.29
- переделать скрипты на Ansible
- попробовать Deckhouse