Ekonomize sou depans nwaj Kubernetes sou AWS

Tradiksyon atik la te prepare lavèy kòmansman kou a "Platfòm enfrastrikti ki baze sou Kubernetes".

Ekonomize sou depans nwaj Kubernetes sou AWS

Ki jan pou konsève pou depans nwaj yo lè w ap travay ak Kubernetes? Pa gen yon sèl solisyon bon, men atik sa a dekri plizyè zouti ki ka ede w jere resous ou yo pi efikasman epi redwi depans cloud computing ou yo.

Mwen te ekri atik sa a ak Kubernetes pou AWS nan tèt ou, men li pral aplike (prèske) egzakteman menm jan an pou lòt founisè nwaj yo. Mwen sipoze gwoup ou a (yo) deja gen autoscaling configuré (cluster-autoscaler). Retire resous yo ak diminye deplwaman ou a pral sèlman ekonomize lajan si li diminye tou flòt nœuds travayè ou yo (enstans EC2).

Atik sa a pral kouvri:

  • netwaye resous ki pa itilize yo (kube-janitor)
  • Diminye dekale pandan lè ki pa travay (kube-downscaler)
  • lè l sèvi avèk orizontal autoscaling (HPA),
  • rediksyon rezèv resous twòp (kube-resous-rapò, VPA)
  • lè l sèvi avèk enstans Spot

Netwaye resous ki pa itilize yo

Travay nan yon anviwònman rapid-ritm se gwo. Nou vle òganizasyon teknoloji akselere. Livrezon lojisyèl pi rapid vle di tou plis deplwaman PR, anviwònman preview, pwototip, ak solisyon analiz. Tout se deplwaye sou Kubernetes. Ki moun ki gen tan pou netwaye deplwaman tès yo lamen? Li fasil pou bliye efase yon eksperyans ki gen yon semèn. Bòdwo nwaj la pral fini ogmante akòz yon bagay nou bliye fèmen:

Ekonomize sou depans nwaj Kubernetes sou AWS

(Henning Jacobs:
Zhiza:
(quotes) Corey Quinn:
Lejann: Kont AWS ou a se yon fonksyon de kantite itilizatè ou genyen.
Reyalite: nòt AWS ou se yon fonksyon de kantite enjenyè ou genyen.

Ivan Kurnosov (nan repons):
Reyalite reyèl: nòt AWS ou a se yon fonksyon de kantite bagay ou bliye enfim/efase.)

Kubernetes Janitor (kube-janitor) ede netwaye gwoup ou a. Konfigirasyon janitor la fleksib pou itilizasyon mondyal ak lokal:

  • Règ pou tout gwoup la ka defini maksimòm tan pou viv (TTL) pou deplwaman PR/tès.
  • Resous endividyèl yo ka anote ak janitor / ttl, pou egzanp otomatikman retire Spike / pwototip la apre 7 jou.

Règ jeneral yo defini nan dosye YAML la. Se chemen li yo pase nan paramèt la --rules-file nan kube-janitor. Men yon egzanp règ pou retire tout espas non avèk yo -pr- nan non apre de jou:

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

Egzanp sa a kontwole itilizasyon etikèt aplikasyon an sou gous Deployment ak StatefulSet pou tout nouvo Deployments/StatefulSets an 2020, men an menm tan pèmèt egzekisyon tès san etikèt sa a pou yon semèn:

- 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

Kouri yon demonstrasyon ki limite nan tan pou 30 minit sou yon gwoup kap kouri kube-janitor:

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

Yon lòt sous ogmante depans yo se volim ki pèsistan (AWS EBS). Efase yon Kubernetes StatefulSet pa efase volim ki pèsistan li yo (PVC - PersistentVolumeClaim). Volim EBS ki pa itilize yo ka fasilman lakòz depans dè santèn de dola pa mwa. Kubernetes Janitor gen yon karakteristik pou netwaye PVC ki pa itilize yo. Pou egzanp, règ sa a pral retire tout PVC ki pa monte pa yon modil epi ki pa referans pa yon StatefulSet oswa CronJob:

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

Kubernetes Janitor ka ede w kenbe gwoup ou a pwòp epi anpeche depans pou cloud computing ogmante tou dousman. Pou enstriksyon deplwaman ak konfigirasyon, swiv README kube-janitor.

Diminye dekale pandan lè ki pa travay

Sistèm tès ak etap yo tipikman obligatwa pou operasyon sèlman pandan lè travay yo. Gen kèk aplikasyon pwodiksyon, tankou zouti back office/admin, tou mande pou sèlman disponiblite limite epi yo ka enfim lannwit lan.

