Тарҷумаи мақола дар арафаи оғози курс омода шудааст
Ҳангоми кор бо Kubernetes хароҷоти абрро чӣ гуна сарфа кардан мумкин аст? Ягон роҳи ягонаи дуруст вуҷуд надорад, аммо ин мақола якчанд асбобҳоро тавсиф мекунад, ки метавонанд ба шумо захираҳои худро самараноктар идора кунанд ва хароҷоти роёниши абрии худро кам кунанд.
Ман ин мақоларо бо Kubernetes for AWS дар назар доштам, аммо он (қариб) маҳз ҳамин тавр ба дигар провайдерҳои абр татбиқ хоҳад шуд. Ман фарз мекунам, ки кластер(ҳо)-и шумо аллакай миқёси худкорро танзим кардаанд (
Дар ин ҳолат чунин хоҳад буд:
- тоза кардани захираҳои истифоданашуда (
фаррош кубе ) - Коҳиш додани миқёс дар вақти ғайрикорӣ (
пасткунандаи куб ) - истифодаи автоматии уфуқӣ (HPA),
- кам кардани захираи аз ҳад зиёди захираҳо (
kube-resource-report , VPA) - бо истифода аз мисолҳои Spot
Тоза кардани захираҳои истифоданашуда
Кор дар муҳити босуръат бузург аст. Мо ташкилотҳои технологӣ мехоҳем
(Хеннинг Ҷейкобс:
Жиза:
(иқтибосҳо) Кори Куинн:
Афсона: Ҳисоби AWS-и шумо вазифаи шумораи корбарони шумост.
Далел: Холи AWS-и шумо як функсияи шумораи муҳандисонест, ки шумо доред.
Иван Курносов (дар чавоб):
Далели воқеӣ: Холи AWS-и шумо як функсияи шумораи чизҳоест, ки шумо хомӯш кардан/нест карданро фаромӯш кардаед.)
- Қоидаҳои кластерӣ метавонанд ҳадди аксар вақтро барои зиндагӣ (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 метавонад ба шумо кӯмак кунад, ки кластери худро тоза нигоҳ доред ва аз афзоиши оҳиста-оҳиста хароҷоти роёниши абрӣ пешгирӣ кунед. Барои дастурҳои ҷойгиркунӣ ва конфигуратсия, пайравӣ кунед
Миқёсро дар вақти ғайрикорӣ кам кунед
Системаҳои санҷишӣ ва марҳилавӣ одатан талаб карда мешаванд, ки танҳо дар соатҳои корӣ кор кунанд. Баъзе замимаҳои истеҳсолӣ, аз қабили абзорҳои пушти офис/администратор низ танҳо дастрасии маҳдудро талаб мекунанд ва метавонанд дар як шабонарӯз хомӯш карда шаванд.
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
Нигоҳ кунед
Миқёси автоматии уфуқӣ истифода баред
Бисёр барномаҳо/хизматрасониҳо бо шакли динамикии боркунӣ сарукор доранд: баъзан модулҳои онҳо бекор меистанд ва баъзан онҳо бо иқтидори пурра кор мекунанд. Истифода бурдани парки доимии қаҳвахонаҳо барои тобоварӣ бо сарбории ҳадди аксар сарфакорона нест. Kubernetes миқёси худкори уфуқӣ дар саросари захираро дастгирӣ мекунад
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 як ҷузъро барои ба осонӣ пайваст кардани ченакҳои фармоишӣ барои миқёс сохтааст:
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-ро барои дигар қисмҳо дастрас хоҳад кард.
сустӣ (захираи зиёдатӣ) фарқи байни захираҳои дархостшуда ва истифодаи воқеӣ аст. Масалан, як паҳлӯе, ки 2 ГБ хотира талаб мекунад, аммо танҳо 200 МБ-ро истифода мебарад, ~ 1,8 ГБ хотираи "зиёдатӣ" дорад. Аз ҳад зиёд пул сарф мекунад. Тахминан метавон тахмин кард, ки 1 ГБ хотираи зиёдатӣ дар як моҳ ~ $10 арзиш дорад.
Кам кардани дархости CPU аз 3000 то ~ 400 м захираҳоро барои сарбории кори дигар озод мекунад ва имкон медиҳад кластер хурдтар шавад.
"Истифодаи миёнаи CPU барои мисолҳои EC2 аксар вақт дар диапазони як рақами фоизӣ ҷойгир аст,"
Аммо оё мо воқеан мехоҳем, ки одамон арзишҳоро дар файлҳои YAML иваз кунанд? Не, мошинхо ин корро хеле бехтар карда метавонанд! Кубернетес
Ман хурд навиштам
Истифодаи EC2 Spot Instances
Ниҳоят, аммо на камтар аз он, хароҷоти AWS 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 қабул кунед
Натиҷа
Умедворам, ки шумо баъзе асбобҳои пешниҳодшударо барои кам кардани ҳисоби абрии худ муфид хоҳед ёфт. Шумо инчунин метавонед аксари мундариҷаи мақоларо дар ин ҷо пайдо кунед
Таҷрибаҳои беҳтарини шумо барои сарфаи хароҷоти абрӣ дар Kubernetes кадомҳоянд? Лутфан ба ман хабар диҳед
Манбаъ: will.com