Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Тарҷумаи мақола дар арафаи оғози курс омода шудааст "Платформаи инфрасохторӣ дар асоси Kubernetes".

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Ҳангоми кор бо Kubernetes хароҷоти абрро чӣ гуна сарфа кардан мумкин аст? Ягон роҳи ягонаи дуруст вуҷуд надорад, аммо ин мақола якчанд асбобҳоро тавсиф мекунад, ки метавонанд ба шумо захираҳои худро самараноктар идора кунанд ва хароҷоти роёниши абрии худро кам кунанд.

Ман ин мақоларо бо Kubernetes for AWS дар назар доштам, аммо он (қариб) маҳз ҳамин тавр ба дигар провайдерҳои абр татбиқ хоҳад шуд. Ман фарз мекунам, ки кластер(ҳо)-и шумо аллакай миқёси худкорро танзим кардаанд (кластер-автомаскара). Хориҷ кардани захираҳо ва миқёси ҷойгиркунии шумо танҳо пулро сарфа мекунад, агар он инчунин парки гиреҳҳои коргарии шуморо кам кунад (намунаҳои EC2).

Дар ин ҳолат чунин хоҳад буд:

  • тоза кардани захираҳои истифоданашуда (фаррош кубе)
  • Коҳиш додани миқёс дар вақти ғайрикорӣ (пасткунандаи куб)
  • истифодаи автоматии уфуқӣ (HPA),
  • кам кардани захираи аз ҳад зиёди захираҳо (kube-resource-report, VPA)
  • бо истифода аз мисолҳои Spot

Тоза кардани захираҳои истифоданашуда

Кор дар муҳити босуръат бузург аст. Мо ташкилотҳои технологӣ мехоҳем суръат гирифт. Интиқоли зудтари нармафзор инчунин маънои густариши бештари PR, муҳити пешнамоиш, прототипҳо ва ҳалли таҳлилиро дорад. Ҳама чиз дар Kubernetes ҷойгир карда шудааст. Кӣ вақт дорад, ки ҷойгиркунии санҷишҳоро дастӣ тоза кунад? Дар бораи нест кардани таҷрибаи якҳафтаина фаромӯш кардан осон аст. Ҳисоби абрӣ бо сабаби чизе ки мо пӯшидани онро фаромӯш кардаем, боло меравад:

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

(Хеннинг Ҷейкобс:
Жиза:
(иқтибосҳо) Кори Куинн:
Афсона: Ҳисоби AWS-и шумо вазифаи шумораи корбарони шумост.
Далел: Холи AWS-и шумо як функсияи шумораи муҳандисонест, ки шумо доред.

Иван Курносов (дар чавоб):
Далели воқеӣ: Холи AWS-и шумо як функсияи шумораи чизҳоест, ки шумо хомӯш кардан/нест карданро фаромӯш кардаед.)

Фаррош Кубернетес (kube-devertor) дар тоза кардани кластери шумо кӯмак мекунад. Конфигуратсияи фаррош ҳам барои истифодаи глобалӣ ва ҳам маҳаллӣ чандир аст:

  • Қоидаҳои кластерӣ метавонанд ҳадди аксар вақтро барои зиндагӣ (TTL) барои густариши PR/озмоиш муайян кунанд.
  • Захираҳои инфиродӣ метавонанд бо фаррош/ttl шарҳ дода шаванд, масалан, пас аз 7 рӯз ба таври худкор хӯша/прототипро нест кунед.

Қоидаҳои умумӣ дар файли YAML муайян карда шудаанд. Роҳи он аз параметр мегузарад --rules-file дар кубе-фаррош. Дар ин ҷо як қоидаи намунавӣ барои нест кардани ҳама фазои номҳо бо -pr- ба номи пас аз ду рӯз:

- id: cleanup-resources-from-pull-requests
  resources:
    - namespaces
  jmespath: "contains(metadata.name, '-pr-')"
  ttl: 2d

Мисоли зерин истифодаи нишони барномаро дар подкастҳои 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

