Tiaki i nga utu kapua Kubernetes i runga i te AWS

I whakaritea te whakamaoritanga o te tuhinga i te ahiahi o te timatanga o te akoranga "Tuapapa hangahanga i runga i nga Kubernetes".

Tiaki i nga utu kapua Kubernetes i runga i te AWS

Me pehea te penapena i nga utu kapua ina mahi tahi me Kubernetes? Karekau he otinga tika kotahi, engari e whakaahua ana tenei tuhinga i nga taputapu maha hei awhina i a koe ki te whakahaere tika i o rauemi me te whakaiti i to utu rorohiko kapua.

I tuhituhi ahau i tenei tuhinga me nga Kubernetes mo AWS i roto i te hinengaro, engari ka pa (tata) rite tonu te huarahi ki etahi atu kaiwhakarato kapua. Kei te whakaaro ahau kua whirihorahia te tauine-aunoa o to tautau (cluster-autoscaler). Ko te tango i nga rauemi me te whakaiti i to tukunga ka penapena moni koe mena ka whakaitihia e koe to roopu o nga pona kaimahi (he tauira EC2).

Ka hipokina e tenei tuhinga:

  • te horoi i nga rauemi kaore i whakamahia (kube-janitor)
  • Whakaitihia te whakatauine i nga haora kore mahi (kube-downscaler)
  • te whakamahi i te tauine-aunoa whakapae (HPA),
  • te whakaiti i te rahui rawa rawa (kube-resource-report, VPA)
  • te whakamahi i nga tauira Spot

Te horoi i nga rauemi kaore i whakamahia

He pai te mahi i roto i te taiao tere. Kei te hiahia matou ki nga whakahaere hangarau whakatere. Ko te tukunga rorohiko tere ake ano hoki te maha atu o nga tuku PR, nga taiao arokite, nga tauira, me nga otinga tātari. Ka tukuna nga mea katoa ki nga Kubernetes. Ko wai te wa ki te horoi a-ringa i nga whakatakotoranga whakamatautau? He ngawari ki te wareware ki te whakakore i tetahi whakamatautau wiki. Ka piki te pire kapua na te mea i wareware matou ki te kati:

Tiaki i nga utu kapua Kubernetes i runga i te AWS

(Henning Jacobs:
Zhiza:
(kōrero) Corey Quinn:
He korero paki: Ko to putea AWS he mahi na te maha o nga kaiwhakamahi kei a koe.
Meka: Ko to tohu AWS he mahi na te maha o nga miihini kei a koe.

Ivan Kurnosov (hei whakautu):
He pono: Ko to tohu AWS he mahi mo te maha o nga mea i wareware koe ki te whakakore/whakakore.)

Kubernetes Janitor Ka awhina a (kube-janitor) ki te horoi i to tautau. He ngawari te whirihoranga o te kaihoroi mo te ao me te rohe:

  • Ka taea e nga ture roopu-whanui te tautuhi i te waa-ki-ora (TTL) mo nga mahi PR/whakamatautau.
  • Ka taea te tuhi i nga rauemi takitahi me te janitor/ttl, hei tauira ki te tango aunoa i te koikoi/prototype i muri i te 7 ra.

Kua tautuhia nga ture whanui i te konae YAML. Ka whakawhitia tona ara i roto i te tawhā --rules-file i te kube-janitor. Anei he tauira ture hei tango mokowāingoa katoa -pr- i roto i te ingoa i muri i nga ra e rua:

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

Ko te tauira e whai ake nei ka whakatau i te whakamahinga o te tapanga tono i runga i nga Pods Deployment and StatefulSet mo nga Whakamahinga/StatefulSets hou katoa i te tau 2020, engari i taua wa ka taea te whakahaere i nga whakamatautau me te kore tenei tapanga mo te wiki:

- 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

Whakahaerehia he demo whai-wa mo te 30 meneti i runga i te tautau e whakahaere ana i te kube-janitor:

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

