У меня есть кластер kubernetes с 16 ГБ ОЗУ на каждом узле
И типичное приложение webnet-интерфейса с ядром dotnet
Я пытался настроить ограничения, как здесь:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
Но мое приложение считает, что может использовать 16Gb
Поскольку cat /proc/meminfo | head -n 1
возвращает MemTotal: 16635172 kB
(или может быть что-то из cgroups, я не уверен)
Так .. может быть лимит не работает?
Нет! K8s успешно убивает мой модуль, когда достигает предела памяти
.net ядро имеет интересный режим GC, подробнее здесь . И это хороший режим, но похоже, что он не работает для k8s, потому что приложение получает неверную информацию о памяти. И неограниченное количество модулей может получить всю память хоста. Но с ограничениями - они умрут.
Теперь я вижу два пути:
- Использовать рабочую станцию GC
- Использовать пределы и датчик готовности k8s : обработчик будет
проверяет текущую память на каждой итерации и вызывает GC.Collect (), если
текущая используемая память около 80% (я передам ограничение по переменной env)
Как ограничить объем памяти для приложения ядра .net в модуле kubernetes?
Как правильно установить лимиты памяти для стручков в кубернетах?