AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

Мақаланың аудармасы курстың басталу қарсаңында дайындалды «Кубернетес негізіндегі инфрақұрылымдық платформа».

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

Kubernetes-пен жұмыс істегенде бұлттық шығындарды қалай үнемдеуге болады? Бірыңғай дұрыс шешім жоқ, бірақ бұл мақала ресурстарыңызды тиімдірек басқаруға және бұлтты есептеу шығындарын азайтуға көмектесетін бірнеше құралдарды сипаттайды.

Мен бұл мақаланы Kubernetes for AWS көмегімен жаздым, бірақ ол (дерлік) басқа бұлттық провайдерлерге дәл солай қолданылады. Мен сіздің кластерлеріңізде автоматты масштабтау конфигурацияланған деп ойлаймын (кластер-автомасштабтауыш). Ресурстарды жою және орналастыруды кішірейту жұмысшы түйіндерінің паркін (EC2 даналары) азайтса ғана ақшаңызды үнемдейді.

Бұл мақала мыналарды қамтиды:

  • пайдаланылмаған ресурстарды тазалау (сыпырушы)
  • Жұмыстан тыс уақытта масштабтауды азайтыңыз (куб масштабын азайту)
  • көлденең автомасштабтауды (HPA) пайдалану,
  • ресурстарды шектен тыс резервтеуді азайту (kube-ресурс-есеп, VPA)
  • Spot даналарын пайдалану

Пайдаланылмаған ресурстарды тазарту

Қарқынды ортада жұмыс істеу өте жақсы. Біз технологиялық ұйымдарды қалаймыз жеделдетілген. Бағдарламалық қамтамасыз етуді жылдамырақ жеткізу сонымен қатар көбірек PR орналастыруды, алдын ала қарау орталарын, прототиптерді және аналитикалық шешімдерді білдіреді. Барлығы Kubernetes-те орналастырылған. Сынақтық орналастыруларды қолмен тазалауға кімнің уақыты бар? Апталық тәжірибені жоюды ұмыту оңай. Жабуды ұмытып кеткен нәрсеге байланысты бұлт шотының өсуі аяқталады:

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

(Хеннинг Джейкобс:
Жиза:
(дәйексөздер) Кори Куинн:
Миф: AWS тіркелгіңіз сізде бар пайдаланушылар санының функциясы болып табылады.
Факт: AWS ұпайыңыз сізде бар инженерлер санының функциясы болып табылады.

Иван Курносов (жауап ретінде):
Нақты факт: AWS ұпайыңыз өшіруді/жоюды ұмытып кеткен нәрселер санының функциясы болып табылады.)

Кубернетес тазалаушы (kube-canitor) кластерді тазалауға көмектеседі. Тазалаушы конфигурациясы жаһандық және жергілікті пайдалану үшін икемді:

  • Жалпы кластерлік ережелер PR/сынақ орналастырулары үшін ең ұзақ өмір сүру уақытын (TTL) анықтай алады.
  • Жеке ресурстарға janitor/ttl арқылы түсініктеме беруге болады, мысалы, 7 күннен кейін спик/прототипті автоматты түрде жою үшін.

Жалпы ережелер YAML файлында анықталған. Оның жолы параметр арқылы өтеді --rules-file сыпырушыда. Мұнда барлық аттар кеңістігін жоюға арналған мысал ережесі берілген -pr- екі күннен кейін атына:

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

Келесі мысал 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

Міне демалыс күндері кластерлік жұмысшы түйіндерін масштабтауға арналған график:

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

~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). Процессорды пайдалану жиі масштабтау үшін жақсы көрсеткіш болып табылады:

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 масштабтау үшін теңшелетін көрсеткіштерді оңай қосу үшін құрамдас жасады: Kube метрика адаптері (kube-metrics-adapter) — бөтелкелердің көлденең автомасштабтауы үшін реттелетін және сыртқы көрсеткіштерді жинап, қызмет көрсете алатын Kubernetes үшін жалпы метрика адаптері. Ол Prometheus метрикасына, SQS кезектеріне және басқа параметрлерге негізделген масштабтауды қолдайды. Мысалы, қолдануды /metrics ішіндегі JSON ретінде қолданбаның өзі көрсететін теңшелетін метрикаға масштабтау үшін:

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 ресурстары виртуалды ядроларда немесе әдетте «милликорларда» өлшенеді, мысалы 500м 50% vCPU білдіреді. Жад ресурстары байттармен өлшенеді және 500Mi сияқты жалпы жұрнақтарды қолдануға болады, бұл 500 мегабайтты білдіреді. Ресурс сұраулары жұмысшы түйіндеріндегі «құлыптау» сыйымдылығы, яғни 1000 vCPU бар түйінде 4 м CPU сұрауы бар подключ басқа қосқыштар үшін қолжетімді тек 3 vCPU қалдырады. [1]

Босаңсу (артық резерв) сұралған ресурстар мен нақты пайдалану арасындағы айырмашылық болып табылады. Мысалы, 2 ГБ жадты сұрайтын, бірақ тек 200 МБ пайдаланатын подводта ~1,8 ГБ «артық» жады бар. Артық ақшаға кетеді. 1 ГБ артық жадтың айына ~ 10 доллар тұратынын шамамен бағалауға болады. [2]

Kubernetes ресурстарының есебі (kube-resource-report) артық қорларды көрсетеді және үнемдеу әлеуетін анықтауға көмектеседі:

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