Ko tetahi atu puna o te piki haere o nga utu ko nga pukapuka tohe (AWS EBS). Ko te whakakore i te Kubernetes StatefulSet e kore e muku i ona pukapuka tohe (PVC - PersistentVolumeClaim). Ko nga pukapuka EBS kaore i whakamahia ka ngawari te utu mo nga rau taara ia marama. Kei a Kubernetes Janitor tetahi waahanga ki te horoi i nga PVC kaore i whakamahia. Hei tauira, ka tangohia e tenei ture nga PVC katoa kaore i whakauruhia e tetahi kōwae me te kore e tohuhia e te StatefulSet, CronJob ranei:

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

Ka taea e Kubernetes Janitor te awhina i a koe ki te pupuri i to kahui kia ma me te aukati i nga utu rorohiko kapua kia kore e piki haere. Mo te whakatakotoranga me nga tohutohu whirihoranga, whai README kube-janitor.

Whakaitihia te whakatauine i nga haora kore mahi

Ko nga punaha whakamatautau me nga waahi ka hiahiatia kia mahi noa i nga haora pakihi. Ko etahi tono whakangao, penei i nga taputapu tari tuara/kaiwhakahaere, me iti noa te waatea, ka monohia pea mo te po.

Kubernetes Downscaler (kube-downscaler) ka taea e nga kaiwhakamahi me nga kaiwhakahaere te whakaiti i te punaha i nga haora kore mahi. Ka taea e nga Whakamahinga me nga StatefulSets te tauine ki nga tauira kore. Ka whakatarewahia pea a CronJobs. Kua whirihorahia a Kubernetes Downscaler mo te huinga katoa, kotahi, neke atu ranei nga mokowā ingoa, rauemi takitahi ranei. Ka taea e koe te tautuhi i te "waa mangere" ranei, i te rereke, "wa mahi". Hei tauira, ki te whakaiti i te tauine i nga po me nga wiki:

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

Anei he kauwhata mo te whakaineine i nga kohinga kaimahi kahui i nga wiki:

Tiaki i nga utu kapua Kubernetes i runga i te AWS

Ko te whakaheke mai i te ~13 ki te 4 nga pona kaimahi ka tino kitea he rereketanga o to pire AWS.

Engari me aha ahau ki te mahi i roto i te roopu "waahi"? Ko etahi tukunga ka taea te whakakore i nga wa katoa mai i te tauine ma te taapiri i te whakaheke / whakakore: te tuhipoka pono. Ka taea te whakakore i nga tukunga mo te wa poto ma te whakamahi i te whakaraerae/whakakore-tae noa ki te tuhipoka me te tohu waahi i te whakatakotoranga YYYY-MM-DD HH:MM (UTC). Mena e tika ana, ka taea te whakaheke i te kohinga katoa ma te tuku i tetahi putunga me te tuhipoka downscaler/force-uptime, hei tauira, ma te whakarewa i te 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

Tirohia README kube-downscaler, mena kei te pirangi koe ki nga tohutohu tuku me etahi atu whiringa.

Whakamahia te tauine-aunoa whakapae

He maha nga tono/ratonga e pa ana ki te tauira uta hihiko: i etahi wa ka mangere o ratou kowae, i etahi wa ka mahi i runga i te kaha. Ko te whakahaere i te waaawa putunga putunga ki te whakatutuki i nga taumahatanga teitei kaore he ohanga. Ka tautoko a Kubernetes i te whakatauine-aunoa whakapae puta noa i tetahi rauemi HorizontalPodAutoscaler (HPA). Ko te whakamahinga CPU he tohu pai mo te tauine:

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

