Kubernetes v1.37: etcd RangeStream сокращает использование памяти при чтении больших списков
etcd RangeStream переходит в бета-версию в Kubernetes v1.37, работая с etcd v3.7. Эта функция значительно снижает потребление памяти API-сервером и etcd при чтении больших коллекций ресурсов. Ранее заполнение кэша наблюдения API-сервера включало дорогостоящее полное чтение из etcd. Хотя пагинация существовала, она основывалась на количестве ключей, а не на размере объектов, что приводило к непредсказуемым скачкам потребления памяти и возможным ошибкам Out-Of-Memory. Унитарный RPC Range в etcd собирал целые страницы перед отправкой, усугубляя нагрузку на память как etcd, так и API-сервера.Новый RPC RangeStream в etcd v3.7 решает эту проблему, передавая результаты по частям. Размер части адаптивно настраивается в зависимости от размеров значений, ограничивая чтение по байтам, а не по количеству ключей. Это позволяет постепенно освобождать память по мере продвижения потока. Когда включен флаг функции EtcdRangeStream, API-сервер использует RangeStream как для инициализации кэша наблюдения, так и для резервных запросов списка. Он декодирует и освобождает части по мере их поступления, предотвращая одновременное хранение всей коллекции в памяти. Эта функция требует Kubernetes v1.37+ и etcd v3.7+. API-сервер автоматически определяет поддержку etcd и переключается на резервный вариант, если RangeStream не реализован. Чтобы убедиться, что RangeStream активен, отслеживайте метрику etcd_request_duration_seconds_count{operation="listStream"} на наличие ненулевых значений.
etcd_request_duration_seconds_count{operation="listStream"}на наличие ненулевых значений.