Kubernetes ресурстарының есебі қолданба және пәрмен арқылы жинақталған артық көрсеткішті көрсетеді. Бұл ресурстарға сұранысты азайтуға болатын орындарды табуға мүмкіндік береді. Жасалған HTML есебі тек ресурстарды пайдаланудың суретін береді. Сәйкес ресурс сұраныстарын анықтау үшін уақыт өте келе CPU/жадты пайдалануды қарау керек. Міне, «әдеттегі» процессоры ауыр қызметке арналған Grafana диаграммасы: барлық блоктар сұралған 3 CPU ядросынан әлдеқайда аз пайдаланады:

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

CPU сұрауын 3000 м-ден ~ 400 м-ге дейін азайту басқа жұмыс жүктемелері үшін ресурстарды босатады және кластердің кішірек болуына мүмкіндік береді.

«EC2 даналарының орташа CPU пайдалануы жиі бір таңбалы пайыздық диапазонға ауысады», деп жазады Кори Куинн. EC2 үшін дұрыс өлшемді бағалау дұрыс емес шешім болуы мүмкінYAML файлындағы кейбір Kubernetes ресурстық сұрауларын өзгерту оңай және үлкен үнемдеуге әкелуі мүмкін.

Бірақ біз адамдардың YAML файлдарындағы мәндерді өзгерткенін қалаймыз ба? Жоқ, машиналар мұны әлдеқайда жақсы жасай алады! Кубернетес Vertical Pod Autoscaler (VPA) дәл осылай жасайды: ресурс сұраулары мен шектеулерді жұмыс жүктемесіне сәйкес бейімдейді. Міне, уақыт өте келе VPA бейімделген Prometheus CPU сұрауларының мысал графигі (жұқа көк сызық):

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

Zalando өзінің барлық кластерлерінде VPA пайдаланады инфрақұрылымдық құрамдас бөліктерге арналған. Маңызды емес қолданбалар да VPA пайдалана алады.

Голдилокс Fairwind - аттар кеңістігінде әрбір орналастыру үшін VPA жасайтын құрал, содан кейін оның бақылау тақтасында VPA ұсынысын көрсетеді. Ол әзірлеушілерге өз қолданбалары үшін дұрыс CPU/жад сұрауларын орнатуға көмектеседі:

AWS жүйесінде Kubernetes бұлттық шығындарын үнемдеңіз

Мен шағын жаздым VPA туралы блогпост 2019 жылы және жақында CNCF соңғы пайдаланушылар қауымдастығы VPA мәселесін талқылады.

EC2 Spot даналарын пайдалану

Соңғысы, бірақ кем дегенде, Spot даналарын Kubernetes жұмысшы түйіндері ретінде пайдалану арқылы AWS EC2 шығындарын азайтуға болады. [3]. Spot үлгілері сұраныс бойынша бағалармен салыстырғанда 90%-ға дейінгі жеңілдікпен қол жетімді. EC2 Spot жүйесінде Kubernetes-ті іске қосу - жақсы комбинация: жоғары қолжетімділік үшін бірнеше түрлі дана түрлерін көрсету керек, яғни бірдей немесе төмен бағаға үлкенірек түйінді алуға болады және ұлғайтылған сыйымдылықты контейнерлік Kubernetes жұмыс жүктемелері пайдалана алады.

Kubernetes-ті EC2 Spot-те қалай іске қосуға болады? Бірнеше опция бар: SpotInst сияқты үшінші тарап қызметін пайдаланыңыз (қазір «Spot» деп аталады, себебін сұрамаңыз) немесе жай ғана кластерге Spot AutoScalingGroup (ASG) қосыңыз. Мысалы, бірнеше дана түрлері бар "сыйымдылығы оңтайландырылған" Spot ASG үшін CloudFormation үзіндісі:

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 аяқтауларын өңдеу керек
  • Заландо пайдаланады шанышқы түйіндер пулының басымдықтары бар ресми кластерді автоматты масштабтау
  • Спот түйіндері мәжбүрлеуге болады Spot-та іске қосу үшін жұмыс жүктемелерінің «тіркеулерін» қабылдаңыз

Резюме

Ұсынылған құралдардың кейбіреулері бұлттық шотыңызды азайтуға пайдалы деп үміттенемін. Мақала мазмұнының көпшілігін мына жерден таба аласыз YouTube-тегі және слайдтардағы DevOps Gathering 2019-тегі менің баяндамам.

Kubernetes-те бұлттық шығындарды үнемдеудің ең жақсы тәжірибелері қандай? Маған хабарлаңыз Twitter (@try_except_).

[1] Іс жүзінде 3-тен аз vCPU пайдалануға жарамды болып қалады, себебі жүйенің резервтік ресурстары түйіннің өткізу қабілетін азайтады. Кубернетес физикалық түйін сыйымдылығы мен «қамтамасыз етілген» ресурстарды ажыратады (Бөлінетін түйін).

[2] Есептеу мысалы: 5 ГБ жады бар бір m8.large данасы айына ~ $84 (eu-central-1, сұраныс бойынша), яғни. 1/8 түйінді блоктау шамамен айына ~ $10 құрайды.

[3] EC2 шотыңызды азайтудың тағы да көптеген жолдары бар, мысалы, резервтелген даналар, жинақ жоспары және т.

Курс туралы көбірек біліңіз.

Ақпарат көзі: www.habr.com

пікір қалдыру