Kubernetes Downscaler (kube-downscaler) pèmèt itilizatè yo ak operatè yo diminye sistèm nan pandan lè ki pa travay. Deplwaman ak StatefulSets ka rive jiska zewo kopi. CronJobs ka sispann. Kubernetes Downscaler se konfigirasyon pou yon gwoup antye, youn oswa plizyè espas non, oswa resous endividyèl. Ou ka mete swa "tan san fè anyen konsa" oswa, Okontrè, "tan travay". Pa egzanp, pou diminye dekale otank posib pandan nwit ak wikenn:

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

Men yon graf pou echèl nœuds travayè gwoup yo nan wikenn:

Ekonomize sou depans nwaj Kubernetes sou AWS

Echèl desann soti nan ~ 13 a 4 nœuds travayè sètènman fè yon diferans aparan nan bòdwo AWS ou.

Men, e si mwen bezwen travay pandan gwoup "D'"? Sèten deplwaman yo ka eskli pou tout tan nan dekale lè yo ajoute downscaler/exclude: vre annotation. Deplwaman yo ka ekskli tanporèman lè l sèvi avèk downscaler/exclude-until annotation ak yon timestamp absoli nan fòma YYYY-MM-DD HH:MM (UTC). Si sa nesesè, tout gwoup la ka rekreye pa deplwaye yon gous ak anotasyon an downscaler/force-uptime, pou egzanp, pa lanse nginx vid:

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

Al gade nan README kube-downscaler, si w enterese nan enstriksyon deplwaman ak opsyon adisyonèl.

Sèvi ak orizontal autoscaling

Anpil aplikasyon/sèvis fè fas ak yon modèl chaj dinamik: pafwa modil yo san fè anyen konsa, epi pafwa yo travay nan kapasite plen. Opere yon flòt pèmanan gous pou fè fas ak chaj maksimòm maksimòm pa ekonomik. Kubernetes sipòte oto-echèl orizontal atravè yon resous HorizontalPodAutoscaler (HPA). Itilizasyon CPU se souvan yon bon endikatè pou dekale:

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 te kreye yon eleman ki fasil konekte mezi koutim pou dekale: Kube Metrics adaptè (kube-metrics-adaptè) se yon adaptè metrik jenerik pou Kubernetes ki ka kolekte epi sèvi metrik koutim ak ekstèn pou oto-scaling orizontal gous yo. Li sipòte echèl ki baze sou mezi Prometheus, ke moun kap kriye SQS, ak lòt paramèt. Pou egzanp, pou echèl deplwaman ou a nan yon metrik koutim reprezante pa aplikasyon an li menm kòm JSON nan /metrics itilize:

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

Konfigirasyon autoscaling orizontal ak HPA ta dwe youn nan aksyon defo pou amelyore efikasite pou sèvis apatrid. Spotify gen yon prezantasyon ak eksperyans yo ak rekòmandasyon pou HPA: echèl deplwaman ou yo, pa bous ou.

Diminye overbooking resous yo

Chaj travay Kubernetes detèmine bezwen CPU/memwa yo atravè "demann resous." Resous CPU yo mezire nan nwayo vityèl oswa pi souvan nan "millicores", pou egzanp 500m implique 50% vCPU. Resous memwa yo mezire an byte, epi yo ka itilize sifiks komen, tankou 500Mi, ki vle di 500 megabyte. Resous mande kapasite "bloke" sou nœuds travayè yo, sa vle di yon gous ki gen yon demann CPU 1000m sou yon nœud ki gen 4 vCPU pral kite sèlman 3 vCPU disponib pou lòt gous. [1]

Slack (rezèv depase) se diferans ki genyen ant resous yo mande yo ak itilizasyon aktyèl la. Pou egzanp, yon gous ki mande 2 GiB nan memwa men sèlman itilize 200 MiB gen ~ 1,8 GiB nan "depase" memwa. Depase koute lajan. Yon moun ka apeprè estime ke 1 GiB nan memwa redondants koute ~ $ 10 pa mwa. [2]

Rapò Resous Kubernetes (kube-resource-report) montre rezèv depase epi li ka ede w detèmine potansyèl ekonomi:

Ekonomize sou depans nwaj Kubernetes sou AWS

Rapò Resous Kubernetes montre depase totalman pa aplikasyon ak lòd. Sa a pèmèt ou jwenn kote kote demann resous yo ka redwi. Rapò HTML pwodwi a sèlman bay yon snapshot sou itilizasyon resous yo. Ou ta dwe gade itilizasyon CPU/memwa sou tan pou detèmine demann resous adekwat. Isit la se yon tablo Grafana pou yon sèvis "tipik" CPU-lou: tout gous yo ap itilize siyifikativman mwens pase 3 nwayo CPU yo mande yo:

Ekonomize sou depans nwaj Kubernetes sou AWS

Diminye demann CPU a soti nan 3000m a ~ 400m libere resous pou lòt chaj travay epi pèmèt gwoup la vin pi piti.

"Mwayèn itilizasyon CPU nan ka EC2 souvan plane nan seri pousantaj yon sèl chif," ekri Corey Quinn. Pandan ke pou EC2 estime gwosè dwat la ka yon move desizyonChanje kèk demann resous Kubernetes nan yon dosye YAML se fasil epi li ka pote gwo ekonomi.

Men, èske nou reyèlman vle moun chanje valè nan dosye YAML? Non, machin yo ka fè li pi byen! Kubernetes Vètikal Pod Autoscaler (VPA) fè sa sèlman: adapte demann resous ak kontrent selon kantite travay la. Men yon egzanp graf demann CPU Prometheus (liy mens ble) adapte pa VPA sou tan:

Ekonomize sou depans nwaj Kubernetes sou AWS

Zalando sèvi ak VPA nan tout grap li yo pou konpozan enfrastrikti. Aplikasyon ki pa kritik yo ka itilize VPA tou.

bouk lò soti nan Fairwind se yon zouti ki kreye yon VPA pou chak deplwaman nan yon espas non epi li montre yon rekòmandasyon VPA sou tablodbò li a. Li ka ede devlopè yo mete demann CPU/memwa kòrèk pou aplikasyon yo:

Ekonomize sou depans nwaj Kubernetes sou AWS

Mwen te ekri yon ti blogpost sou VPA nan 2019, ak dènyèman nan CNCF End User Community te diskite sou pwoblèm VPA.

Sèvi ak Enstans EC2 Spot

Denye men pa pi piti, depans AWS EC2 yo ka redwi lè w itilize enstans Spot kòm nœud travayè Kubernetes. [3]. Enstans Spot yo disponib nan yon rabè ki rive jiska 90% konpare ak pri sou demann. Kouri Kubernetes sou EC2 Spot se yon bon konbinezon: ou bezwen presize plizyè kalite egzanp diferan pou pi gwo disponiblite, sa vle di ou ka jwenn yon ne pi gwo pou menm pri a oswa pi ba, epi kapasite nan ogmante ka itilize pa chaj travay Kubernetes nan kontenè.

Ki jan yo kouri Kubernetes sou EC2 Spot? Gen plizyè opsyon: sèvi ak yon sèvis twazyèm pati tankou SpotInst (kounye a yo rele "Spot", pa mande m 'poukisa), oswa tou senpleman ajoute yon Spot AutoScalingGroup (ASG) nan gwoup ou a. Pou egzanp, isit la se yon snippet CloudFormation pou yon ASG Spot "kapasite-optimize" ak plizyè kalite egzanp:

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"

Kèk nòt sou itilizasyon Spot ak Kubernetes:

  • Ou bezwen okipe revokasyon Spot, pou egzanp pa fizyone ne la lè egzanp lan sispann
  • Zalando itilize fouchèt otoeskalifikasyon gwoup ofisyèl ak priyorite pisin nœuds yo
  • Tach nœuds ka fòse aksepte "enskripsyon" nan chaj travay yo kouri nan Spot

Rezime

Mwen espere ou jwenn kèk nan zouti yo prezante itil nan diminye bòdwo nwaj ou a. Ou ka jwenn pi fò nan sa ki nan atik la tou nan diskou mwen an nan DevOps Gathering 2019 sou YouTube ak nan glisad.

Ki pi bon pratik ou yo pou ekonomize depans nwaj yo sou Kubernetes? Tanpri fè m konnen nan Twitter (@try_except_).

[1] An reyalite, mwens pase 3 vCPU yo ap rete ka itilize kòm debi a nod la redwi pa resous sistèm rezève yo. Kubernetes fè distenksyon ant kapasite ne fizik ak resous "pwovizyone" (Nœud alokabl).

[2] Egzanp kalkil: yon egzanp m5.large ak 8 GiB memwa se ~ $84 ​​pa mwa (eu-central-1, On-Demand), i.e. bloke 1/8 ne se apeprè ~ $ 10 / mwa.

[3] Gen anpil lòt fason pou diminye bòdwo EC2 ou a, tankou Enstans rezève, Plan Epay, elatriye - Mwen pa pral kouvri sijè sa yo isit la, men ou ta dwe definitivman gade nan yo!

Aprann plis sou kou a.

Sous: www.habr.com

Add nouvo kòmantè