ноды в кластере что это
Что такое Pods, Nodes, Containers и Clusters в Kubernetes
Kubernetes (k8s) очень стремительно становится новым стандартом для деплоймента и менеджмента вашего кода в клауде. Вместе с тем, сколько фич предоставляет k8s, для новичка наступает высокий порог входа в новую технологии.
Документация по k8s достаточно обширна и довольно сложно пройти ее всю. Именно по этому эта статья служит неким обобщением для того, чтобы разобрать основные модули kubernetes.
Hardware
Nodes
Если обсуждать про машину как «ноду», можем разбавить это слоем абстракции, мы можем представлять ее как некий набор CPU, RAM ресурсов которые можно использовать. Таким образом любая такая машина может заменить любую другую машину как k8s кластер.
Cluster
Хотя работа с отдельными нодами может быть полезной, это не путь kubernetes. В общем, вы должны думать о кластере в целом, а не беспокоиться о состоянии отдельных нодов.
В Kubernetes ноды объединяют свои ресурсы для формирования более мощной машины. Когда вы развертываете программы в кластере, он балансирует нагрузку по индивидуальным нодам для вас. Если какие-либо nodes добавляются или удаляются, кластер будет перемещаться по мере необходимости. Для программы или девелопера не должно быть важно, на каких машинах выполняется код в k8s. Можно сравнить такую систему с улием.
Persistent Volumes
Поскольку программы, работающие в вашем кластере, не гарантированно выполняются на определенной ноде, данные не могут быть сохранены в любом произвольном месте в файловой системе. Если программа пытается сохранить данные в файл, но затем перемещается на новую ноду, файл больше не будет там, где программа ожидает его. По этой причине традиционное локальное хранилище, связанное с каждой нодой, рассматривается как временный кэш для хранения программ, но нельзя ожидать, что любые данные, сохраненные локально, сохранятся.
Software
Контейнеры
Программы, работающие на Kubernetes, упаковуются в контейнеры. Контейнеры являются общепринятым стандартом, поэтому уже есть много готовых образов, которые можно развернуть в Kubernetes.
Контейнеризация позволяет вам создавать self-contained environments. Любая программа и все ее зависимости могут быть объединены в один файл и затем опубликованы в Интернете. Любой может загрузить контейнер и развернуть его в своей инфраструктуре с минимальными настройками. Создание контейнера может быть сделано и скриптом, позволяя строить CI/CD пайплайны.
Несколько программ могут быть развернуты в одном контейнере, но вы должны ограничить себя одним процессом на контейнер, если это вообще возможно. Лучше иметь много маленьких контейнеров, чем один большой. Если каждый контейнер имеет четкую направленность, обновления легче развертывать, а проблемы легче диагностировать.
В отличие от других систем, которые вы, возможно, использовали в прошлом, Kubernetes не запускает контейнеры напрямую; вместо этого он упаковывает один или несколько контейнеров в структуру более высокого уровня, называемую pod. Любые контейнеры в одном pod’e будут использовать одни и те же ресурсы и локальную сеть. Контейнеры могут легко связываться с другими контейнерами в том же pod’e, как если бы они находились на одной машине, сохраняя степень изоляции от других pod’ов.
Pod’ы используются как единица репликации в Kubernetes. Если ваше приложение становится слишком популярным, и один экземпляр модуля не может нести нагрузку, Kubernetes можно настроить для развертывания новых реплик вашего модуля в кластере по мере необходимости. Даже если не под большой нагрузкой, в продакшинев любое время можно запустить несколько копий модуля в любое время, чтобы обеспечить балансировку нагрузки и устойчивость к сбоям.
Pod’ы могут содержать несколько контейнеров, но вы должны ограничивать их количество, когда это возможно. Поскольку контейнеры масштабируются как единое целое, все контейнеры в паке должны масштабироваться вместе, независимо от их индивидуальных потребностей. Это приводит к потраченным впустую ресурсам и дорогому счету. Чтобы решить эту проблему, Pod’ы должны оставаться меньше на сколько это возможно, обычно вмещая только основной процесс и его тесно связанные вспомогательные контейнеры (эти вспомогательные контейнеры обычно называют Side-cars).
Deployments
Основная цель юзать подход с deployment состоит в том, чтобы настроить, сколько реплик pod’а должно работать одновременно. Когда развертывание добавляется в кластер, оно автоматически деплоит требуемое количество pod’ов и отслеживает их. Если pod умирает, deployment автоматически пересоздает его.
Используя deployment, вам не нужно иметь дело с подами вручную. Вы можете просто объявить желаемое состояние системы, и оно будет управляться автоматически.
Ingress
Используя описанные выше концепции, вы можете создать кластер нодов и запустить деплоймент подов в кластере. Однако есть еще одна проблема, которую необходимо решить: разрешить внешний трафик вашему приложению. По умолчанию Kubernetes обеспечивает изоляцию между модулями и внешним миром. Если вы хотите общаться с сервисом, работающим в pod, вам нужно открыть канал для связи. Это называется Ingress.
Есть несколько способов добавить ingress в ваш кластер. Наиболее распространенными способами являются добавление либо ingress controller, либо LoadBalancer. Описание различий и что лучше выбрать выходит за рамки этой статьи, но вы должны держать в голове что вам нужно разобратся с доступом к сервису, если вы хотите работать с k8s.
Обзор вариантов реализации отказоустойчивых кластеров: Stratus, VMware, VMmanager Cloud
Есть разновидности бизнеса, где перерывы в предоставлении сервиса недопустимы. Например, если у сотового оператора из-за поломки сервера остановится биллинговая система, абоненты останутся без связи. От осознания возможных последствий этого события возникает резонное желание подстраховаться.
Мы расскажем какие есть способы защиты от сбоев серверов и какие архитектуры используют при внедрении VMmanager Cloud: продукта, который предназначен для создания кластера высокой доступности.
Предисловие
В области защиты от сбоев на кластерах терминология в Интернете различается от сайта к сайту. Для того чтобы избежать путаницы, мы обозначим термины и определения, которые будут использоваться в этой статье.
На первый взгляд самый привлекательный вариант для бизнеса тот, когда в случае сбоя обслуживание пользователей не прерывается, то есть кластер непрерывной доступности. Без КНД никак не обойтись как минимум в задачах уже упомянутого биллинга абонентов и при автоматизации непрерывных производственных процессов. Однако наряду с положительными чертами такого подхода есть и “подводные камни”. О них следующий раздел статьи.
Continuous availability / непрерывная доступность
Бесперебойное обслуживание клиента возможно только в случае наличия в любой момент времени точной копии сервера (физического или виртуального), на котором запущен сервис. Если создавать копию уже после отказа оборудования, то на это потребуется время, а значит, будет перебой в предоставлении услуги. Кроме этого, после поломки невозможно будет получить содержимое оперативной памяти с проблемной машины, а значит находившаяся там информация будет потеряна.
Для реализации CA существует два способа: аппаратный и программный. Расскажем о каждом из них чуть подробнее.
Программный способ.
На момент написания статьи самый популярный инструмент для развёртывания кластера непрерывной доступности — vSphere от VMware. Технология обеспечения Continuous Availability в этом продукте имеет название “Fault Tolerance”.
В отличие от аппаратного способа данный вариант имеет ограничения в использовании. Перечислим основные:
Мы не стали расписывать конкретные конфигурации нод: состав комплектующих в серверах всегда зависит от задач кластера. Сетевое оборудование описывать также смысла не имеет: во всех случаях набор будет одинаковым. Поэтому в данной статье мы решили считать только то, что точно будет различаться: стоимость лицензий.
Стоит упомянуть и о тех продуктах, разработка которых остановилась.
Есть Remus на базе Xen, бесплатное решение с открытым исходным кодом. Проект использует технологию микроснэпшотов. К сожалению, документация давно не обновлялась; например, установка описана для Ubuntu 12.10, поддержка которой прекращена в 2014 году. И как ни странно, даже Гугл не нашёл ни одной компании, применившей Remus в своей деятельности.
Предпринимались попытки доработки QEMU с целью добавить возможность создания continuous availability кластера. На момент написания статьи существует два таких проекта.
Первый — Kemari, продукт с открытым исходным кодом, которым руководит Yoshiaki Tamura. Предполагается использовать механизмы живой миграции QEMU. Однако тот факт, что последний коммит был сделан в феврале 2011 года говорит о том, что скорее всего разработка зашла в тупик и не возобновится.
Второй — Micro Checkpointing, основанный Michael Hines, тоже open source. К сожалению, уже год в репозитории нет никакой активности. Похоже, что ситуация сложилась аналогично проекту Kemari.
Таким образом, реализации continuous availability на базе виртуализации KVM в данный момент нет.
Итак, практика показывает, что несмотря на преимущества систем непрерывной доступности, есть немало трудностей при внедрении и эксплуатации таких решений. Однако существуют ситуации, когда отказоустойчивость требуется, но нет жёстких требований к непрерывности сервиса. В таких случаях можно применить кластеры высокой доступности, КВД.
High availability / высокая доступность
В контексте КВД отказоустойчивость обеспечивается за счёт автоматического определения отказа оборудования и последующего запуска сервиса на исправном узле кластера.
В КВД не выполняется синхронизация запущенных на нодах процессов и не всегда выполняется синхронизация локальных дисков машин. Стало быть, использующиеся узлами носители должны быть на отдельном независимом хранилище, например, на сетевом хранилище данных. Причина очевидна: в случае отказа ноды пропадёт связь с ней, а значит, не будет возможности получить доступ к информации на её накопителе. Естественно, что СХД тоже должно быть отказоустойчивым, иначе КВД не получится по определению.
Таким образом, кластер высокой доступности делится на два подкластера:
VMmanager Cloud
Наше решение VMmanager Cloud использует виртуализацию QEMU-KVM. Мы сделали выбор в пользу этой технологии, поскольку она активно разрабатывается и поддерживается, а также позволяет установить любую операционную систему на виртуальную машину. В качестве инструмента для выявления отказов в кластере используется Corosync. Если выходит из строя один из серверов, VMmanager поочерёдно распределяет работавшие на нём виртуальные машины по оставшимся нодам.
В упрощённой форме алгоритм такой:
Практика показывает, что лучше выделить одну или несколько нод под аварийные ситуации и не развёртывать на них ВМ в период штатной работы. Такой подход исключает ситуацию, когда на “живых” нодах в кластере не хватает ресурсов, чтобы разместить все виртуальные машины с “умершей”. В случае с одним запасным сервером схема резервирования носит название “N+1”.
Рассмотрим по каким схемам пользователи VMmanager Cloud реализовывали кластеры высокой доступности.
FirstByte
Компания FirstByte начала предоставлять облачный хостинг в феврале 2016 года. Изначально кластер работал под управлением OpenStack. Однако отсутствие доступных специалистов по этой системе (как по наличию так и по цене) побудило к поиску другого решения. К новому инструменту для управления КВД предъявлялись следующие требования:
Отличительные черты кластера:
Данная конфигурация подходит для хостинга сайтов с высокой посещаемостью, для размещения игровых серверов и баз данных с нагрузкой от средней до высокой.
FirstVDS
Компания FirstVDS предоставляет услуги отказоустойчивого хостинга, запуск продукта состоялся в сентябре 2015 года.
К использованию VMmanager Cloud компания пришла из следующих соображений:
В случае общего отказа Infiniband-сети связь между хранилищем дисков ВМ и вычислительными серверами выполняется через Ethernet-сеть, которая развёрнута на оборудовании Juniper. “Подхват” происходит автоматически.
Благодаря высокой скорости взаимодействия с хранилищем такой кластер подходит для размещения сайтов со сверхвысокой посещаемостью, видеохостинга с потоковым воспроизведением контента, а также для выполнения операций с большими объёмами данных.
Эпилог
Подведём итог статьи. Если каждая секунда простоя сервиса приносит значительные убытки — не обойтись без кластера непрерывной доступности.
Однако если обстоятельства позволяют подождать 5 минут пока виртуальные машины разворачиваются на резервной ноде, можно взглянуть в сторону КВД. Это даст экономию в стоимости лицензий и оборудования.
Кроме этого не можем не напомнить, что единственное средство повышения отказоустойчивости — избыточность. Обеспечив резервирование серверов, не забудьте зарезервировать линии и оборудование передачи данных, каналы доступа в Интернет, электропитание. Всё что только можно зарезервировать — резервируйте. Такие меры исключают единую точку отказа, тонкое место, из-за неисправности в котором прекращает работать вся система. Приняв все вышеописанные меры, вы получите отказоустойчивый кластер, который действительно трудно вывести из строя.
Если вы решили, что для ваших задач больше подходит схема высокой доступности и выбрали VMmanager Cloud как инструмент для её реализации, к вашим услугам инструкция по установке и документация, которая поможет подробно ознакомиться с системой. Желаем вам бесперебойной работы!
P. S. Если у вас в организации есть аппаратные CA-серверы — напишите, пожалуйста, в комментариях кто вы и для чего вы их используете. Нам действительно интересно услышать для каких проектов использование такого оборудование экономически целесообразно 🙂
Управление кластером
Мы рекомендуем производить все действия с нодами, балансировщиками и дисками кластера только через kubectl. При работе в панели управления или через SSH и при включенном автовосстановлении нод все настройки будут сброшены до начального состояния.
Настроить окружение
Экспортируйте в переменную окружения KUBECONFIG путь (
) к ранее скачанному YAML-файлу имя_кластера.yaml.
Проверьте корректность настройки, обратившись к кластеру через kubectl :
Статусы кластера
Все действия по изменению конфигурации кластера через API доступны, когда кластер находится в статусе ACTIVE.
Статус кластера | Описание |
---|---|
ACTIVE | Кластер доступен |
PENDING_CREATE | Кластер создается |
PENDING_ROTATE_CERTS | Происходит обновление сертификатов и ключей для Kubernetes Control Plane |
PENDING_DELETE | Кластер удаляется |
PENDING_RESIZE | Происходит изменение количества нод или групп нод |
PENDING_NODE_REINSTALL | Происходит переустановка одной из нод |
PENDING_UPGRADE_PATCH_VERSION | Происходит обновление кластера до новой патч-версии |
PENDING_UPGRADE_MINOR_VERSION | Происходит обновление кластера до новой минорной версии |
PENDING_UPGRADE_MASTERS_CONFIGURATION | Происходит обновление конфигурации мастер нод |
PENDING_UPGRADE_CLUSTER_CONFIGURATION | Происходит обновление конфигурации кластера |
PENDING_UPDATE_NODEGROUP | Происходит обновление конфигурации группы нод (например, установка меток) |
ERROR | Кластер в нерабочем состоянии, создайте тикет |
MAINTENANCE | Кластер находится в окне обслуживания |
Создать группу нод
Группу нод можно создать при создании кластера Kubernetes или в уже работающем кластере добавить дополнительные группы. В панели управления можно создать кластер только с четырьмя группами нод. Чтобы добавить больше четырёх групп нод, используйте API.
Создать группу нод в панели управления
На время создания группы нод кластер перейдет в статус PENDING_RESIZE.
Созданные ноды отобразятся в разделе Облачная платформа ⟶ Серверы.
Добавьте тейнты — это метки, которые указывают, где нельзя размещать поды. Тейнт состоит из пары ключ-значение и эффекта. Выберите эффект:
Создать группу нод через Terraform
Через Terraform можно создать группу нод в кластере — готовый пример на GitHub.
Изменить конфигурацию нод в группе
Таким же образом, как выше, вы можете изменить конфигурацию через kubectl.
Изменить количество нод в группе
Можно увеличить или уменьшить количество нод в группе.
На время создания или удаления нод кластер перейдет в статус PENDING_RESIZE.
Созданные ноды отобразятся в разделе Облачная платформа ⟶ Серверы. Удаленные ноды, соответственно, перестанут отображаться в списке.
Метки группы нод
Метки помогают отличать ноды одной группы от нод другой группы при работе через kubectl.
На время добавления меток кластер перейдет в статус PENDING_UPDATE_NODEGROUP.
Удалить группу нод
На время удаления группы нод кластер перейдет в статус PENDING_RESIZE.
Удаленные ноды перестанут отображаться в разделе Облачная платформа ⟶ Серверы.
Переустановить ноды
Переустановка всех нод группы может выполняться автоматически через автовосстановление нод. Вы можете переустановить одну или несколько нод вручную.
На время переустановки нод кластер перейдет в статус PENDING_NODE_REINSTALL.
Обновить сертификаты
Каждые 30 дней автоматически обновляются сертификаты, используемые для системных компонентов Kubernetes. Также обновляется сертификат, который находится в файле доступа кластера.
Вы можете использовать Service Account Token — в таком случае для авторизации в Kubernetes API обновлять сертификаты не требуется.
На время обновления сертификатов кластер перейдет в статус PENDING_ROTATE_CERTS. После обновления сертификатов вам необходимо скачать обновленный файл kubeconfig и заново настроить окружение.
Автовосстановление нод
При включенной опции автовосстановления рабочие ноды будут автоматически переустановлены, если они не отвечают на проверки доступности примерно в течение 15 минут. В процессе восстановления поды перестанут запускаться на неработающей ноде и будут перераспределены на другие ноды.
Подключить автовосстановление нод можно при создании кластера в панели управления или подключить и отключить для уже работающего.
Автовосстановление работает сразу для всех нод кластера. Вы можете переустановить только одну ноду.
Если вы меняли конфигурацию нод вручную для некоторых нод, эти изменения будут сброшены до настроек всей группы нод. Также будут отменены настройки, которые не описаны в манифестах кластера.
Автообновление патч-версий
Патч-версии Kubernetes содержат исправление ошибок и уязвимостей безопасности минорной версии Kubernetes. Они совместимы между собой в пределах одной минорной версии. Если автообновление включено, кластер будет обновляться до последней доступной патч-версии во время ближайшего окна обслуживания кластера.
Автообновление недоступно для зональных кластеров.
Подключить автообновление версий можно при создании кластера в панели управления. Вы можете подключить/отключить автообновление для уже работающего кластера.
Обновить версию вручную
Если для кластера не подключено автообновление патч-версий Kubernetes, можно обновить версию вручную.
На время обновления кластер перейдет в статус PENDING_UPGRADE_MINOR_VERSION. Сначала будут обновлены мастер-ноды, а затем рабочие ноды. Процесс обновления одной ноды кластера может занимать несколько минут.
После запуска остановить обновление будет невозможно.
Окно обслуживания
Во время окна обслуживания могут происходить автоматические действия по обслуживанию вашего кластера, автообновления системных сертификатов.
Каждый день в выбранный час кластер переходит в режим MAINTENANCE, во время которого недоступно любое масштабирование кластера. Этот период длится до двух часов.
При создании кластера в панели управления по умолчанию будет установлено время, соответствующее 4 часам утра в вашем часовом поясе. Вы можете изменить окно обслуживания для уже работающего кластера.
Безопасность Pod Security Policy
Опция Pod Security Policy включает безопасное создание и обновление подов кластера.
Мы рекомендуем сначала добавить манифесты политик в кластер, а затем включать опцию безопасности.
Советы по выбору оптимальной архитектуры вашего Kubernetes-кластера
Несколько больших нод или много маленьких?
Как site-reliability и DevOps инженерам вам нужно иметь в виду потребности приложений, которые будут запускаться в кластере, и учитывать различные факторы при его проектировании.
Здравый смысл подсказывает нам, что ответ лежит где-то посередине, но давайте рассмотрим те факторы, которые могут повлиять на наше решение. Посмотрим на специфику обеих крайностей, прежде чем сделать выбор.
Отказоустойчивость
Kubernetes предоставляет возможность реализовать отказоустойчивость для приложений из коробки если у вас есть по крайней мере 2 воркер ноды. Однако, говоря о выборе между несколькими большими нодами и множеством маленьких нам нужно понимать, что нас ждет.
Если у нас есть две больших воркер ноды и одна их них упадет, то мы потеряем половину всех ресурсов кластера. Если вы не предусмотрели 100% запас ресурсов, то это приведет к катастрофе, так как оставшаяся нода не сможет выдержать двойную нагрузку. Наличие множества воркеров снижает эти риски на n. К примеру, если у вас есть 10 нод в кластере и выключится одна, то вы потеряете только 10% от всей мощности кластера.
Победители: множество маленьких нод
Сложность управления
С большим количеством нод вам нужно будет заботиться о большем количестве серверов, их обновлении и обслуживании. Сократив количество нод их проще обслуживать. Как DevOps и SRE вы можете использовать такие инструменты как Ansible или Puppet, чтобы упростить эти процессы за счет автоматизации.
Если вы используйте managed Kubernetes-кластер, то ваш облачный провайдер будет патчить и обновлять ноды за вас. В итоге с современными инструментами этот пункт не дает существенного преимущества.
Простота в распределении контейнеров
Победители: несколько больших нод
Автоматическое горизонтальное масштабирование нод
Многие облачные провайдеры предоставляют автоматическое горизонтальное масштабирование воркеров Kubernetes. Если у вас большие ноды, то их масштабирование может быть неудобным. Например, если вы добавляете третью ноду к двухнодовому кластеру, вы увеличиваете мощности кластера на огромные 33%, тогда как для 10-нодового кластера добавление одной ноды увеличит доступные ресурсы на 9%.
Победители: множество маленьких нод
Простота в обслуживании
Ноды Kubernetes-кластера не могут работать непрерывно, их нужно будет останавливать для обновления ОС, обновления версии Kubernetes и другого обслуживания. Если у вас несколько воркер нод, то обновить их без остановки приложений сложнее, так же, при отключении одной ноды, нагрузка на другие существенно увеличится и это тоже может привести к простою. Что не обязательно происходит, если у вас множество нод: вы можете обновлять по одной ноде за раз и Kubernetes без труда перенесет ваши приложения на другие свободные ноды.
Победители: множество маленьких нод
Нагрузка на kubelet
Kubelet отвечает за взаимодействие с нижележащим container runtime (движком для контейнеров) для запуска приложений на воркер нодах. Если вы запускаете множество контейнеров на одной ноде, что типично для кластеров с большими нодами, это может перегрузить kubelet, так как ему нужно будет оперировать большим количеством контейнеров.
Kubelet оптимизирован для управления только определённым ограниченным количеством контейнеров и многие облачные провайдеры ограничивают число контейнеров, которые можно запускать на одной воркер ноде. Следовательно, наличие нескольких больших нод это не всегда верное решение, если вы планируете запускать множество маленьких контейнеров.
Победители: множество маленьких нод
Нагрузка на систему
И наоборот, множество нод нагружают ваши мастер ноды, так как им нужно взаимодействовать со множеством воркер нод. Kubernetes не оптимизирован для работы более чем с 500 нодами на кластер (хотя они и пишут, что могут управлять до 5000 нод).
Следовательно, надо быть осторожным, добавляя новые ноды в кластер и оптимизировать их размер в зависимости от их количества. В большинстве случаев не требуется такого большого количества нод, но их нередко можно встретить в сборках для высокопроизводительных приложений.
Победители: несколько больших нод
Выбор размера нод
Что ж, выбор зависит от множества факторов, как всегда! Истина где-то посередине и не стоит выбирать ни одну из крайностей.
Вот несколько правил, которым я следую, и для меня они работают отлично. Вам нужно ответить на вопросы ниже, чтобы найти свой оптимальный размер.
Какой тип приложений вы запускаете?
Вы запускаете микросервисы из множества контейнеров, которые занимают мало места, или несколько монолитов, требующих гигабайты оперативной памяти и целые ядра CPU? Базы данных? Или все вместе?
Можно ли объединить приложения в группы?
Для смешанных окружений, можете ли вы разделить приложения по категориям? Например, если вы запускаете микросервисное приложение, которое работает с БД MySQL, вы разделяете его компоненты на группы приложений и баз данных. Аналогично, если вы запускаете вместе и монолиты и микросервисы, как ELK стек для мониторинга кластера, вы можете разместить его компоненты по разным группам. Для простоты я назвал только три категории, но вы можете создать столько, сколько хотите.
Максимальное количество ресурсов для каждой категории
Если вы можете сгруппировать приложения по категориям, то после этого вам нужно понять сколько максимум ресурсов может потребоваться на одно приложение из каждой категории. Например, если вы запускаете микросервисы, монолиты и БД в кластере, вам нужно взять максимальные затраты на один инстанс БД, микросервис или монолит.
Посчитать количество приложений в каждой категории
Следующий шаг это найти планируемое количество приложений в каждой из категорий. У вас может быть, например, 8 БД MySQL, 200 микросервисов и 9 монолитов. Запишите их. Не перебарщивайте. Kubernetes спроектирован для масштабирования и вы всегда можете использовать автоматическое масштабирование кластера у некоторых провайдеров. Либо, вы можете добавить ноду вручную позже.
Поместите каждую категорию в отдельный пул нод
Лучший способ оптимизировать ноды это создать пул нод под каждую категорию. Большинство Kubernetes кластеров работают с различными пулами нод и разнородные ноды можно подключать к самостоятельно управляемым кластерам.
Заложите отказоустойчивость
Нужно иметь минимум две ноды в каждом пуле для достижения отказоустойчивости. Kubernetes рекомендует максимум 110 контейнеров на ноду. Так же есть ещё системные контейнеры, которые запущены на нодах, так что имейте это ввиду.
Может вам придется согласовать это значение с вашим облачным провайдером, так как они могут предоставлять разного уровня жесткости ограничения на количество подов, запущенных на ноде. Идея в том, что бы не вылезать за лимит.
Подгоните свои ноды под контейнеры для оптимального управления ресурсами
Если мы ожидаем падение одной ноды за раз, то должны заложить избыток ресурсов на каждой ноде так, чтобы при падении на них могли переехать ресурсы с упавшей ноды.
Подгоните ваши контейнеры и ноды для лучшего возможного управления ресурсами. Например, если у нас есть 20 контейнеров, лучше всего будет распределить по 4 пода на одну ноду, тогда нам нужно иметь в запасе 20% ресурсов на каждой ноде, вместо 100% как если бы у нас было всего 2 ноды.
Как я пришел к этой цифре? Просто возьмите квадратный корень от количества контейнеров и округлите в меньшую сторону. Это даст вам максимальное количество контейнеров, которое должно быть у вас на ноде.
Учтите нагрузку от самого Kubernetes
Учтите тот факт, что системные компоненты Kubernetes так же будут потреблять какое-то количество CPU и памяти на каждой ноде, поэтому на самом деле вам будет доступно меньше ресурсов, чем есть на ноде. Уточните эти параметры у вашего облачного провайдера и добавьте к ресурсам ноды.
Подводя итог
Учитывая все вышесказанное, вам нужно сделать следующее, чтобы найти оптимальные значения:
Количество контейнеров на ноде = Корень квадратный из количества контейнеров, округленный до целого в меньшую сторону, при условии, что количество контейнеров на ноду не превышает рекомендуемое значение
Количество нод = Количество контейнеров/Количество контейнеров на ноду
Ресурсы ноды = максимальное кол-во ресурсов, требуемое контейнеру * кол-во контейнеров на ноде + запас ресурсов + ресурсные требования системных компонент Kubernetes
Пример
Чтобы понять, как это работает, давайте рассмотрим пример.
Давайте скажем, что нам нужны два пула нод:
Предположим, что компоненты Kube system будут потреблять 0.5 CPU и 0.5 GB RAM и мы рассчитываем, что только одна нода может быть недоступна за раз.
Для микросервисного пула:
Ближайшее меньший целый квадрат числа = 196
Кол-во контейнеров на ноду = sqrt(196) = 14
Кол-во нод = 200/14 = 14.28
Максимальное допустимое число неработающих нод = 1
Запас ресурсов = 14 * (0.1 core + 100MB RAM)/(15–1) = 0.1 core + 100MB RAM
Ресурсы ноды = (0.1 core + 100MB RAM) * 14 + 0.1 core + 100MB RAM + 0.5 cores + 500MB RAM = 2 core + 2GB RAM
Для пула баз данных:
Ближайшее меньший целый квадрат числа = 16
Кол-во контейнеров на ноду = sqrt(16) = 4
Максимальное допустимое число неработающих нод = 1
Запас ресурсов = 4 * (2 core + 4GB RAM)/(5–1) = 2 core + 4GB RAM
Ресурсы ноды = (two core + 4GB RAM) * 4 + 2 core + 4GB RAM + 0.5 cores + 0.5 GB RAM = 10.5 core + 20.5 GB RAM
Следовательно, для микросервисного пула вам будет нужно 15 воркер нод с 2 ядрами и 2 GB RAM каждая, и для пула БД вам нужно будет 5 воркер нод с 10.5 ядрами и 20.5 GB RAM каждая. Для простоты можно округлить числа до ближайшей большей доступной конфигурации машины.