#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. Я отредактировал вопрос, пожалуйста, повторно ответьте в соответствии с этим, поскольку приведенный выше ответ неясен