Назад | Перейти на главную страницу

Kubernetes Pod OOMKilled Issue

Сценарий заключается в том, что мы запускаем несколько веб-сайтов на основе образа nginx в кластере кубернетов. Когда у нас был кластер с узлами по 2 ядра и 4 ГБ ОЗУ каждый. Модули имели следующие конфигурации: ЦП: 40 МБ и память: 100 МБ. Позже мы обновили наш кластер узлами по 4 ядра и 8 ГБ ОЗУ каждый. Но продолжал получать OOMKilled в каждой капсуле. Таким образом, мы увеличили объем памяти на каждом модуле примерно до 300 МБ, и теперь все работает нормально.

У меня вопрос: почему это происходит и как это решить. P.S. если мы вернемся к тому, что каждый узел будет иметь 2 ядра и 4 ГБ ОЗУ, модули будут работать нормально с уменьшенными ресурсами на 100 МБ.

Прежде всего, модуль не должен запрашивать больше памяти / ЦП только потому, что узел получил больше ресурсов. Без ваших спецификаций трудно указать, что может быть неправильным в конфигурации, но я хотел бы объяснить концепцию, чтобы сделать ее более понятной.

Вы упомянули конфигурацию своего модуля, но не указали, являются ли они ограничениями или запросами.

  • Запросы - это то, что контейнер гарантированно получит. Если контейнер запрашивает ресурс, Kubernetes будет планировать его только на узле, который может предоставить ему этот ресурс. Это не вызовет OOM, они заставят pod не быть запланированным.

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

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

Ниже приведен пример модуля с двумя контейнерами с одинаковыми заданными запросами и ограничениями:

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Если вы хотите рассчитать запросы и ограничения для всего модуля, вам необходимо суммировать эти значения, сделав это: запрос 0,5 процессора и 128 МБ памяти и ограничение в 1 процессор и 256 МБ памяти.

Если вы хотите узнать больше по этой теме, чем ознакомьтесь с официальной документацией:

Пожалуйста, позвольте мне сейчас, если это помогло.