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

Другие вопросы по тегам