Дар кластере, ки 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 дорои хусусияти тоза кардани PVC-ҳои истифоданашуда мебошад. Масалан, ин қоида ҳама 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 метавонад ба шумо кӯмак кунад, ки кластери худро тоза нигоҳ доред ва аз афзоиши оҳиста-оҳиста хароҷоти роёниши абрӣ пешгирӣ кунед. Барои дастурҳои ҷойгиркунӣ ва конфигуратсия, пайравӣ кунед README кубе-фаррош.

Миқёсро дар вақти ғайрикорӣ кам кунед

Системаҳои санҷишӣ ва марҳилавӣ одатан талаб карда мешаванд, ки танҳо дар соатҳои корӣ кор кунанд. Баъзе замимаҳои истеҳсолӣ, аз қабили абзорҳои пушти офис/администратор низ танҳо дастрасии маҳдудро талаб мекунанд ва метавонанд дар як шабонарӯз хомӯш карда шаванд.

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

Ин аст график барои васеъ кардани гиреҳҳои коргари кластер дар рӯзҳои истироҳат:

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Паст кардани миқёс аз ~ 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). Истифодаи CPU аксар вақт нишондиҳандаи хуб барои миқёс аст:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 100
        type: Utilization

Zalando як ҷузъро барои ба осонӣ пайваст кардани ченакҳои фармоишӣ барои миқёс сохтааст: Адаптери Metrics Kube (kube-metrics-adapter) як адаптери ченакҳои умумӣ барои Kubernetes мебошад, ки метавонад метрикаи фармоишӣ ва беруниро барои автоматикунонии уфуқии поддонҳо ҷамъ ва хидмат расонад. Он миқёсро дар асоси метрикаи Prometheus, навбатҳои SQS ва танзимоти дигар дастгирӣ мекунад. Масалан, барои миқёси густариши худ ба метрикаи фармоишӣ, ки худи барнома ҳамчун JSON дар /metrics муаррифӣ шудааст, истифода баред:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
  annotations:
    # metric-config.<metricType>.<metricName>.<collectorName>/<configKey>
    metric-config.pods.requests-per-second.json-path/json-key: "$.http_server.rps"
    metric-config.pods.requests-per-second.json-path/path: /metrics
    metric-config.pods.requests-per-second.json-path/port: "9090"
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: requests-per-second
      target:
        averageValue: 1k
        type: AverageValue

Танзими автоматикунонии уфуқӣ бо HPA бояд яке аз амалҳои пешфарз барои баланд бардоштани самаранокии хидматҳои бидуни шаҳрвандӣ бошад. Spotify бо таҷриба ва тавсияҳои худ барои HPA презентатсия дорад: густариши худро васеъ кунед, на ҳамёни шумо.

Коҳиш додани захираҳои зиёдатӣ

Сарбории кории Kubernetes эҳтиёҷоти CPU/хотираи онҳоро тавассути "дархостҳои захиравӣ" муайян мекунад. Захираҳои CPU дар ядроҳои виртуалӣ ё бештар дар "милликорҳо" чен карда мешаванд, масалан 500m 50% vCPU-ро дар назар дорад. Захираҳои хотира бо байтҳо чен карда мешаванд ва пасвандҳои маъмулро метавон истифода бурд, ба монанди 500Mi, ки маънои 500 мегабайтро дорад. Иқтидори дархостҳои захиравӣ дар гиреҳҳои коргарӣ "қуфл" мекунад, яъне як подкаст бо дархости 1000м CPU дар гиреҳ бо 4 vCPU танҳо 3 vCPU-ро барои дигар қисмҳо дастрас хоҳад кард. [1]

сустӣ (захираи зиёдатӣ) фарқи байни захираҳои дархостшуда ва истифодаи воқеӣ аст. Масалан, як паҳлӯе, ки 2 ГБ хотира талаб мекунад, аммо танҳо 200 МБ-ро истифода мебарад, ~ 1,8 ГБ хотираи "зиёдатӣ" дорад. Аз ҳад зиёд пул сарф мекунад. Тахминан метавон тахмин кард, ки 1 ГБ хотираи зиёдатӣ дар як моҳ ~ $10 арзиш дорад. [2]

