Нийтлэлийн орчуулгыг курс эхлэхийн өмнөх өдөр бэлтгэсэн
Kubernetes-тэй ажиллахдаа үүлний зардлыг хэрхэн хэмнэх вэ? Ганц зөв шийдэл байхгүй ч энэ нийтлэлд нөөцөө илүү үр дүнтэй удирдах, үүлэн тооцооллын зардлыг бууруулахад туслах хэд хэдэн хэрэгслийг тайлбарласан болно.
Би энэ нийтлэлийг Kubernetes for AWS-д зориулж бичсэн боловч энэ нь бусад үүл үйлчилгээ үзүүлэгчдэд яг адилхан (бараг) хэрэгжих болно. Таны кластер(ууд) аль хэдийн автомат масштабаар тохируулагдсан байна гэж би бодож байна (
Энэ нийтлэлд:
- ашиглагдаагүй нөөцийг цэвэрлэх (
жижүүр ) - Ажлын бус цагаар масштабыг багасгах (
kube-г багасгах ) - хэвтээ автомат масштабыг ашиглах (HPA),
- хэт их нөөцийн нөөцийг бууруулах (
kube-resource-report , VPA) - Spot тохиолдлуудыг ашиглах
Ашиглагдаагүй нөөцийг цэвэрлэх
Хурдан хэмнэлтэй орчинд ажиллах нь гайхалтай. Бид технологийн байгууллагуудыг хүсч байна
(Хеннинг Жейкобс:
Жиза:
(ишлэл) Кори Куинн:
Төөрөгдөл: Таны AWS акаунт нь таны хэрэглэгчдийн тооноос хамаардаг.
Баримт: Таны AWS оноо нь танд байгаа инженерүүдийн тооноос хамаарна.
Иван Курносов (хариултаар):
Бодит баримт: Таны AWS оноо нь таны идэвхгүй болгох/устгахаа мартсан зүйлсийн тооны функц юм.)
- Кластер даяарх дүрмүүд нь PR/туршилтын ашиглалтын хамгийн дээд хугацааг (TTL) тодорхойлж болно.
- Хувь хүний нөөцийг janitor/ttl-ээр тэмдэглэж болно, жишээ нь 7 хоногийн дараа спик/прототипийг автоматаар устгах боломжтой.
Ерөнхий дүрмийг YAML файлд тодорхойлсон. Түүний зам нь параметрээр дамждаг --rules-file
kube-саажинд. Энд бүх нэрийн зайг арилгах жишээ дүрм байна -pr-
хоёр өдрийн дараа нэр дээр:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
Дараах жишээ нь 2020 оны бүх шинэ Deployment/StatefulSet-д Deployment болон StatefulSet pods дээрх програмын шошгыг ашиглахыг зохицуулсан боловч үүнтэй зэрэгцэн долоо хоногийн турш энэ шошгогүйгээр туршилтыг гүйцэтгэхийг зөвшөөрдөг:
- 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-ийг цэвэрлэх онцлогтой. Жишээлбэл, энэ дүрэм нь модульд суурилуулагдаагүй, 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 нь кластераа цэвэр байлгахад тусалж, үүлэн тооцооллын зардал аажмаар нэмэгдэхээс сэргийлж чадна. Байршуулах болон тохируулах зааврыг дагана уу
Ажлын бус цагаар масштабыг багасгах
Туршилтын болон үе шатны систем нь ихэвчлэн зөвхөн ажлын цагаар ажиллах шаардлагатай байдаг. Зарим үйлдвэрлэлийн програмууд, тухайлбал арын алба/админ хэрэгсэл нь зөвхөн хязгаарлагдмал хүртээмжтэй байхыг шаарддаг бөгөөд нэг шөнийн дотор идэвхгүй болно.
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 тооцоонд мэдэгдэхүйц өөрчлөлт авчрах нь дамжиггүй.
Гэхдээ би кластерын "сул зогсолт" үед ажиллах шаардлагатай бол яах вэ? Хэмжээг багасгах/хасах: үнэн тайлбарыг нэмснээр тодорхой байршуулалтыг масштабаас бүрмөсөн хасч болно. YYYY-MM-DD HH:MM (UTC) форматтай үнэмлэхүй цагийн тэмдэг бүхий бууруулагч/хасах-хүртэл тайлбарыг ашиглан байршуулалтыг түр хасаж болно. Шаардлагатай бол тайлбар бүхий pod байрлуулснаар кластерыг бүхэлд нь багасгаж болно 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
Заландо нь хувийн хэмжүүрүүдийг хялбархан холбох бүрэлдэхүүн хэсгийг бүтээжээ.
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-ийн хүсэлт бүхий pod нь бусад pod-д зөвхөн 3 vCPU ашиглах боломжтой болно.
Сул (илүүдэл нөөц) нь хүссэн нөөц ба бодит ашиглалтын хоорондох ялгаа юм. Жишээлбэл, 2 ГБ санах ой шаарддаг боловч зөвхөн 200 МБ ашигладаг pod нь ~1,8 ГБ "илүүдэл" санах ойтой байдаг. Илүүдэл нь мөнгө шаарддаг. Ойролцоогоор 1 гиб нэмэлт санах ой нь сард ~ 10 долларын үнэтэй гэж тооцоолж болно.
CPU-ийн хүсэлтийг 3000м-ээс ~400м болгон бууруулснаар бусад ажлын ачааллын нөөцийг чөлөөлж, кластерыг жижиг болгох боломжийг олгодог.
"EC2 инстансуудын CPU-ийн дундаж хэрэглээ нь ихэвчлэн нэг оронтой тооны хувийн мужид шилждэг."
Гэхдээ бид хүмүүсийг YAML файл дахь утгыг өөрчлөхийг үнэхээр хүсч байна уу? Үгүй ээ, машинууд үүнийг илүү сайн хийж чадна! Кубернетес
Би жижиг бичсэн
EC2 Spot Instances ашиглах
Эцэст нь хэлэхэд, Spot instance-ийг Kubernetes-ийн ажилчны зангилаа болгон ашигласнаар AWS EC2-ийн зардлыг бууруулж болно.
EC2 Spot дээр Kubernetes-ийг хэрхэн ажиллуулах вэ? Хэд хэдэн сонголт бий: 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 дээр ажиллуулах ажлын ачааллын "бүртгэл"-ийг хүлээн авна уу
Хураангуй
Үзүүлсэн зарим хэрэглүүрийг үүлэн төлбөрөө бууруулахад тань хэрэг болно гэж найдаж байна. Та мөн нийтлэлийн ихэнх агуулгыг эндээс олж болно
Kubernetes дээр үүлэн зардлыг хэмнэх хамгийн сайн туршлага юу вэ? хаягаар мэдэгдэнэ үү
Эх сурвалж: www.habr.com