Нет преувеличения, к сожалению. Как отказ от ответственности, я добавлю, что это действительно глупое ошибка и показывает мое отсутствие опыта, управляющего развертыванием автоматического масштабирования. Однако все это началось с вопроса без ответа, и я чувствую себя обязанным поделиться своими участиями, чтобы помочь другим избежать подобных ловушек.
В чем разница между кластером 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»