Невозможно создать развертывание, которое запрашивает более 2 гигабайт памяти - PullRequest
0 голосов
/ 20 февраля 2019

Мой модуль развертывания был удален из-за потребления памяти:

  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 ]

0 голосов
/ 20 февраля 2019

Несмотря на то, что узел имеет 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 МБ памяти накаждый узел для выселения kubelet.

Как сообщение об ошибке sПредполагается, что масштабирование кластера не решит проблему, поскольку емкость каждого узла ограничена объемом памяти X, а POD требуется больше.

0 голосов
/ 20 февраля 2019

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

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

...