Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Itumọ nkan naa ni a pese sile ni aṣalẹ ti ibẹrẹ ikẹkọ naa "Syeed ohun elo ti o da lori Kubernetes".

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Bii o ṣe le fipamọ sori awọn idiyele awọsanma nigba ṣiṣẹ pẹlu Kubernetes? Ko si ojutu ti o tọ nikan, ṣugbọn nkan yii ṣe apejuwe awọn irinṣẹ pupọ ti o le ṣe iranlọwọ fun ọ lati ṣakoso awọn orisun rẹ ni imunadoko ati dinku awọn idiyele iṣiro awọsanma rẹ.

Mo kọ nkan yii pẹlu Kubernetes fun AWS ni lokan, ṣugbọn yoo kan (fere) ni ọna kanna si awọn olupese awọsanma miiran. Mo ro pe awọn iṣupọ rẹ ti ni atunto adaṣe adaṣe tẹlẹ (iṣupọ-autoscaler). Yiyọ awọn orisun kuro ati iwọn imuṣiṣẹ rẹ yoo ṣafipamọ owo nikan ti o ba tun dinku ọkọ oju-omi kekere ti awọn apa oṣiṣẹ (awọn iṣẹlẹ EC2).

Nkan yii yoo bo:

  • nu awọn ohun elo ti a ko lo (kube-janitor)
  • Din irẹjẹ dinku lakoko awọn wakati ti kii ṣiṣẹ (kube-downscaler)
  • lilo petele autoscaling (HPA),
  • idinku awọn ifiṣura awọn orisun lọpọlọpọ (kube-oluşewadi-iroyin, VPA)
  • lilo Aami instances

Ninu soke ajeku oro

Ṣiṣẹ ni agbegbe ti o yara-yara jẹ nla. A fẹ awọn ajo tekinoloji onikiakia. Ifijiṣẹ sọfitiwia yiyara tun tumọ si awọn imuṣiṣẹ PR diẹ sii, awọn agbegbe awotẹlẹ, awọn apẹẹrẹ, ati awọn solusan atupale. Ohun gbogbo ti wa ni ransogun lori Kubernetes. Tani o ni akoko lati sọ di mimọ awọn imuṣiṣẹ idanwo pẹlu ọwọ? O rọrun lati gbagbe nipa piparẹ idanwo-ọsẹ kan. Iwe-owo awọsanma yoo pari soke nitori nkan ti a gbagbe lati pa:

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

(Henning Jacobs:
Zhiza:
(awọn agbasọ ọrọ) Corey Quinn:
Adaparọ: akọọlẹ AWS rẹ jẹ iṣẹ ti nọmba awọn olumulo ti o ni.
Otitọ: Dimegilio AWS rẹ jẹ iṣẹ ti nọmba awọn onimọ-ẹrọ ti o ni.

Ivan Kurnosov (ni idahun):
Otitọ gidi: Dimegilio AWS rẹ jẹ iṣẹ ti nọmba awọn ohun ti o gbagbe lati mu / paarẹ.)

Kubernetes Olutọju (kube-janitor) ṣe iranlọwọ lati sọ iṣupọ rẹ di mimọ. Iṣeto ni janitor jẹ rọ fun lilo agbaye ati agbegbe:

  • Awọn ofin iṣupọ le ṣalaye akoko-si-aye to pọ julọ (TTL) fun awọn imuṣiṣẹ PR/idanwo.
  • Awọn orisun ẹnikọọkan le ṣe alaye pẹlu janitor/ttl, fun apẹẹrẹ lati yọ iwasoke/afọwọkọ kuro laifọwọyi lẹhin awọn ọjọ 7.

Awọn ofin gbogbogbo jẹ asọye ninu faili YAML. Ọna rẹ ti kọja nipasẹ paramita naa --rules-file ni kube-janitor. Eyi jẹ ofin apẹẹrẹ lati yọ gbogbo awọn aaye orukọ kuro pẹlu -pr- ni orukọ lẹhin ọjọ meji:

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

Apẹẹrẹ atẹle n ṣe ilana lilo aami ohun elo lori Imuṣiṣẹ ati awọn adarọ-ese StatefulSet fun gbogbo Awọn imuṣiṣẹ tuntun/StatefulSet ni 2020, ṣugbọn ni akoko kanna ngbanilaaye ṣiṣe awọn idanwo laisi aami yii fun ọsẹ kan:

- 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

Ṣiṣe demo ti o ni opin akoko fun ọgbọn išẹju 30 lori iṣupọ kan ti nṣiṣẹ kube-janitor:

kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m

