Обновление и отказ доменов в Kubernetes - PullRequest
0 голосов
/ 30 апреля 2018

Фон

Я планировал пойти с Service Fabric (в помещениях) для моего обслуживания и оркестровки контейнеров. Но из-за внутренних дискуссий я смотрю на Кубернетеса. В основном потому, что он очень популярен.

Service Fabric имеет концепции, называемые доменами обновления и доменами отказа. «Домен» - это группа узлов хоста.

Домены обновления используются при выталкивании обновлений службы приложения или контейнера. Service Fabric гарантирует, что обновляющий сервис / контейнер по-прежнему доступен, снимая только один домен обновления за раз. (Они также используются при обновлении самого программного обеспечения кластера Service Fabric.)

Failure Domains работает аналогичным образом. Идея состоит в том, что домены сбоев создаются в соответствии с группами сбоев оборудования. Service Fabric обеспечивает работу экземпляров службы / контейнера в каждом домене сбоя. (Чтобы обеспечить время работы при сбое оборудования.)

Вопрос

Когда я смотрю документы и слушаю подкасты в Куберне, я не вижу ни одного из этих понятий. Кажется, он просто размещает контейнеры (стручки). Я немного слышал о «планировании» и «тегах». Но, похоже, это просто способ ручной настройки модулей.

Обновления приложений и отказоустойчивость выполняются вручную в Kubernetes? (возможно через планирование и / или теги)

Или мне не хватает какой-то функции?

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Эти абстракции в настоящее время не существуют в kubernetes, хотя желаемое поведение часто может быть достигнуто в автоматическом режиме.

Мета-модель для kubernetes включает в себя агентов (называемых контроллерами и операторами), которые непрерывно отслеживают события и конфигурацию в кластере и постепенно согласовывают состояние кластера с декларативной конфигурацией контроллера. Внезапная потеря узлов, размещающих узлы, приведет к тому, что IP-адреса, соответствующие потерянным модулям, будут удалены из служб и ReplicationControllers для этих модулей, что приведет к появлению новых версий на других узлах, гарантируя, что в противном случае будут соблюдены ограничения совместного и анти-планирования.

Аналогичным образом, обновления приложений обычно происходят через изменения в развертывании, что приводит к тому, что новые блоки планируются, а старые блоки не планируются автоматически, постепенно.

Пользовательские декларативные конфигурации теперь возможны с CustomResourceDefinitions, поэтому эта модель расширяема. Базовые примитивы и механизмы предназначены для того, чтобы кто-то мог вводить декларативные абстракции верхнего уровня, такие как FailureDomains и UpgradeDomains, управляемые пользовательскими операторами.

Экосистема кубе настолько огромна и движется так быстро, что, скорее всего, возникнет нечто подобное, что, скорее всего, будет встречено концепциями конкурентов.

Суть в том, что владелец завода, который рассматривает вопрос об усыновлении, - это то, что Кубернетес все еще остается миром мастеров. Существует огромное количество инструментов и столько же незавершенного продукта.

0 голосов
/ 01 мая 2018

«Домен» - это группа узлов хоста.

Не все так просто, было бы точнее, если бы вы сказали «Домен - это логическая группа ресурсов».

Чтобы понять это правильно, вы должны сначала понять большинство компонентов в отдельности. Я рекомендую эти чтения в первую очередь:

Тогда мы можем извлечь из этого несколько пунктов:

  • Узлы не являются виртуальными машинами, узлы работают поверх лазурных виртуальных машин.

    Они часто имеют отображение 1: 1, но в некоторых случаях вы можете иметь отображение узла 5: 1 / ВМ , например, при установке локального кластера разработки.

  • Виртуальные машины Azure имеют домены обновления и домены сбоя, узлы сервисной фабрики имеют домены обновления и домены сбоя

    Насколько они выглядят одинаково, у них есть свои различия:

    Домены ошибок:

    • Домены сбоя VM являются изолированными слотами для физического развертывания, что означает: источник питания, сеть, диски и т. Д. Они ограничены по регионам.
    • SF Fault Domains - это логические слоты узлов для развертывания приложения, что означает, что когда SF развертывает приложение на узлах, оно будет распределяться по разным доменам сбоев, чтобы сделать их надежными, большую часть времени FD будет отображаться на VM Fault Domains, но в сложных сценариях это можно сопоставить с чем угодно, например, можно сопоставить весь регион с одним SF FD.

    .

    Обновление \ Обновление доменов:

    • Домены обновлений виртуальной машины относятся к ОС \ исправлениям и обновлениям оборудования, отдельные домены обновлений будут обрабатываться изолированно и не обновляться одновременно, поэтому, когда требуется обновление ОС для сбоя вашей виртуальной машины, они обновят домен по домену. Меньшее количество доменов обновлений означает, что больше компьютеров будет отключено во время обновлений.
    • В доменах обновления SF используется аналогичный подход доменов обновления виртуальных машин, но при этом основное внимание уделяется службам и самому обновлению кластера, сокращая UD на UD за раз и переходя к следующему, когда предыдущий UD завершается успешно.
    • В обоих случаях вы настраиваете Update \ Upgrade на то, сколько экземпляров (%) ваших vm \ узлов \ сервисов может быть отключено во время обновлений. Так, например, если ваша служба имеет 100 экземпляров в кластере с 5 UD, SF будет обновлять 20 служб одновременно, если вы увеличите количество UD, например, до 10, количество уменьшенных экземпляров сократится до 10 экземпляров за раз, но время развертывания вашего приложения увеличится в той же пропорции.

Исходя из этого, вы можете рассматривать FD & UP как матрицу надежных слотов развертывания. Чем больше у вас будет, тем больше будет повышаться надежность (с компромиссами, такими как время обновления). Пример ниже взят из SF документов:

enter image description here

Service Fabric из коробки старается изо всех сил разместить экземпляры ваших служб на разных FD \ UD, это означает, что, если возможно, они будут на разных FD \ UD, в противном случае он найдет другой с наименьшим числом экземпляров развертываемая служба.

А про Кубернетес:

В Kubernetes эти функции не являются стандартными, k8 имеют концепцию зон , но, согласно документам, они ограничены регионами, они не могут распространяться на регионы.

Kubernetes автоматически распределит модули в контроллере или службе репликации по узлам в кластере с одной зоной (чтобы уменьшить влияние отказов). В кластерах с несколькими зонами это поведение распространения распространяется на зоны (чтобы уменьшить влияние отказов зон). Это достигается с помощью SelectorSpreadPriority.

Это размещение с максимальным усилием, и поэтому, если зоны в вашем кластере неоднородны (например, разное количество узлов, разные типы узлов или разные требования к ресурсам модуля), это может помешать равномерному распределению ваших модулей по зонам. , При желании вы можете использовать однородные зоны (одинаковое количество и типы узлов) для уменьшения вероятности неравномерного распространения.

Это не то же самое, что FD, но очень похожая концепция.

Для достижения результата, аналогичного SF, потребуется развернуть кластер по зонам или сопоставить узлы с VM FD \ UD, чтобы они вели себя как узлы на SF. Добавьте метки к узлам, чтобы идентифицировать эти домены. Вам также необходимо создать метки NodeType на узлах в разных FD, чтобы их можно было использовать для развертывания модулей на узлах с разделителями.

Например:

  • Node01 : FD01: NodeType = FrontEnd
  • Node02 : FD02: NodeType = FrontEnd
  • Node03 : FD03: NodeType = FrontEnd
  • Node04 : FD01: NodeType = BackEnd
  • Node05 : FD02: NodeType = BackEnd

При развертывании приложения вы должны использовать функцию affinity , чтобы назначать POD узлу, и в этом случае ваша служба будет иметь:

  • Требуется сходство с NodeType = FrontEnd
  • Предпочитаемый AntiAfinity до ContainerName = [само по себе]

