Невозможно создать развертывание, которое запрашивает более 2 гигабайт памяти
Мой модуль развертывания был удален из-за потребления памяти:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Evicted 1h kubelet, gke-XXX-default-pool-XXX The node was low on resource: memory. Container my-container was using 1700040Ki, which exceeds its request of 0.
Normal Killing 1h kubelet, gke-XXX-default-pool-XXX Killing container with id docker://my-container:Need to kill Pod
Я попытался предоставить ему больше памяти, добавив следующее в мое развертывание yaml
:
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
...
spec:
...
containers:
- name: my-container
image: my-container:latest
...
resources:
requests:
memory: "3Gi"
Однако не удалось развернуть:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 4s (x5 over 13s) default-scheduler 0/3 nodes are available: 3 Insufficient memory.
Normal NotTriggerScaleUp 0s cluster-autoscaler pod didn't trigger scale-up (it wouldn't fit if a new node is added)
Развертывание запрашивает только один контейнер.
я использую GKE
с автоматическим масштабированием узлы в пуле по умолчанию (и только) имеют 3,75 ГБ памяти.
Методом проб и ошибок я обнаружил, что максимальный объем памяти, который я могу запросить, равен "2Gi". Почему я не могу использовать все 3,75 узла с одним модулем? Нужны ли узлы с большей емкостью памяти?
2 ответа
Несмотря на то, что узел имеет 3,75 ГБ общей памяти, весьма вероятно, что выделяемая емкость - это не все 3,75 ГБ.
Kubernetes резервируют некоторую емкость для системных служб, чтобы контейнеры не потребляли слишком много ресурсов в узле, влияющих на работу системных служб.
Из документов:
Узлы Kubernetes могут быть запланированы в Capacity. Контейнеры могут использовать всю доступную емкость узла по умолчанию. Это проблема, потому что узлы обычно запускают немало системных демонов, которые работают на ОС и на самом Kubernetes. Если ресурсы не выделены для этих системных демонов, модули и системные демоны конкурируют за ресурсы и приводят к проблемам с нехваткой ресурсов на узле.
Поскольку вы используете GKE, если они не используют значения по умолчанию, выполнение следующей команды покажет, сколько выделяемого ресурса у вас в узле:
kubectl describe node [NODE_NAME] | grep Allocatable -B 4 -A 3
Из документов GKE:
Выделенные ресурсы рассчитываются следующим образом:
Распределяемый = Емкость - Зарезервировано - Порог выселения
Для ресурсов памяти GKE резервирует следующее:
- 25% первых 4 ГБ памяти
- 20% из следующих 4 ГБ памяти (до 8 ГБ)
- 10% из следующих 8 ГБ памяти (до 16 ГБ)
- 6% из следующих 112 ГБ памяти (до 128 ГБ)
- 2% любой памяти выше 128 ГБ
GKE резервирует дополнительные 100 МБ памяти на каждом узле для вытеснения кубелетов.
Как следует из сообщения об ошибке, масштабирование кластера не решит проблему, поскольку емкость каждого узла ограничена объемом памяти X, а POD требуется больше.
Каждый узел резервирует некоторую память для рабочих нагрузок системы Kubernetes (таких как kube-dns
, а также для любых надстроек вы выбираете). Это означает, что вы не сможете получить доступ ко всей памяти узла 3,75 Ги.
Поэтому, чтобы запросить, чтобы у модуля была зарезервированная память 3Gi, вам действительно понадобятся узлы с большей емкостью памяти.