Orisun miiran ti awọn idiyele ti n pọ si jẹ awọn iwọn itẹramọṣẹ (AWS EBS). Piparẹ Kubernetes StatefulSet kan ko ṣe paarẹ awọn ipele itẹramọṣẹ rẹ (PVC - PersistentVolumeClaim). Awọn iwọn EBS ti a ko lo le ni irọrun ja si awọn idiyele ti awọn ọgọọgọrun dọla fun oṣu kan. Kubernetes Janitor ni ẹya kan lati nu awọn PVC ti ko lo. Fun apẹẹrẹ, ofin yii yoo yọ gbogbo awọn PVCs ti a ko gbe nipasẹ module kan ati pe ko ṣe itọkasi nipasẹ StatefulSet tabi CronJob:

# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

Kubernetes Janitor le ṣe iranlọwọ fun ọ lati jẹ ki iṣupọ rẹ mọ ki o ṣe idiwọ awọn idiyele iširo awọsanma lati kojọpọ laiyara. Fun imuṣiṣẹ ati awọn ilana iṣeto ni, tẹle README kube-janitor.

Din igbelosoke lakoko awọn wakati ti kii ṣiṣẹ

Idanwo ati awọn ọna ṣiṣe ni igbagbogbo nilo lati ṣiṣẹ nikan lakoko awọn wakati iṣowo. Diẹ ninu awọn ohun elo iṣelọpọ, gẹgẹbi awọn ọfiisi ẹhin/awọn irinṣẹ alabojuto, tun nilo wiwa lopin nikan ati pe o le jẹ alaabo ni alẹ kan.

Kubernetes Downscaler (kube-downscaler) ngbanilaaye awọn olumulo ati awọn oniṣẹ lati ṣe iwọn eto naa lakoko awọn wakati ti kii ṣiṣẹ. Awọn imuṣiṣẹ ati StatefulSets le ṣe iwọn si awọn ẹda asan. CronJobs le daduro. Kubernetes Downscaler ti wa ni tunto fun odidi iṣupọ kan, ọkan tabi diẹ sii awọn aaye orukọ, tabi awọn orisun kọọkan. O le ṣeto boya “akoko aisimi” tabi, ni idakeji, “akoko iṣẹ”. Fun apẹẹrẹ, lati dinku igbelowọn bi o ti ṣee ṣe lakoko awọn alẹ ati awọn ipari ose:

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

Eyi ni aworan kan fun iwọn awọn apa oṣiṣẹ iṣupọ ni awọn ipari ose:

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Gbigbọn isalẹ lati ~ 13 si awọn apa oṣiṣẹ 4 dajudaju ṣe iyatọ ti o ṣe akiyesi ninu owo AWS rẹ.

Ṣugbọn kini ti MO ba nilo lati ṣiṣẹ lakoko iṣupọ “akoko downtime”? Awọn imuṣiṣẹ kan le yọkuro patapata lati iwọn iwọn nipa fifi isale isalẹ/iyasọtọ: asọye otitọ. Awọn imuṣiṣẹ le jẹ yọkuro fun igba diẹ nipa lilo isale/iyasọtọ-titi ti asọye pẹlu aami akoko pipe ni ọna kika YYYY-MM-DD HH:MM (UTC). Ti o ba jẹ dandan, gbogbo iṣupọ le jẹ iwọn-pada sẹhin nipa gbigbe podu pẹlu asọye downscaler/force-uptime, fun apẹẹrẹ, nipa ifilọlẹ nginx òfo:

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

Wo README kube-downscaler, ti o ba nifẹ si awọn ilana imuṣiṣẹ ati awọn aṣayan afikun.

Lo petele autoscaling

Ọpọlọpọ awọn ohun elo / awọn iṣẹ ṣe pẹlu ilana ikojọpọ ti o ni agbara: nigbakan awọn modulu wọn ko ṣiṣẹ, ati nigba miiran wọn ṣiṣẹ ni kikun agbara. Ṣiṣẹda ọkọ oju-omi titobi ti awọn adarọ-ese lati koju pẹlu fifuye tente oke ti o pọju kii ṣe ọrọ-aje. Kubernetes ṣe atilẹyin igbelowọn aifọwọyi petele kọja awọn orisun kan HorizontalPodAutoscaler (HPA). Lilo Sipiyu nigbagbogbo jẹ atọka to dara fun iwọn:

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 ti ṣẹda paati kan lati sopọ ni irọrun awọn metiriki aṣa fun iwọn: Kube Metrics Adapter (kube-metrics-adapter) jẹ ohun ti nmu badọgba awọn metiriki jeneriki fun Kubernetes ti o le gba ati ṣe iranṣẹ aṣa ati awọn metiriki ita fun autoscaling petele ti awọn adarọ-ese. O ṣe atilẹyin igbelowọn ti o da lori awọn metiriki Prometheus, awọn ila SQS, ati awọn eto miiran. Fun apẹẹrẹ, lati ṣe iwọn imuṣiṣẹ rẹ si metiriki aṣa ti o jẹ aṣoju nipasẹ ohun elo funrararẹ bi JSON ni / awọn metiriki lo:

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

