Какова взаимосвязь между ограничениями ресурсов Elasticsearch ES_Java_Opts и Kubernetes

#elasticsearch #kubernetes #resources #kubernetes-helm

#elasticsearch #kubernetes #Ресурсы #kubernetes-helm

Вопрос:

Итак, у меня есть кластер Elasticsearch внутри Kubernetes.

Компьютер, на котором он запущен, имеет 30 ГБ оперативной памяти и 8 ядер.

Теперь, согласно правилу thumb, 50% оперативной памяти — это то, что мы установили как ES_JAVA_OPTS , а оставшееся используется для кэширования файлов. здесь это было бы 15 ГБ

Также на диаграмме helm у нас есть требования к ресурсам, упомянутые ниже:

 resources:
  limits:
    cpu: 8
    memory: 15Gi
  requests:
    cpu: 8
    memory: 15Gi
  

Мой вопрос заключается в том, соответствует ли 50% оперативной памяти хост-машине (что составляет 30 ГБ) или пределу, указанному в таблице управления 15 ГБ

Может кто-нибудь объяснить, как в kubernetes использовать оперативную память

Потому что, если это в отношении кэширования хоста и файлов не рассматривается как использование развернутого приложения, мы в порядке. Но если это в пределах ресурсов, мне нужно увеличить до 30 ГБ.

Редактировать:

Вопрос здесь в том, что если один узел elasticsearch использовал 50% оперативной памяти в качестве кучи и 50% в качестве кэширования файлов, и я упоминаю кучу как 15 ГБ (50% оперативной памяти) на компьютере объемом 30 ГБ. итак, я должен упомянуть ограничения ресурсов в шаблоне развертывания, как где-то около 15 ГБ, для кучи которых требуется 30 ГБ (скажем, 28 ГБ), которые, согласно правилу, Elasticsearch должны иметь возможность кэшировать файлы.

Это вызывает беспокойство, как если pod превысит указанное ограничение в шаблоне в любой данный момент, kubernetes перезапустит pod.

Другими словами, я хочу знать, влияет ли кэширование файлов RAM на общее использование памяти модуля или нет.

Примечание: Я использую хранилище экземпляров в качестве основного хранилища данных ES, поскольку это чрезвычайно быстро по сравнению с EBS.

Заключение:

Сохраняйте половину объема оперативной памяти в системе и указывайте в ограничении ресурсов (если есть)

Ответ №1:

Я не эксперт в k8s и docker, но я понимаю, что контейнер docker использует ресурсы хоста, и, используя resource limit, вы можете жестко ограничить ресурсы, которые он может потреблять.

Если вы установите ограничение ресурсов в 15 ГБ, то в целом ваш контейнер docker может потреблять 15 ГБ оперативной памяти хоста. теперь, будет ли он совместно использовать кэш файловой системы с хостом или нет, зависит от того, как вы настроили свой том docker.

Поскольку контейнер docker имеет возможность совместно использовать файловую систему с хостом, используя том привязки, или иметь свой собственный объем данных (который является эфемерным и не подходит для ES в качестве приложения с отслеживанием состояния). в первом варианте он должен совместно использовать кэш файловой системы с хостом, и вы не должны увеличивать лимит ресурсов дальше (рекомендуется, поскольку у вас есть ES с отслеживанием состояния), а во втором варианте, поскольку он будет использовать свою собственную файловую систему, вам нужно выделить ОЗУ для кэша файловой системы и увеличить ОЗУ до 30 ГБ, но вы также должны предоставить некоторое пространство для хост-ОС.

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

1. Я отредактировал вопрос, пожалуйста, повторите ответ в соответствии с этим, поскольку приведенный выше ответ неясен @opster-elasticsearch-ninja

2. @JugrajSingh, похоже, что в вашем случае вы используете только один сервер ES conatiner на каждом хосте, и, как вы упомянули, вы уже выделили 50% оперативной памяти хоста для кучи ES, что является отличным началом, но если вы ограничите ресурсы вашего контейнера на 15 ГБ, он не будет потреблять больше, и, похоже, что в основном кэш файловой системы будет его частью, поэтому, если вы используете только один контейнер на хосте, лучше опустить значение раздел ресурсов и это то, что я видел в целом

3. Это хорошее предложение опустить раздел ресурсов, но на одном узле я запускаю kibana вместе с узлом elasticsearch. поэтому, чтобы они уважали ресурсы друг друга, я упоминаю ограничения. Из вашего комментария выше я могу сказать, что кэширование файлов является частью контейнера для использования оперативной памяти, поэтому было бы с уверенностью сказать, что я должен упомянуть ограничение примерно на 28 ГБ, чтобы кэширование файлов сохраняло собственную память в куче, и я мог сохранить последний 1 ГБ для kibana

Ответ №2:

Контейнер всегда будет видеть память узла вместо контейнера. В Kubernertes, даже если вы устанавливаете ограничение на объем памяти для контейнера, сам контейнер не знает об этом ограничении.

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

Вот почему вы настраиваете размер кучи JVM. Без этого JVM установит максимальный размер кучи на основе общей памяти хоста / узла вместо доступной (которую вы объявили как ограничение) для контейнера.

Ознакомьтесь с этой статьей о том, как ограничения работают в k8s.

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

1. Я отредактировал вопрос, пожалуйста, повторно ответьте в соответствии с этим, поскольку приведенный выше ответ неясен