Рубрики
Uncategorized

Ошибка, которая стоило тысяч (Кубернаны, ГК)

Обсуждая важность типа машины при планировании автоматического масштабирования. Теги от Kubernetes, Startup, DevOps, Docker.

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

В чем разница между кластером Kubernetes, используя 100x N1-Standard-1 (1 VCPU) VMS VS имеет 1x N1-Standard-96 (VCPU 96) или 6x N1-Standard-16 VMS (VCPU 16)?

Я задал этот вопрос несколько раз в сообществе Куберанес. Никто не предложил ответа. Если вы не уверены в ответе, то есть что-то для вас, чтобы узнать у моего опыта (или пропустить, чтобы ответить на нетерпение). Вот идет:

Предпосылка

Я проснулся в середине ночи с решимостью снизить нашу затраты на инфраструктуру.

Мы используем большие кластер Куберовника. «Большой» относительно конечно. В нашем случае это 600 VCPU в обычные рабочие часы. Этот номер удваивается в часы пик и доходит до 0 в течение нескольких часов ночи.

Счет за последний месяц был 3500 долларов США.

Это уже довольно красиво, хорошо, учитывая вычислительную мощность, которую мы получаем, и двигатель Google Kubernetes (GKE) сделал управление стоимостью в основном легко:

  • Мы используем наименее дорогой центр обработки данных ( Europe-West2 (Лондон) ≈15% дороже Европа-Уэст4 (Нидерланды))
  • Мы используем разные типы машин для разных развертываний (Memory Heavy VS CPU Heavy)
  • Мы используем горизонтальные POD AutoScaLer (HPA) и пользовательские метрики для масштабирования развертывания
  • Мы используем Cluster AutoScaLer ( https://cloud.google.com/kubernetes-engine/docs/Conepts/Cluster-autoScaler ), чтобы масштабировать пулы узла
  • Мы используем Потребимые VMS.

Использование исключительно Prewtive VMS — это то, что позволяет нам сохранять расходы на низкий уровень. Чтобы проиллюстрировать экономию, в случае N1-Standard-1 Тип машины размещен в Европа-Уэст4 Разница между выделенным и упреждающим VM составляет 26,73 долл. США/месяц против 8,03 долл. США/месяц. Это 3,25x более низкая стоимость. Конечно, упреждающие VMS имеют их Ограничения Что вам нужно ознакомиться с и противодействовать, но это целая другая тема.

Со всеми вышеприведенными на месте он чувствовал, что мы все имеем правильные вещи, чтобы сохранить расходы на низкую. Однако у меня всегда было новое чувство, что что-то выключено.

О том, что ощущение Nagging:

Среднее использование ЦП на узел было низким (10% -20%). Это не казалось правильным.

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

Я проиллюстрирую свою ошибку через пример одного развертывания «Admdesl».

В нашем случае требования к ресурсам являются спорадические:

NAME                       CPU(cores)   MEMORY(bytes)
admdesl-5fcfbb5544-lq7wc   3m           112Mi
admdesl-5fcfbb5544-mfsvf   3m           118Mi
admdesl-5fcfbb5544-nj49v   4m           107Mi
admdesl-5fcfbb5544-nkvk9   3m           103Mi
admdesl-5fcfbb5544-nxbrd   3m           117Mi
admdesl-5fcfbb5544-pb726   3m           98Mi
admdesl-5fcfbb5544-rhhgn   83m          119Mi
admdesl-5fcfbb5544-rhp76   2m           105Mi
admdesl-5fcfbb5544-scqgq   4m           117Mi
admdesl-5fcfbb5544-tn556   49m          101Mi
admdesl-5fcfbb5544-tngv4   2m           135Mi
admdesl-5fcfbb5544-vcmjm   22m          106Mi
admdesl-5fcfbb5544-w9dsv   180m         100Mi
admdesl-5fcfbb5544-whwtk   3m           103Mi
admdesl-5fcfbb5544-wjnnk   132m         110Mi
admdesl-5fcfbb5544-xrrvt   4m           124Mi
admdesl-5fcfbb5544-zhbqw   4m           112Mi
admdesl-5fcfbb5544-zs75s   144m         103Mi

Стручки, которые в среднем 5 м — «простаистым»: есть задача в очереди для них для обработки, но мы ждем некоторого (внешнего) условия, чтобы очистить перед продолжением. В случае этого конкретного развертывания эти стручки будут изменяться между холостым/активным состоянием несколько раз каждую минуту и тратить 70% + в состоянии холостого состояния.

После минуты позже один и тот же набор стручков будет выглядеть по-другому:

NAME                       CPU(cores)   MEMORY(bytes)
admdesl-5fcfbb5544-lq7wc   152m         107Mi
admdesl-5fcfbb5544-mfsvf   49m          102Mi
admdesl-5fcfbb5544-nj49v   151m         116Mi
admdesl-5fcfbb5544-nkvk9   105m         100Mi
admdesl-5fcfbb5544-nxbrd   160m         119Mi
admdesl-5fcfbb5544-pb726   6m           103Mi
admdesl-5fcfbb5544-rhhgn   20m          109Mi
admdesl-5fcfbb5544-rhp76   110m         103Mi
admdesl-5fcfbb5544-scqgq   13m          120Mi
admdesl-5fcfbb5544-tn556   131m         115Mi
admdesl-5fcfbb5544-tngv4   52m          113Mi
admdesl-5fcfbb5544-vcmjm   102m         104Mi
admdesl-5fcfbb5544-w9dsv   18m          125Mi
admdesl-5fcfbb5544-whwtk   173m         122Mi
admdesl-5fcfbb5544-wjnnk   31m          110Mi
admdesl-5fcfbb5544-xrrvt   91m          126Mi
admdesl-5fcfbb5544-zhbqw   49m          107Mi
admdesl-5fcfbb5544-zs75s   87m          148Mi

Глядя на вышеупомянутое, я думал, что имеет смысл иметь такую конфигурацию, как:

resources:
  requests:
    memory: '150Mi'
    cpu: '20m'
  limits:
    memory: '250Mi'
    cpu: '200m'

Это переводит:

  • холостые стручки не потребляют более 20 м
  • Активные (здоровые) пик стручков в 200 м

Однако, когда я использовал эту конфигурацию, это сделало развертывание беспокойными.

admdesl-78fc6f5fc9-xftgr  0/1    Terminating                3         21m
admdesl-78fc6f5fc9-xgbcq  0/1    Init:CreateContainerError  0         10m
admdesl-78fc6f5fc9-xhfmh  0/1    Init:CreateContainerError  1         9m44s
admdesl-78fc6f5fc9-xjf4r  0/1    Init:CreateContainerError  0         10m
admdesl-78fc6f5fc9-xkcfw  0/1    Terminating                0         20m
admdesl-78fc6f5fc9-xksc9  0/1    Init:0/1                   0         10m
admdesl-78fc6f5fc9-xktzq  1/1    Running                    0         10m
admdesl-78fc6f5fc9-xkwmw  0/1    Init:CreateContainerError  0         9m43s
admdesl-78fc6f5fc9-xm8pt  0/1    Init:0/1                   0         10m
admdesl-78fc6f5fc9-xmhpn  0/1    CreateContainerError       0         8m56s
admdesl-78fc6f5fc9-xn25n  0/1    Init:0/1                   0         9m6s
admdesl-78fc6f5fc9-xnv4c  0/1    Terminating                0         20m
admdesl-78fc6f5fc9-xp8tf  0/1    Init:0/1                   0         10m
admdesl-78fc6f5fc9-xpc2h  0/1    Init:0/1                   0         10m
admdesl-78fc6f5fc9-xpdhr  0/1    Terminating                0         131m
admdesl-78fc6f5fc9-xqflf  0/1    CreateContainerError       0         10m
admdesl-78fc6f5fc9-xrqjv  1/1    Running                    0         10m
admdesl-78fc6f5fc9-xrrwx  0/1    Terminating                0         21m
admdesl-78fc6f5fc9-xs79k  0/1    Terminating                0         21m

Это произойдет, когда новый узел приведен/из кластера (который часто происходит за счет автоматического масштабирования).

Таким образом, я продолжал увеличивать запрошенные ресурсы POD, пока я не закончился со следующей конфигурацией для этого развертывания:

resources:
  requests:
    memory: '150Mi'
    cpu: '100m'
  limits:
    memory: '250Mi'
    cpu: '500m'

С этой конфигурацией кластер бежал гладко, но это означало, что даже простаистые стручки были предварительно выделены больше времени ЦП, чем им нужно. Это причина, по которой среднее использование ЦП на узел было низким. Тем не менее, я не знал, что такое решение (снижение запрашиваемых ресурсов привело к гектичному кластеру состояния/отключениям/отключениям), и как таковой я свернул с вариацией щедрого распределения ресурсов для всех развертываний.

Отвечать

Вернемся к моему вопросу:

В чем разница между кластером Kubernetes, используя 100x N1-Standard-1 (1 VCPU) VMS VS имеет 1x N1-Standard-96 (VCPU 96) или 6x N1-Standard-16 VMS (VCPU 16)?

Для начала нет цены — на VCPU разницы между N1-Standard-1 и N1-Standard-96 Отказ Поэтому я рассуждаю, что с помощью машины с меньшим количеством VCPU собирается дать мне больше грануляционного контроля над ценой.

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

И поэтому я пошел с в основном 1 узлами VCPU, следствием которых я описал в помещении.

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

Что сработало:

  • Я перешел на 16 машин VCPU, потому что они обеспечивают сбалансированное решение между тонким контролем ресурсов при автоматическом масштабов кластера и достаточных ресурсов на машину для включения жесткого планирования стручков, которые проходят через простые/активные состояния.
  • Я использовал конфигурацию ресурсов, которая требует только незначительно больше, чем ресурсы, которые необходимы во время простоя, но имеют щедрые пределы. Это позволяет иметь много стручков, запланированных на одной и той же машине, когда большинство стручков находятся в состоянии ожидания, но все же допускают ресурсы интенсивных всплесков.
  • Я перешел на N2 Тип машины: N2 Машины дороже, но у них есть базовая частота 2,8 ГГц (сравнивайтесь с ~ 2,2 ГГц, доступны для N1- * Machines). Мы предпринимаем преимущество более высокой часовой частоты для обработки интенсивных задач ресурсов как можно быстрее, и поставим стручки в более раннее описанное состояние бездействия как можно быстрее.

Текущий средний узел узел VCPU утилизация до 60%. Это звучит вправо. Примут некоторые, чтобы сделать вывод, что такое сбережения. Однако сегодня мы уже используем менее половины VCPU, что мы использовали вчера в то же время.

Оригинал: «https://dev.to/gajus/mistake-that-cost-thousands-kubernetes-gke-46ij»