Iṣatunṣe autoscaling petele pẹlu HPA yẹ ki o jẹ ọkan ninu awọn iṣe aifọwọyi lati mu ilọsiwaju ṣiṣẹ fun awọn iṣẹ alaini orilẹ-ede. Spotify ni igbejade pẹlu iriri wọn ati awọn iṣeduro fun HPA: iwọn rẹ deployments, ko rẹ apamọwọ.

Din awọn oluşewadi overbooking

Awọn ẹru iṣẹ Kubernetes pinnu awọn iwulo Sipiyu/iranti nipasẹ “awọn ibeere orisun.” Awọn orisun Sipiyu jẹ iwọn ni awọn ohun kohun foju tabi diẹ sii ni igbagbogbo ni “millicores”, fun apẹẹrẹ 500m tumọ si 50% vCPU. Awọn orisun iranti jẹ iwọn ni awọn baiti, ati pe awọn suffixes ti o wọpọ le ṣee lo, bii 500Mi, eyiti o tumọ si 500 megabyte. Awọn ibeere orisun “titiipa” agbara lori awọn apa oṣiṣẹ, afipamo pe adarọ ese kan pẹlu ibeere Sipiyu 1000m kan lori ipade kan pẹlu awọn vCPU 4 yoo fi awọn vCPU 3 nikan wa si awọn adarọ-ese miiran. [1]

Slack (ibi ipamọ ti o pọ ju) jẹ iyatọ laarin awọn orisun ti a beere ati lilo gangan. Fun apẹẹrẹ, adarọ-ese kan ti o beere fun 2 GiB ti iranti ṣugbọn ti o nlo 200 MiB nikan ni ~ 1,8 GiB ti iranti “afikun”. Afikun owo. Ẹnikan le ṣe iṣiro aijọju pe 1 GiB ti iye owo iranti laiṣe ~ $10 fun oṣu kan. [2]

Kubernetes Resource Iroyin (kube-resource-report) ṣe afihan awọn ifiṣura pupọ ati pe o le ṣe iranlọwọ fun ọ lati pinnu agbara ifowopamọ:

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Kubernetes Resource Iroyin fihan iye ti o ṣajọpọ nipasẹ ohun elo ati aṣẹ. Eyi n gba ọ laaye lati wa awọn aaye nibiti awọn ibeere orisun le dinku. Ijabọ HTML ti ipilẹṣẹ nikan n pese aworan ti lilo awọn orisun. O yẹ ki o wo Sipiyu/lilo iranti ni akoko pupọ lati pinnu awọn ibeere orisun to pe. Eyi ni aworan apẹrẹ Grafana kan fun iṣẹ “aṣoju” Sipiyu-eru: gbogbo awọn adarọ-ese nlo ni pataki kere ju awọn ohun kohun Sipiyu 3 ti o beere:

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Idinku ibeere Sipiyu lati 3000m si ~ 400m n ṣe idasilẹ awọn orisun fun awọn ẹru iṣẹ miiran ati gba iṣupọ lati kere si.

“Apapọ lilo Sipiyu ti awọn iṣẹlẹ EC2 nigbagbogbo n gbe ni iwọn ipin-nọmba ẹyọkan,” Kọ Corey Quinn. Lakoko fun EC2 iṣiro iwọn to tọ le jẹ ipinnu buburuYiyipada diẹ ninu awọn ibeere orisun orisun Kubernetes ni faili YAML rọrun ati pe o le mu awọn ifowopamọ nla wa.

Ṣugbọn ṣe a fẹ gaan eniyan ni iyipada awọn iye ni awọn faili YAML? Rara, awọn ẹrọ le ṣe dara julọ! Kubernetes Inaro podu Autoscaler (VPA) ṣe bẹ: ṣe deede awọn ibeere orisun ati awọn ihamọ ni ibamu si iṣẹ ṣiṣe. Eyi ni aworan apẹẹrẹ ti awọn ibeere Sipiyu Prometheus (laini buluu tinrin) ti a ṣe deede nipasẹ VPA lori akoko:

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Zalando nlo VPA ni gbogbo awọn iṣupọ rẹ fun amayederun irinše. Awọn ohun elo ti kii ṣe pataki tun le lo VPA.