Гузориши захираҳои Kubernetes (kube-resource-report) захираҳои зиёдатиро нишон медиҳад ва метавонад ба шумо дар муайян кардани потенсиали пасандоз кӯмак расонад:

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Гузориши захираҳои Kubernetes зиёдатии бо ариза ва фармон ҷамъшуда нишон медиҳад. Ин ба шумо имкон медиҳад, ки ҷойҳоеро пайдо кунед, ки талабот ба захираҳоро кам кардан мумкин аст. Ҳисоботи HTML тавлидшуда танҳо тасвири истифодаи захираҳоро пешниҳод мекунад. Шумо бояд бо мурури замон ба истифодаи CPU/хотира назар кунед, то дархостҳои мувофиқи захираҳоро муайян кунед. Дар ин ҷо диаграммаи Grafana барои хидматрасонии "оддӣ"-и вазнини CPU оварда шудааст: ҳама подкҳо аз 3 ядрои дархостшудаи CPU ба таври назаррас камтар истифода мебаранд:

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Кам кардани дархости CPU аз 3000 то ~ 400 м захираҳоро барои сарбории кори дигар озод мекунад ва имкон медиҳад кластер хурдтар шавад.

"Истифодаи миёнаи CPU барои мисолҳои EC2 аксар вақт дар диапазони як рақами фоизӣ ҷойгир аст," менависад Кори Куинн. Дар ҳоле ки барои EC2 баҳодиҳии андозаи дуруст метавонад қарори бад бошадТағир додани баъзе дархостҳои манбаи Kubernetes дар файли YAML осон аст ва метавонад пасандозҳои калон ба даст орад.

Аммо оё мо воқеан мехоҳем, ки одамон арзишҳоро дар файлҳои YAML иваз кунанд? Не, мошинхо ин корро хеле бехтар карда метавонанд! Кубернетес Autoscaler Pod амудӣ (VPA) маҳз ҳамин тавр мекунад: дархостҳои захираҳо ва маҳдудиятҳоро мувофиқи сарбории корӣ мутобиқ мекунад. Дар ин ҷо як диаграммаи намунаи дархостҳои CPU Prometheus (хати лоғар кабуд), ки бо гузашти вақт аз ҷониби VPA мутобиқ карда шудааст:

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Zalando VPA-ро дар ҳама кластерҳои худ истифода мебарад барои ҷузъҳои инфрасохтор. Барномаҳои ғайримуқаррарӣ инчунин метавонанд VPA-ро истифода баранд.

Тиллоӣ аз Fairwind абзорест, ки барои ҳар як ҷойгиркунӣ дар фазои ном VPA эҷод мекунад ва сипас дар панели худ тавсияи VPA-ро намоиш медиҳад. Он метавонад ба таҳиягарон кӯмак кунад, ки дархостҳои CPU/хотираи дурустро барои замимаҳои худ муқаррар кунанд:

Аз хароҷоти абрии Kubernetes дар AWS сарфа кунед

Ман хурд навиштам блогпост дар бораи VPA соли 2019 ва ба наздикӣ дар Ҷамъияти истифодабарандагони ниҳоии CNCF масъалаи VPA-ро баррасӣ кард.

Истифодаи EC2 Spot Instances

Ниҳоят, аммо на камтар аз он, хароҷоти AWS EC2-ро тавассути истифодаи мисолҳои Spot ҳамчун гиреҳҳои коргарии Kubernetes кам кардан мумкин аст. [3]. Намунаҳои Spot бо тахфифи то 90% дар муқоиса бо нархҳои Талабот дастрасанд. Иҷрои Kubernetes дар EC2 Spot як комбинатсияи хуб аст: шумо бояд якчанд намудҳои гуногуни мисолҳоро барои дастрасии баландтар муайян кунед, яъне шумо метавонед гиреҳи калонтарро бо нархи якхела ё пасттар ба даст оред ва иқтидори зиёдро аз ҷониби сарбории контейнерии Kubernetes истифода бурдан мумкин аст.