С этими настройками использование k8-файлов affinity и anti-affinity будет пытаться разместить реплики \ экземпляры вашего контейнера на отдельных узлах, и узлы будут уже разделены FD \ zone, разделенными метками NoteType, тогда k8s будут обрабатывать обновления обновления как SF.

Поскольку правила антиаффинности предпочтительнее, k8s постарается сбалансировать между этими узлами с максимальной эффективностью, если нет доступных действительных узлов, он начнет добавлять больше экземпляров на узел, который уже содержит экземпляры того же контейнера,

Заключение

Это немного дополнительная работа, но мало чем отличающаяся от того, что в настоящее время используется в других решениях. Основной проблемой здесь будет настройка узлов на FD \ Zones, после того как вы разместите свои узлы на правильном FD, остальные будут работать бесперебойно.

В SF вам не нужно беспокоиться об этом при развертывании кластера в Azure, но если вы делаете это с нуля, это большая работа, даже больше, чем k8s.

ПРИМЕЧАНИЕ. Если вы используете AKS , он будет распределять узлы по наборам доступности (набор, который указывает домены сбоев ВМ и домены обновлений). В настоящее время, согласно этой записи , AKS не предоставляет вам распределение зон, поэтому вам придется делать это с нуля, если вам нужен такой уровень распределения.

0 голосов
/ 01 мая 2018

Из документов 1 , 2 , 3 :

  • Проверка работоспособности процесса Самая простая форма проверки работоспособности - это проверка работоспособности на уровне процесса. Kubelet постоянно спрашивает демон Docker, запущен ли процесс контейнера, и если нет, процесс контейнера перезапускается. Во всех примерах Kubernetes, которые вы уже выполнили, эта проверка работоспособности уже была включена. Включено для каждого контейнера, который работает в Кубернетесе

  • Kubernetes поддерживает реализованные пользователем проверки работоспособности приложения . Эти проверки выполняются Kubelet, чтобы убедиться, что ваше приложение работает правильно для определения «правильно», которое вы предоставляете.

В настоящее время вы можете выбрать один из трех типов проверки работоспособности приложения:

  1. Проверка работоспособности HTTP - Kubelet вызовет веб-перехват. Если он возвращается между 200 и 399, это считается успехом, в противном случае - неудачей. Смотрите примеры проверки здоровья здесь.
  2. Container Exec - Kubelet выполнит команду внутри вашего контейнера. Если он выходит со статусом 0, он будет считаться успешным. Смотрите примеры проверки здоровья здесь.
  3. TCP Socket - Kubelet попытается открыть сокет для вашего контейнера. Если он может установить соединение, контейнер считается исправным, если он не может, это считается отказом. Во всех случаях, если Kubelet обнаруживает сбой, контейнер перезапускается.

    • Проверка работоспособности узла

Если состояние «Состояние готовности» [узла] имеет значение «Неизвестно» или «Ложно» дольше, чем время ожидания pod-eviction-time, аргумент передается kube-controller-manager и всем модулям на узел запланирован для удаления контроллером узла. По умолчанию время ожидания выселения составляет пять минут. В некоторых случаях, когда узел недоступен, аписервер не может связаться с кубелетом на нем. Решение об удалении модулей не может быть передано в Kubelet, пока оно не восстановит связь с сервером. В то же время блоки, которые запланированы для удаления, могут продолжать работать на разделенном узле

  • Обновления приложений

Пользователи ожидают, что приложения будут доступны постоянно, а разработчики будут развертывать их новые версии несколько раз в день. В Kubernetes это делается с помощью обновляемых обновлений. Поочередные обновления позволяют выполнять обновления Deployments с нулевым временем простоя, постепенно обновляя экземпляры Pods новыми. Новые блоки будут запланированы на узлах с доступными ресурсами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...