goldicks lati Fairwind jẹ ọpa ti o ṣẹda VPA kan fun imuṣiṣẹ kọọkan ni aaye orukọ ati lẹhinna ṣafihan iṣeduro VPA kan lori dasibodu rẹ. O le ṣe iranlọwọ fun awọn olupilẹṣẹ ṣeto awọn ibeere Sipiyu/iranti to pe fun awọn ohun elo wọn:

Fipamọ lori awọn idiyele awọsanma Kubernetes lori AWS

Mo kọ kekere kan blogpost nipa VPA ni ọdun 2019, ati laipẹ ni Agbegbe Olumulo Ipari CNCF ti jiroro lori ọrọ VPA.

Lilo EC2 Aami Awọn iṣẹlẹ

Ni ikẹhin ṣugbọn kii kere ju, awọn idiyele AWS EC2 le dinku nipasẹ lilo awọn iṣẹlẹ Aami bi awọn apa oṣiṣẹ Kubernetes [3]. Awọn iṣẹlẹ iranran wa ni ẹdinwo ti o to 90% ni akawe si awọn idiyele Ibeere. Ṣiṣe Kubernetes lori EC2 Spot jẹ apapo ti o dara: o nilo lati pato ọpọlọpọ awọn oriṣi apẹẹrẹ fun wiwa ti o ga julọ, afipamo pe o le gba ipade ti o tobi ju fun iye owo kanna tabi kekere, ati pe agbara ti o pọ si le ṣee lo nipasẹ awọn iṣẹ-ṣiṣe Kubernetes ti a fi sinu apoti.

Bawo ni lati ṣiṣẹ Kubernetes lori EC2 Spot? Awọn aṣayan pupọ lo wa: lo iṣẹ ẹnikẹta bi SpotInst (eyiti a pe ni “Spot” ni bayi, maṣe beere lọwọ mi kilode), tabi nirọrun ṣafikun Spot AutoScalingGroup (ASG) si iṣupọ rẹ. Fun apẹẹrẹ, eyi ni snippet CloudFormation fun Aami ASG “iṣapeye agbara” pẹlu awọn iru apẹẹrẹ pupọ:

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"

Diẹ ninu awọn akọsilẹ lori lilo Spot pẹlu Kubernetes:

  • O nilo lati mu awọn ifopinsi Aami mu, fun apẹẹrẹ nipa didapọ ipade nigbati apẹẹrẹ ba duro
  • Zalando nlo orita osise iṣupọ autoscaling pẹlu ipade pool ayo
  • Awọn apa ibi le fi agbara mu gba “awọn iforukọsilẹ” ti awọn ẹru iṣẹ lati ṣiṣẹ ni Aami

Akopọ

Mo nireti pe o rii diẹ ninu awọn irinṣẹ ti a gbekalẹ wulo ni idinku owo-owo awọsanma rẹ. O le wa pupọ julọ awọn akoonu inu nkan naa tun ni Ọrọ mi ni Apejọ DevOps 2019 lori YouTube ati ni awọn kikọja.

Kini awọn iṣe rẹ ti o dara julọ fun fifipamọ awọn idiyele awọsanma lori Kubernetes? Jọwọ jẹ ki mi mọ ni Twitter (@try_except_).

[1] Ni otitọ, o kere ju awọn vCPU 3 yoo wa ni lilo bi ilojade oju ipade ti dinku nipasẹ awọn orisun eto ti a fi pamọ. Kubernetes ṣe iyatọ laarin agbara ipade ti ara ati awọn orisun “ti a pese” (Node Allocatable).

[2] Apẹẹrẹ iṣiro: apẹẹrẹ m5.large kan pẹlu 8 GiB ti iranti jẹ ~ $84 fun oṣu kan (eu-central-1, On-Demand), i.e. ìdènà 1/8 node jẹ isunmọ ~ $ 10 fun oṣu.

[3] Ọpọlọpọ awọn ọna diẹ sii wa lati dinku owo-owo EC2 rẹ, gẹgẹbi Awọn iṣẹlẹ ti a fipamọ, Eto Ifowopamọ, ati bẹbẹ lọ - Emi kii yoo bo awọn akọle wọnyẹn nibi, ṣugbọn o yẹ ki o wo wọn ni pato!

Kọ ẹkọ diẹ sii nipa ẹkọ naa.

orisun: www.habr.com

Fi ọrọìwòye kun