Почему контейнер OpenJDK Docker игнорирует ограничения памяти в Kubernetes?

Я запускаю несколько приложений Java с образом Docker jboss/wildfly:20.0.1.Final в Кубернете 1.19.3. Сервер Wildfly работает в OpenJDK 11, поэтому jvm поддерживает ограничения памяти контейнера (cgroups).

Если я устанавливаю лимит памяти, этот лимит полностью игнорируется контейнером при работе в Kubernetes. Но это соблюдается на той же машине, когда я запускаю ее в обычном Docker:

<сильный>1. Запустите Wildfly в Docker с ограничением памяти 300 МБ:

$ docker run -it --rm --name java-wildfly-test -p 8080:8080 -e JAVA_OPTS='-XX:MaxRAMPercentage=75.0' -m=300M jboss/wildfly:20.0.1.Final

проверить использование памяти:

$ docker stats
CONTAINER ID        NAME                 CPU %        MEM USAGE / LIMIT     MEM %       NET I/O       BLOCK I/O     PIDS
515e549bc01f        java-wildfly-test    0.14%        219MiB / 300MiB       73.00%      906B / 0B     0B / 0B       43

Как и ожидалось, контейнер НЕ превысит лимит памяти в 300 МБ.

<сильный>2. Запустите Wildfly в Kubernetes с ограничением памяти 300 МБ:

Теперь я запускаю тот же контейнер в kubernetes.

$ kubectl run java-wildfly-test --image=jboss/wildfly:20.0.1.Final --limits='memory=300M' --env="JAVA_OPTS='-XX:MaxRAMPercentage=75.0'" 

проверить использование памяти:

$ kubectl top pod java-wildfly-test
NAME                CPU(cores)   MEMORY(bytes)   
java-wildfly-test   1089m        441Mi 

Предел памяти в 300M полностью игнорируется и немедленно превышается.

Почему это происходит? Оба теста могут быть выполнены на одной и той же машине.

Ответить

Причиной высоких значений стал некорректный вывод данных Метрики, полученных от проекта kube-prometheus. После удаления kube-projemet и установки вместо него metric-server все данные отображались корректно. используя kubctl сверху. Теперь он показывает те же значения, что и статистика докера. Я не знаю, почему kube-prometheus вычислил неправильные данные. На самом деле он предоставлял двойные значения для всех данных памяти.


person Ralph    schedule 28.10.2020    source источник
comment
Я подозреваю, что Docker и Kubelet работают с разными драйверами cgroup. Как я могу это проверить?   -  person Ralph    schedule 29.10.2020
comment
Какой дистрибутив kubernetes вы используете?   -  person Matt    schedule 29.10.2020
comment
Я установил kubernetes на собственные узлы, работающие на Debian Buster.   -  person Ralph    schedule 29.10.2020
comment
какую версию докера вы используете?   -  person acid_fuji    schedule 29.10.2020
comment
Я использую докер версии 19.03.12. Но теперь я предполагаю, что моя проблема в том, что docker и kubelet используют разные cgroupDriver. Может ли это быть корнем странного поведения?   -  person Ralph    schedule 29.10.2020
comment
Я добавил свой собственный ответ. Причиной стал неправильный вывод из kube-prometheus. Использование метрического сервера kubernetes решило проблему.   -  person Ralph    schedule 30.10.2020


Ответы (1)


Я размещаю этот ответ как вики сообщества, так как он может быть полезен для сообщества. Kubectl top отображал неверные данные. OP решил проблему с удалением стека kube-prometheus и установкой metric-server.

Причиной высоких значений стал некорректный вывод данных Метрики, полученных от Project kube-prometheus. После удаления kube-projemet и установки вместо него metric-server все данные отображались корректно с помощью kubectl top. Теперь он показывает те же значения, что и статистика докера. Я не знаю, почему kube-prometheus вычислил неправильные данные. На самом деле он предоставлял двойные значения для всех данных памяти.

person Community    schedule 03.11.2020