Kubernetes — отличный инструмент для оркестроировки контейнерных рабочих нагрузок на кластере узлов. Если вы когда-либо испытали внезапное время простоя узема, вы, возможно, пришли к связи с перенесенными стратегиями развертываний Kubernetes, которые выгнали через некоторое время. В этом сообщении я хочу выделить, как такие ситуации распознаются системой. Это может быть полезно понять и настроить перенесенную механику или при разработке своих собственных операторов и ресурсов.
Процесс
Чтобы продемонстрировать этот процесс более привлекательным образом, следующая графика будет использоваться для визуализации ключевых действий и решений. Мы будем иметь дело с системой, состоящей из одного мастера и одного узла.
В здоровой системе Kublet работает на узле постоянно сообщает о своем состоянии для мастера (1). Это управляется путем установки CLI MARAY - node-status-update-Частота
кублета, чей по умолчанию составляет 10 лет. Таким образом, мастер остается в курсе здоровья узлов кластера и может правильно запланировать стручки.
Сейчас (2) Кублет теряет свое соединение с мастером. Например, узел может быть разбойник или сеть неисправен. Мастер, очевидно, не может быть проинформирован по этой причине, но при мониторинге узлов тайм-аут - Монитор-мониторинг-период
Проверено (3). По умолчанию этот тайм-аут установлен на 40 секунд в диспетчере контроллера Отказ Это означает, что узел имеет 40 секунд, чтобы восстановить и отправить его состояние для мастера до следующего шага (4).
Если узел может успешно восстановиться, система остается здоровой и продолжается с циклом (1). Если узел не мог ответить в заданный тайм-аут, его состояние установлено на Неизвестно
и второй тайм-аут (5) начинается. Это время ожидания, называется --pod-exiction-timeout
, контролирует, когда стручки на узле готов к высеблению (а также «потрясающие и толерации» в следующем разделе). Значение по умолчанию установлено на 5 минут. Как только узлы реагируют в этот таймфрейм (6), мастер устанавливает свой статус обратно в Готовый
И процесс может продолжаться с обычным циклом в начале. Но когда этот тайм-аут превышен с неадреагирующим узлом, стручки наконец отмечены для удаления (7). Следует отметить, что эти стручки не удаляются мгновенно. Вместо этого узел должен снова выходить в Интернете и подключаться к мастеру, чтобы подтвердить это удаление ( 2-фазное подтверждение ). Если это невозможно, например, когда узел покинул кластер постоянно, вы должны удалить эти стручки вручную.
Отделы и терпимости
Даже если вы устанавливаете тайм-аут выселения --pod-exiction-timeout
Для более низкого значения вы можете заметить, что стручки по-прежнему нужно 5 минут, чтобы быть удалены. Это связано с контроллером приема, который устанавливает толерацию по умолчанию на каждый POD, что позволяет ему оставаться на не готовом или недоступном узле в течение периода времени.
tolerations: - key: node.kubernetes.io/not-ready effect: NoExecute tolerationSeconds: 300 - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute tolerationSeconds: 30
Как вы можете видеть в настройке по умолчанию выше, значение устанавливается в 300 секунд/5 минут. Одним из возможных решений является применение пользовательской конфигурации на каждый POD, где это значение настроено на ваши потребности. Вы также можете Отрегулируйте эту настройку глобально Отказ Например, если выбрано значение ( To ToREnationseconds
) 20 секунд, в целом займет 60 секунд для удаления POD 60 секунд, потому что - Монитор-мониторинг-период
стоимость учитывается ранее.
Упаковывать его вверх
Я надеюсь, что теперь вы получите грубую идею о том, как Kubernetes распознает и обрабатывает автономные узлы. Особенно два тайм-аута, а также по умолчанию Taints и конфигурация терпимости могут быть предостережением. Это может пригодиться, когда вы разрабатываете собственный оператор, который должен иметь дело с неуверенным узлами. Например, контроллер развертывания Kubernetes распознает эти ситуации автоматически и переносит настроенные стручки. Это также одна из причин, по которой вам следует избегать использования «голых» стручков, потому что это полезное обращение должно быть реализовано вами в этом случае.
Оригинал: «https://dev.to/duske/how-kubernetes-handles-offline-nodes-53b5»