Kua hangaia e Zalando tetahi waahanga hei hono ngawari i nga inenga ritenga mo te tauine: Whāurutau Ine Kube Ko te (kube-metrics-adapter) he urutau inenga whanui mo nga Kubernetes ka taea te kohikohi me te mahi inenga ritenga me waho hoki mo te whakatauira aunoa o nga pene. Ka tautokohia te tauine i runga i nga inenga Prometheus, nga rarangi SQS, me etahi atu tautuhinga. Hei tauira, ki te tauine i to tukunga ki tetahi inenga ritenga e tohuhia ana e te tono ano ko JSON i roto i te whakamahi ine / ine:

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

Ko te whirihora i te whakatauira aunoa me te HPA tetahi o nga mahi taunoa hei whakapai ake i te pai mo nga ratonga kore whenua. He whakaaturanga a Spotify me o raatau wheako me o raatau taunakitanga mo HPA: tauine i o tohatoha, kaua to putea.

Whakaitihia te pukapuka nui rawa atu

Ko nga kawenga mahi a Kubernetes e whakatau ana i o raatau hiahia CPU/mahara ma roto i nga "tono rauemi." Ka inehia nga rauemi PTM ki roto mariko mariko, nui ake ranei i roto i te "millicores", hei tauira 500m te tikanga 50% vCPU. Ka inehia nga rauemi mahara ki nga paita, ka taea te whakamahi i nga kumara noa, penei i te 500Mi, ko te tikanga 500 megabytes. Ko te tono rauemi "rakau" te kaha ki runga i nga pona kaimahi, ko te tikanga ko te pod me te tono PTM 1000m i runga i te pona me nga vCPU e 4 ka waiho kia 3 noa nga vCPU e waatea ana ki etahi atu putunga. [1]

Heke (he nui te rahui) Ko te rereketanga i waenga i nga rauemi i tonohia me te whakamahi pono. Hei tauira, ko te peera e tono ana kia 2 GiB o te mahara engari e whakamahi ana i te 200 MiB he ~1,8 GiB o te mahara "tawhero". Ka pau te moni i te taikaha. Ka taea e tetahi te whakatau tata ko te 1 GiB o te utu mahara nui ~ $10 ia marama. [2]

Pūrongo Rauemi Kubernetes (kube-resource-report) e whakaatu ana i te taikaha o nga rahui ka taea te awhina i a koe ki te whakatau i te kaha penapena:

Tiaki i nga utu kapua Kubernetes i runga i te AWS

Pūrongo Rauemi Kubernetes e whakaatu ana i te taikaha kua whakahiatohia e te tono me te whakahau. Ma tenei ka taea e koe te rapu waahi ka taea te whakaheke i nga tono rauemi. Ko te purongo HTML i hangaia he whakaahua noa mo te whakamahinga rauemi. Me titiro koe ki te whakamahi PTM/maumahara i roto i te waa ki te whakatau i nga tono rauemi tika. Anei he tūtohi Grafana mo te ratonga "PTM-taimaha": he iti ake te whakamahi a nga poti katoa i te 3 matua CPU i tonoa:

Tiaki i nga utu kapua Kubernetes i runga i te AWS

Ko te whakaheke i te tono PTM mai i te 3000m ki ~400m ka whakawātea i nga rauemi mo etahi atu mahi, ka iti ake te kohinga.

"Ko te whakamahi PTM toharite o nga tauira EC2 he maha nga wa e paopao ana ki te awhe ōrau mati-kotahi," te tuhi a Corey Quinn. Ahakoa mo EC2 he whakatau kino pea te whakatau tata i te rahi tikaHe ngawari te whakarereke i etahi patai rauemi Kubernetes i roto i te konae YAML, ka taea te penapena moni nui.

Engari kei te tino hiahia taatau ki te whakarereke i nga uara o nga tangata ki nga konae YAML? Kao, ka pai ake te mahi a nga miihini! Kubernetes Poutū Poutū Aunoa (VPA) e tika ana: ka urutau ki nga tono rauemi me nga here kia rite ki te taumahatanga mahi. Anei he tauira kauwhata o nga tono Prometheus CPU (raina kikorangi kikorangi) i urutauhia e VPA i roto i te waa:

Tiaki i nga utu kapua Kubernetes i runga i te AWS

Ka whakamahi a Zalando i te VPA ki ona tautau katoa mo nga waahanga hanganga. Ka taea hoki e nga tono kore-arohaehae te whakamahi i te VPA.

Goldilocks mai i te Fairwind he taputapu ka hangaia he VPA mo ia tukunga ki roto i te mokowāingoa ka whakaatu i te taunakitanga VPA ki tana papatohu. Ka taea e ia te awhina i nga kaiwhakawhanake ki te whakarite i nga tono PTM/maumahara tika mo a raatau tono:

Tiaki i nga utu kapua Kubernetes i runga i te AWS

I tuhia e ahau he iti blogpost mo VPA i te tau 2019, a tata nei i roto I korerohia e te Hapori Kaiwhakamahi Whakamutunga CNCF te take VPA.

Te whakamahi i nga EC2 Spot Instances

Ko te mea whakamutunga, engari ko te iti rawa, ka taea te whakaheke i nga utu AWS EC2 ma te whakamahi i nga tauira Spot hei pona kaimahi Kubernetes [3]. E waatea ana nga waahi waahi ki te 90% hekenga ka whakaritea ki nga utu i runga i te tono. Ko te whakahaere i nga Kubernetes i runga i te EC2 Spot he pai te whakakotahitanga: me tohu e koe etahi momo tauira rereke mo te waatea teitei ake, ko te tikanga ka taea e koe te tiki i tetahi node nui ake mo te utu kotahi, iti iho ranei, ka taea te whakamahi i te kaha nui ake e nga kawenga mahi a Kubernetes.

Me pehea te whakahaere i nga Kubernetes i runga i te EC2 Spot? He maha nga whiringa: whakamahia he ratonga tuatoru penei i a SpotInst (e kiia nei ko "Spot", kaua e patai mai he aha), me taapiri noa he Spot AutoScalingGroup (ASG) ki to tautau. Hei tauira, koinei te waahanga CloudFormation mo te ASG "whakapaipai-pai" me nga momo tauira maha:

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"

Ko etahi korero mo te whakamahi Spot me Kubernetes:

  • Me whakahaere e koe nga whakamutu Spot, hei tauira ma te hanumi i te node ka mutu te tauira
  • Ka whakamahia e Zalando marau te whakahiato-aunoa huinga me nga kaupapa matua o te puna puna
  • Kopo kopuku ka taea te akiaki whakaae ki nga "rehita" o nga taumahatanga mahi kia rere ki Spot

Whakarāpopoto

Ko te tumanako ka kitea e koe etahi o nga taputapu e whakaatuhia ana he pai ki te whakaiti i to pire kapua. Ka kitea e koe te nuinga o nga korero o te tuhinga kei taku korero i DevOps Gathering 2019 i runga i YouTube me nga kiriata.

He aha o tikanga pai mo te penapena utu kapua i runga i nga Kubernetes? Tena koa korero mai ki ahau i Twitter (@try_except_).

[1] Inaa, iti iho i te 3 vCPU ka noho tonu i te mea ka whakahekehia te urunga o te node e nga rauemi punaha kua rahuitia. Ka wehewehe a Kubernetes i waenga i te kaha node tinana me nga rauemi "kua whakaratohia" (Node Tohaina).

[2] Tauira tātaitanga: kotahi m5.he tauira nui ki te 8 GiB o te mahara ko ~$84 ​​​​ia marama (eu-central-1, On-Demand), i.e. te aukati 1/8 node he tata ki te ~$10/marama.

[3] He maha atu ano nga huarahi hei whakaiti i to pire EC2, penei i te Rahui Tauira, Mahere Tiaki, aha atu - Kare au e korero i aua kaupapa i konei, engari me ata titiro koe!

Ako atu mo te akoranga.

Source: will.com

Tāpiri i te kōrero