Kubernetes-пен жұмыс істегенде бұлттық шығындарды қалай үнемдеуге болады? Бірыңғай дұрыс шешім жоқ, бірақ бұл мақала ресурстарыңызды тиімдірек басқаруға және бұлтты есептеу шығындарын азайтуға көмектесетін бірнеше құралдарды сипаттайды.
Мен бұл мақаланы Kubernetes for AWS көмегімен жаздым, бірақ ол (дерлік) басқа бұлттық провайдерлерге дәл солай қолданылады. Мен сіздің кластерлеріңізде автоматты масштабтау конфигурацияланған деп ойлаймын (кластер-автомасштабтауыш). Ресурстарды жою және орналастыруды кішірейту жұмысшы түйіндерінің паркін (EC2 даналары) азайтса ғана ақшаңызды үнемдейді.
ресурстарды шектен тыс резервтеуді азайту (kube-ресурс-есеп, VPA)
Spot даналарын пайдалану
Пайдаланылмаған ресурстарды тазарту
Қарқынды ортада жұмыс істеу өте жақсы. Біз технологиялық ұйымдарды қалаймыз жеделдетілген. Бағдарламалық қамтамасыз етуді жылдамырақ жеткізу сонымен қатар көбірек PR орналастыруды, алдын ала қарау орталарын, прототиптерді және аналитикалық шешімдерді білдіреді. Барлығы Kubernetes-те орналастырылған. Сынақтық орналастыруларды қолмен тазалауға кімнің уақыты бар? Апталық тәжірибені жоюды ұмыту оңай. Жабуды ұмытып кеткен нәрсеге байланысты бұлт шотының өсуі аяқталады:
(Хеннинг Джейкобс:
Жиза:
(дәйексөздер) Кори Куинн:
Миф: AWS тіркелгіңіз сізде бар пайдаланушылар санының функциясы болып табылады.
Факт: AWS ұпайыңыз сізде бар инженерлер санының функциясы болып табылады.
Иван Курносов (жауап ретінде):
Нақты факт: AWS ұпайыңыз өшіруді/жоюды ұмытып кеткен нәрселер санының функциясы болып табылады.)
Кубернетес тазалаушы (kube-canitor) кластерді тазалауға көмектеседі. Тазалаушы конфигурациясы жаһандық және жергілікті пайдалану үшін икемді:
Жалпы кластерлік ережелер PR/сынақ орналастырулары үшін ең ұзақ өмір сүру уақытын (TTL) анықтай алады.
Жеке ресурстарға janitor/ttl арқылы түсініктеме беруге болады, мысалы, 7 күннен кейін спик/прототипті автоматты түрде жою үшін.
Жалпы ережелер YAML файлында анықталған. Оның жолы параметр арқылы өтеді --rules-file сыпырушыда. Мұнда барлық аттар кеңістігін жоюға арналған мысал ережесі берілген -pr- екі күннен кейін атына:
Келесі мысал 2020 жылы барлық жаңа Deployments/StatefulSets үшін Deployment және StatefulSet қосқыштарындағы қолданба белгісін пайдалануды реттейді, бірақ сонымен бірге бір апта бойы осы белгісіз сынақтарды орындауға мүмкіндік береді:
- 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
Kube-janitor іске қосылған кластерде 30 минут ішінде шектеулі демонстрацияны іске қосыңыз:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
Шығындарды арттырудың тағы бір көзі тұрақты көлемдер болып табылады (AWS EBS). Kubernetes StatefulSet жою оның тұрақты томдарын жоймайды (PVC - PersistentVolumeClaim). Пайдаланылмаған EBS көлемдері айына жүздеген доллар шығындарға әкелуі мүмкін. Kubernetes Janitor қолданбасында пайдаланылмаған ПВХ-ны тазалау мүмкіндігі бар. Мысалы, бұл ереже модуль арқылы орнатылмаған және StatefulSet немесе CronJob арқылы сілтеме жасалмаған барлық PVC файлдарын жояды:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
Kubernetes Janitor кластеріңізді таза ұстауға және бұлтты есептеу шығындарының баяу жиналуының алдын алуға көмектеседі. Орналастыру және конфигурациялау нұсқауларын орындаңыз README кубе тазалаушы.
Жұмыстан тыс уақытта масштабтауды азайтыңыз
Сынақ және кезеңдік жүйелер әдетте жұмыс уақытында ғана жұмыс істеуі қажет. Кейбір өндірістік қолданбалар, мысалы, бэк-офис/әкімші құралдары да шектеулі қолжетімділікті талап етеді және олар бір түнде өшірілуі мүмкін.
Kubernetes кішірейткіш (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 blank іске қосу арқылы:
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
Қараңыз README куб кішірейткіш, орналастыру нұсқаулары мен қосымша опцияларға қызығушылық танытсаңыз.
Көлденең автоматты масштабтауды пайдаланыңыз
Көптеген қолданбалар/қызметтер динамикалық жүктеу үлгісімен айналысады: кейде олардың модульдері жұмыс істемейді, ал кейде олар толық қуатта жұмыс істейді. Максималды жүктемені жеңу үшін тұрақты қораптар паркін пайдалану үнемді емес. Kubernetes ресурс бойынша көлденең автоматты масштабтауды қолдайды HorizontalPodAutoscaler (HPA). Процессорды пайдалану жиі масштабтау үшін жақсы көрсеткіш болып табылады:
Zalando масштабтау үшін теңшелетін көрсеткіштерді оңай қосу үшін құрамдас жасады: Kube метрика адаптері (kube-metrics-adapter) — бөтелкелердің көлденең автомасштабтауы үшін реттелетін және сыртқы көрсеткіштерді жинап, қызмет көрсете алатын Kubernetes үшін жалпы метрика адаптері. Ол Prometheus метрикасына, SQS кезектеріне және басқа параметрлерге негізделген масштабтауды қолдайды. Мысалы, қолдануды /metrics ішіндегі JSON ретінде қолданбаның өзі көрсететін теңшелетін метрикаға масштабтау үшін:
HPA көмегімен көлденең автомасштабтауды теңшеу азаматтығы жоқ қызметтердің тиімділігін арттыруға арналған әдепкі әрекеттердің бірі болуы керек. Spotify-да HPA бойынша тәжірибесі мен ұсыныстары бар презентация бар: әмияныңызды емес, орналастыруларыңызды масштабтаңыз.
Ресурсқа артық тапсырыс беруді азайтыңыз
Kubernetes жұмыс жүктемелері олардың CPU/жад қажеттіліктерін «ресурс сұраулары» арқылы анықтайды. CPU ресурстары виртуалды ядроларда немесе әдетте «милликорларда» өлшенеді, мысалы 500м 50% vCPU білдіреді. Жад ресурстары байттармен өлшенеді және 500Mi сияқты жалпы жұрнақтарды қолдануға болады, бұл 500 мегабайтты білдіреді. Ресурс сұраулары жұмысшы түйіндеріндегі «құлыптау» сыйымдылығы, яғни 1000 vCPU бар түйінде 4 м CPU сұрауы бар подключ басқа қосқыштар үшін қолжетімді тек 3 vCPU қалдырады. [1]
Босаңсу (артық резерв) сұралған ресурстар мен нақты пайдалану арасындағы айырмашылық болып табылады. Мысалы, 2 ГБ жадты сұрайтын, бірақ тек 200 МБ пайдаланатын подводта ~1,8 ГБ «артық» жады бар. Артық ақшаға кетеді. 1 ГБ артық жадтың айына ~ 10 доллар тұратынын шамамен бағалауға болады. [2]
Kubernetes ресурстарының есебі (kube-resource-report) артық қорларды көрсетеді және үнемдеу әлеуетін анықтауға көмектеседі:
Kubernetes ресурстарының есебі қолданба және пәрмен арқылы жинақталған артық көрсеткішті көрсетеді. Бұл ресурстарға сұранысты азайтуға болатын орындарды табуға мүмкіндік береді. Жасалған HTML есебі тек ресурстарды пайдаланудың суретін береді. Сәйкес ресурс сұраныстарын анықтау үшін уақыт өте келе CPU/жадты пайдалануды қарау керек. Міне, «әдеттегі» процессоры ауыр қызметке арналған Grafana диаграммасы: барлық блоктар сұралған 3 CPU ядросынан әлдеқайда аз пайдаланады:
CPU сұрауын 3000 м-ден ~ 400 м-ге дейін азайту басқа жұмыс жүктемелері үшін ресурстарды босатады және кластердің кішірек болуына мүмкіндік береді.
Бірақ біз адамдардың YAML файлдарындағы мәндерді өзгерткенін қалаймыз ба? Жоқ, машиналар мұны әлдеқайда жақсы жасай алады! Кубернетес Vertical Pod Autoscaler (VPA) дәл осылай жасайды: ресурс сұраулары мен шектеулерді жұмыс жүктемесіне сәйкес бейімдейді. Міне, уақыт өте келе VPA бейімделген Prometheus CPU сұрауларының мысал графигі (жұқа көк сызық):
Голдилокс Fairwind - аттар кеңістігінде әрбір орналастыру үшін VPA жасайтын құрал, содан кейін оның бақылау тақтасында VPA ұсынысын көрсетеді. Ол әзірлеушілерге өз қолданбалары үшін дұрыс CPU/жад сұрауларын орнатуға көмектеседі:
Соңғысы, бірақ кем дегенде, Spot даналарын Kubernetes жұмысшы түйіндері ретінде пайдалану арқылы AWS EC2 шығындарын азайтуға болады. [3]. Spot үлгілері сұраныс бойынша бағалармен салыстырғанда 90%-ға дейінгі жеңілдікпен қол жетімді. EC2 Spot жүйесінде Kubernetes-ті іске қосу - жақсы комбинация: жоғары қолжетімділік үшін бірнеше түрлі дана түрлерін көрсету керек, яғни бірдей немесе төмен бағаға үлкенірек түйінді алуға болады және ұлғайтылған сыйымдылықты контейнерлік Kubernetes жұмыс жүктемелері пайдалана алады.
Kubernetes-ті EC2 Spot-те қалай іске қосуға болады? Бірнеше опция бар: SpotInst сияқты үшінші тарап қызметін пайдаланыңыз (қазір «Spot» деп аталады, себебін сұрамаңыз) немесе жай ғана кластерге Spot AutoScalingGroup (ASG) қосыңыз. Мысалы, бірнеше дана түрлері бар "сыйымдылығы оңтайландырылған" Spot ASG үшін CloudFormation үзіндісі:
Kubernetes-те бұлттық шығындарды үнемдеудің ең жақсы тәжірибелері қандай? Маған хабарлаңыз Twitter (@try_except_).
[1] Іс жүзінде 3-тен аз vCPU пайдалануға жарамды болып қалады, себебі жүйенің резервтік ресурстары түйіннің өткізу қабілетін азайтады. Кубернетес физикалық түйін сыйымдылығы мен «қамтамасыз етілген» ресурстарды ажыратады (Бөлінетін түйін).
[2] Есептеу мысалы: 5 ГБ жады бар бір m8.large данасы айына ~ $84 (eu-central-1, сұраныс бойынша), яғни. 1/8 түйінді блоктау шамамен айына ~ $10 құрайды.
[3] EC2 шотыңызды азайтудың тағы да көптеген жолдары бар, мысалы, резервтелген даналар, жинақ жоспары және т.