Невозможно создать развертывание, которое запрашивает более 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 узла с одним модулем? Нужны ли мне узлы с большей емкостью памяти?


comment
Только предположение, но, возможно, самая маленькая машина использует 32-битную ОС, которая может выделять только 2 ГБ на процесс (ru .m.wikipedia.org / wiki / 2_GB_limit)? Если это так, переход на узлы с большей емкостью памяти должен помочь, поскольку они, вероятно, будут использовать 64-битную ОС. Мы используем в AKS модули гораздо большего размера, но я не использовал GKE, поэтому не могу поручиться за это.   -  person ewramner    schedule 20.02.2019
comment
Узлы работают с ОС, оптимизированной для контейнеров Google (cloud.google. com / container-optimized-os / docs /) Я не могу найти официальную заметку, но, не веря в 32-битную версию, продолжу искать   -  person Mugen    schedule 20.02.2019


Ответы (2)


Несмотря на то, что общий объем памяти узла составляет 3,75 ГБ, весьма вероятно, что выделяемая емкость составляет не все 3,75 ГБ.

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

Из документации:

Узлы Kubernetes можно запланировать на Емкость. Поды могут использовать всю доступную емкость узла по умолчанию. Это проблема, потому что на узлах обычно работает довольно много системных демонов, которые питают ОС и сам 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 требуется больше.

person Diego Mendes    schedule 20.02.2019
comment
Команда возвращает размер доступной памяти 2702164Ki, теперь я также вижу это на еще одной скрытой странице GKE. Спасибо! - person Mugen; 20.02.2019
comment
Да, с учетом этих резервов ресурсов приблизительный объем памяти составит 2,7 ГБ. - person Diego Mendes; 20.02.2019
comment
И просто для проверки я добавил новый пул с более сильными узлами и успешно применил развертывание. - person Mugen; 20.02.2019

Каждый узел резервирует определенную память для системных рабочих нагрузок Kubernetes (например, kube-dns, а также для любых надстроек, которые вы выбираете). Это означает, что вы не сможете получить доступ ко всей памяти узла в 3,75 Ги.

Поэтому, чтобы запросить зарезервированную для модуля память 3Gi, вам действительно понадобятся узлы с большей емкостью памяти.

person Paul Annetts    schedule 20.02.2019