Како да заштедите на трошоците за облак кога работите со Kubernetes? Не постои единствено правилно решение, но овој напис опишува неколку алатки кои можат да ви помогнат поефикасно да управувате со вашите ресурси и да ги намалите трошоците за компјутерски облак.
Ја напишав оваа статија имајќи го предвид Kubernetes за AWS, но ќе се применува (речиси) токму на ист начин за другите даватели на облак. Претпоставувам дека вашиот кластер(и) веќе имаат конфигурирано автоматско скалирање (кластер-автоскалирач). Отстранувањето на ресурсите и намалувањето на вашето распоредување ќе ви заштеди пари само ако ја намали и вашата флота од работнички јазли (случаи EC2).
Работата во средина со брзо темпо е одлична. Сакаме технолошки организации забрзано. Побрзата испорака на софтвер значи и повеќе распоредувања на односи со јавноста, околини за преглед, прототипови и аналитички решенија. Сè е распоредено на Кубернетес. Кој има време рачно да ги исчисти тест распоредувањата? Лесно е да се заборави за бришење на експеримент стар една недела. Сметката на облакот ќе заврши да расте поради нешто што заборавивме да го затвориме:
(Хенинг Џејкобс:
Жиза:
(цитати) Кори Квин:
Мит: Вашата сметка AWS е функција на бројот на корисници што ги имате.
Факт: Вашиот резултат AWS е во функција на бројот на инженери што ги имате.
Иван Курносов (како одговор):
Вистински факт: Вашиот резултат AWS е функција на бројот на работи што сте заборавиле да ги оневозможите/бришете.)
Кубернетис чувар (kube-janitor) помага да се исчисти вашиот кластер. Конфигурацијата на чуварот е флексибилна и за глобална и за локална употреба:
Правилата низ целиот кластер може да го дефинираат максималното време за живот (TTL) за распоредувања на ПР/тест.
Индивидуалните ресурси може да бидат означени со janitor/ttl, на пример за автоматско отстранување на шилецот/прототипот по 7 дена.
Општите правила се дефинирани во датотеката YAML. Нејзината патека се пренесува низ параметарот --rules-file во кубе-домар. Еве пример правило за отстранување на сите именски простори со кои -pr- на име по два дена:
Следниот пример ја регулира употребата на етикетата на апликацијата на местата Deployment и StatefulSet за сите нови Deployments/StatefulSets во 2020 година, но во исто време дозволува извршување на тестови без оваа ознака за една недела:
- id: require-application-label
# удалить deployments и statefulsets без метки "application"
resources:
- deployments
- statefulsets
# см. http://jmespath.org/specification.html
jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
ttl: 7d
Изведете временски ограничено демо за 30 минути на кластер што работи kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
Друг извор на зголемување на трошоците се постојаните волумени (AWS EBS). Бришењето на Kubernetes StatefulSet не ги брише неговите постојани томови (PVC - PersistentVolumeClaim). Неискористените тома EBS лесно може да резултираат со трошоци од стотици долари месечно. Kubernetes Janitor има функција за чистење на неискористени ПВЦ. На пример, ова правило ќе ги отстрани сите PVC-а кои не се монтирани од модул и кои не се референцирани од StatefulSet или CronJob:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
Kubernetes Janitor може да ви помогне да го одржите вашиот кластер чист и да спречите полека да се натрупуваат трошоците за облак компјутери. За инструкции за распоредување и конфигурација, следете ПРОЧИТАЈ кубе-домар.
Намалете го скалирањето за време на неработни часови
Системите за тестирање и распоредување обично се потребни за работа само за време на работното време. Некои производствени апликации, како што се алатките за back office/admin, исто така бараат само ограничена достапност и може да се оневозможат преку ноќ.
Kubernetes Downscaler (kube-downscaler) им овозможува на корисниците и операторите да го намалат системот за време на неработни часови. Распоредувањата и StatefulSets може да се намалат на нула реплики. CronJobs може да биде суспендиран. Kubernetes Downscaler е конфигуриран за цел кластер, еден или повеќе именски простори или индивидуални ресурси. Можете да поставите или „време на мирување“ или, обратно, „време на работа“. На пример, за да се намали скалирањето што е можно повеќе за време на ноќите и викендите:
image: hjacobs/kube-downscaler:20.4.3
args:
- --interval=30
# не отключать компоненты инфраструктуры
- --exclude-namespaces=kube-system,infra
# не отключать kube-downscaler, а также оставить Postgres Operator, чтобы исключенными БД можно было управлять
- --exclude-deployments=kube-downscaler,postgres-operator
- --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
- --include-resources=deployments,statefulsets,stacks,cronjobs
- --deployment-time-annotation=deployment-time
Еве графикон за скалирање на работните јазли на кластерот за време на викендите:
Смалувањето од ~ 13 на 4 работнички јазли секако прави забележителна разлика во вашата сметка за AWS.
Но, што ако треба да работам за време на „застој“ на кластерот? Одредени распоредувања може трајно да се исклучат од скалирање со додавање на намалување/исклучување: вистинска прибелешка. Распоредувањата може привремено да се исклучат со помош на намалувачот/исклучување-до прибелешка со апсолутен временски печат во формат ГГГГ-ММ-ДД Ч:ММ (UTC). Доколку е потребно, целиот кластер може да се намали со распоредување на подлога со прибелешката downscaler/force-uptime, на пример, со лансирање на nginx празно:
kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # удалить развертывание через час
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true
Види ПРОЧИТАЈ кубе-намалување, ако сте заинтересирани за инструкции за распоредување и дополнителни опции.
Користете хоризонтално автоматско скалирање
Многу апликации/услуги се занимаваат со шема на динамично вчитување: понекогаш нивните модули се неактивен, а понекогаш работат со полн капацитет. Ракувањето со постојана флота од мешунки за да се справите со максималното максимално оптоварување не е економично. Kubernetes поддржува хоризонтално автоматско скалирање низ ресурс HorizontalPodAutoscaler (HPA). Користењето на процесорот често е добар показател за скалирање:
Zalando создаде компонента за лесно поврзување на сопствените метрики за скалирање: Kube Metrics адаптер (kube-metrics-adapter) е генерички адаптер за метрика за Kubernetes што може да собира и опслужува прилагодени и надворешни метрика за хоризонтално автоматско скалирање на парчиња. Поддржува скалирање врз основа на метрика на Prometheus, редици SQS и други поставки. На пример, за да го скалирате вашето распоредување на приспособена метрика претставена од самата апликација како JSON во /metrics користете:
Конфигурирањето на хоризонталното автоматско скалирање со HPA треба да биде едно од стандардните дејства за подобрување на ефикасноста на услугите без државјанство. Spotify има презентација со нивното искуство и препораки за HPA: зголемете ги вашите распоредувања, а не вашиот паричник.
Намалете го пререзервирањето на ресурсите
Работните оптоварувања на Kubernetes ги одредуваат нивните потреби за процесор/меморија преку „барања за ресурси“. Ресурсите на процесорот се мерат во виртуелни јадра или почесто во „миликори“, на пример 500m подразбира 50% vCPU. Мемориските ресурси се мерат во бајти, а може да се користат и вообичаени суфикси, како 500Mi, што значи 500 мегабајти. Капацитетот на барањата за ресурси за „заклучување“ на работните јазли, што значи дека подлогата со барање за процесор од 1000 m на јазол со 4 vCPU ќе остави само 3 vCPU достапни на другите места. [1]
Слаба (вишок резерва) е разликата помеѓу бараните ресурси и вистинската употреба. На пример, pod што бара 2 GiB меморија, но користи само 200 MiB, има ~ 1,8 GiB „вишок“ меморија. Вишокот чини пари. Може грубо да се процени дека 1 GiB вишок меморија чини ~ 10 долари месечно. [2]
Извештај за ресурсите на Кубернетес (kube-resource-report) ги прикажува вишокот резерви и може да ви помогне да го одредите потенцијалот за заштеда:
Извештај за ресурсите на Кубернетес го покажува вишокот собран по апликација и команда. Ова ви овозможува да најдете места каде што потребите за ресурси може да се намалат. Генерираниот HTML извештај дава само слика од користењето на ресурсите. Треба да го погледнете користењето на процесорот/меморијата со текот на времето за да одредите соодветни барања за ресурси. Еве Графана табела за „типична“ услуга тешка за процесорот: сите подлоги користат значително помалку од 3-те барани јадра на процесорот:
Намалувањето на барањето на процесорот од 3000m на ~400m ги ослободува ресурсите за други оптоварувања и овозможува кластерот да биде помал.
Но, дали навистина сакаме луѓето да ги менуваат вредностите во датотеките YAML? Не, машините можат многу подобро! Кубернетис Вертикален Pod Autoscaler (VPA) го прави токму тоа: ги прилагодува барањата и ограничувањата за ресурси според обемот на работа. Еве еден пример график на барања за процесорот Prometheus (тенка сина линија) приспособена од VPA со текот на времето:
Goldilocks од Fairwind е алатка која создава VPA за секое распоредување во именскиот простор и потоа прикажува VPA препорака на неговата контролна табла. Може да им помогне на програмерите да ги постават точните барања за процесорот/меморијата за нивните апликации:
Последно, но не и најмалку важно, трошоците за AWS EC2 може да се намалат со користење на Spot инстанци како работнички јазли на Kubernetes [3]. Спотовите се достапни со попуст до 90% во споредба со цените на барање. Работењето на Kubernetes на EC2 Spot е добра комбинација: треба да наведете неколку различни типови на примероци за поголема достапност, што значи дека можете да добиете поголем јазол за иста или пониска цена, а зголемениот капацитет може да се користи од контејнеризирани работни оптоварувања на Kubernetes.
Како да го стартувате Kubernetes на EC2 Spot? Има неколку опции: користете услуга од трета страна како SpotInst (сега наречена „Spot“, не ме прашувајте зошто) или едноставно додадете Spot AutoScalingGroup (ASG) во вашиот кластер. На пример, еве фрагмент CloudFormation за Spot ASG „оптимизиран за капацитет“ со повеќе типови на примери:
Кои се вашите најдобри практики за заштеда на трошоците за облак на Kubernetes? Ве молам известете ме на Твитер (@try_except_).
[1] Всушност, помалку од 3 vCPU ќе останат употребливи бидејќи пропусната моќ на јазолот се намалува со резервирани системски ресурси. Kubernetes прави разлика помеѓу физички капацитет на јазол и „обезбедени“ ресурси (Јазол што може да се распредели).
[2] Пример за пресметка: еден m5.голем пример со 8 GiB меморија е ~ 84 $ месечно (eu-central-1, On-Demand), т.е. блокирањето на 1/8 јазол е приближно ~ $10/месец.
[3] Има многу повеќе начини да ја намалите вашата сметка EC2, како што се резервирани примероци, план за штедење итн. - Нема да ги обработувам тие теми овде, но дефинитивно треба да ги разгледате!