Чӣ тавр Kubernetes-ро дар EC2 Spot идора кардан мумкин аст? Якчанд вариант вуҷуд дорад: хидмати тарафи сеюмро истифода баред, ба монанди SpotInst (ҳоло "Spot" ном дорад, аз ман напурсед, ки чаро) ё танҳо ба кластери худ Spot AutoScalingGroup (ASG) илова кунед. Масалан, дар ин ҷо як пораи CloudFormation барои "иқтидори оптимизатсияшуда" Spot ASG бо намудҳои сершумори мисол оварда шудааст:

MySpotAutoScalingGroup:
 Properties:
   HealthCheckGracePeriod: 300
   HealthCheckType: EC2
   MixedInstancesPolicy:
     InstancesDistribution:
       OnDemandPercentageAboveBaseCapacity: 0
       SpotAllocationStrategy: capacity-optimized
     LaunchTemplate:
       LaunchTemplateSpecification:
         LaunchTemplateId: !Ref LaunchTemplate
         Version: !GetAtt LaunchTemplate.LatestVersionNumber
       Overrides:
         - InstanceType: "m4.2xlarge"
         - InstanceType: "m4.4xlarge"
         - InstanceType: "m5.2xlarge"
         - InstanceType: "m5.4xlarge"
         - InstanceType: "r4.2xlarge"
         - InstanceType: "r4.4xlarge"
   LaunchTemplate:
     LaunchTemplateId: !Ref LaunchTemplate
     Version: !GetAtt LaunchTemplate.LatestVersionNumber
   MinSize: 0
   MaxSize: 100
   Tags:
   - Key: k8s.io/cluster-autoscaler/node-template/label/aws.amazon.com/spot
     PropagateAtLaunch: true
     Value: "true"

Баъзе ёддоштҳо дар бораи истифодаи Spot бо Kubernetes:

  • Ба шумо лозим аст, ки хотимаҳои Spot-ро идора кунед, масалан, бо якҷоя кардани гиреҳ ҳангоми қатъ шудани инстан
  • Заландо истифода мебарад чангак autoscaling кластери расмӣ бо афзалиятҳои ҳавзи гиреҳ
  • Гиреҳҳои нуқта маҷбур кардан мумкин аст "Бақайдгирии" сарбории корро барои иҷро дар Spot қабул кунед

Натиҷа

Умедворам, ки шумо баъзе асбобҳои пешниҳодшударо барои кам кардани ҳисоби абрии худ муфид хоҳед ёфт. Шумо инчунин метавонед аксари мундариҷаи мақоларо дар ин ҷо пайдо кунед сӯҳбати ман дар DevOps Gathering 2019 дар YouTube ва слайдҳо.

Таҷрибаҳои беҳтарини шумо барои сарфаи хароҷоти абрӣ дар Kubernetes кадомҳоянд? Лутфан ба ман хабар диҳед Twitter (@try_except_).

[1] Дарвоқеъ, камтар аз 3 vCPU қобили истифода боқӣ мемонанд, зеро интиқоли гиреҳ тавассути захираҳои системавии ҳифзшуда кам мешавад. Кубернетес қобилияти гиреҳи ҷисмонӣ ва захираҳои "таъминшуда"-ро фарқ мекунад (Ҷудошавандаи гиреҳ).

[2] Мисоли ҳисоб: як мисоли m5.large бо хотираи 8 ГБ ~ $84 дар як моҳ аст (eu-central-1, On-Demand), яъне. бастани 1/8 гиреҳ тақрибан ~ $10 дар як моҳ аст.

[3] Роҳҳои зиёде барои кам кардани ҳисоби EC2-и шумо ҳастанд, ба монанди Ҳолатҳои ҳифзшуда, Нақшаи пасандозҳо ва ғайра. - Ман ин мавзӯъҳоро дар ин ҷо фаро намегирам, аммо шумо бояд ҳатман онҳоро бубинед!

Дар бораи курс маълумоти бештар гиред.

Манбаъ: will.com

Илова Эзоҳ