Как сервер API Kubernetes запускает новый запланированный модуль на узле?

#kubernetes #kubernetes-pod #kube-apiserver

#kubernetes #kubernetes-pod #kube-apiserver

Вопрос:

Я пытаюсь лучше понять «под капотом», как работает процесс планирования и создания модуля Kubernetes, в отношении взаимодействия между kubelet и kube-apiserver .

Я понимаю, что планировщик Kubernetes выбирает узел для выделения нового модуля и уведомляет об этом сервер API. Однако мне неясно, как сервер API уведомляет kubelet соответствующий узел о запуске модуля. Существует ли процесс опроса kubelet , который запрашивает изменения у сервера API? Или существует взаимодействие типа прослушиватель событий / обратный вызов?

Если кто-нибудь знает ответ или может указать мне в направлении какой-либо документации, я был бы очень признателен!

Ответ №1:

У Alibaba был действительно проницательный пост в блоге о внутренней работе планировщика. Из блога:


Планировщик в основном работает следующим образом:

  • Планировщик поддерживает запланированную очередь и прослушивает сервер APIServer.
  • Когда мы создаем модуль, мы сначала записываем метаданные модуля в etcd через сервер APIServer.
  • Планировщик прослушивает статус модуля через информер. При добавлении нового модуля модуль добавляется в очередь.
  • Основной процесс непрерывно извлекает модули из очереди и назначает узлы для модулей.
  • Процесс планирования состоит из двух этапов: фильтруйте соответствующие узлы и расставляйте приоритеты для этих узлов на основе конфигурации модуля Pod (например, по таким показателям, как использование ресурсов и привязка), чтобы оценить узлы и выбрать узел с наибольшим количеством баллов.
  • После успешного назначения узла вызовите интерфейс модуля привязки apiServer и установите pod.Spec.nodeName для назначенного модуля.
  • Kubelet на узле также прослушивает сервер ApiServer. Если он обнаруживает, что новый модуль запланирован для этого узла, для запуска контейнера вызывается локальный dockerDaemon.
  • Если планировщику не удается запланировать модуль, если приоритет и вытеснение включены, сначала делается попытка вытеснения, модули с низким приоритетом на узле удаляются, а модули, которые должны быть запланированы, будут запланированы на узел. Если выгрузка не включена или попытка выгрузки завершается неудачей, соответствующая информация будет записана в журналы, а модули будут добавлены в конец очереди.

При опросе Kubelet: на самом деле сервер API поддерживает режим «просмотра», который использует протокол WebSocket. Таким образом, Kubelet уведомляется о любом изменении модулей с именем хоста, равным имени хоста Kubelet.

Ответ №2:

Ответ без ссылки на исходный код, но я уверен kubelet , что это работает так:

 Query Parameters
...
watch   Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.
  

Функциональность просмотра унаследована от etcd (базы данных за сервером API): https://etcd.io/docs/v3.2.17/learning/api /. См . Watch streams :

 Watches are long running requests and use gRPC streams to stream event data.
  

Итак, это своего рода длительный опрос.

Комментарии:

1. Большое спасибо за ваш ответ. Действительно заинтригован функциональностью watch streams.

2. Добро пожаловать! Обязательно используйте его, он был там с самого начала, так что это очень опытный и широко используемый метод в Kubernetes.