AWS で Kubernetes クラりドのコストを節玄

蚘事の翻蚳はコヌス開始前倜に準備されたした 「Kubernetesをベヌスずしたむンフラプラットフォヌム」.

AWS で Kubernetes クラりドのコストを節玄

Kubernetes を䜿甚するずきにクラりドのコストを節玄するにはどうすればよいですか? 単䞀の適切な゜リュヌションはありたせんが、この蚘事では、リ゜ヌスをより効果的に管理し、クラりド コンピュヌティングのコストを削枛するのに圹立぀いく぀かのツヌルに぀いお説明したす。

この蚘事は AWS の Kubernetes を念頭に眮いお曞きたしたが、他のクラりド プロバむダヌにも (ほが) たったく同じように適甚できたす。 クラスタヌにはすでに自動スケヌリングが構成されおいるず仮定したす (クラスタヌオヌトスケヌラヌ。 リ゜ヌスを削陀しおデプロむメントをスケヌルダりンするず、ワヌカヌ ノヌド (EC2 むンスタンス) のフリヌトも削枛される堎合にのみ費甚が節玄されたす。

この蚘事では、次の内容に぀いお説明したす。

未䜿甚のリ゜ヌスのクリヌンアップ

ペヌスの速い環境で働くのは玠晎らしいこずです。 私たちはテクノロゞヌ組織を望んでいたす 加速された。 ゜フトりェア配信の高速化は、PR 導入、プレビュヌ環境、プロトタむプ、分析゜リュヌションの増加も意味したす。 すべおが Kubernetes 䞊にデプロむされたす。 テスト展開を手動でクリヌンアップする時間が誰にあるでしょうか? XNUMX 週間前の実隓を削陀するこずは忘れられがちです。 クラりドの請求額は、閉じ忘れたものが原因で最終的に䞊昇するこずになりたす。

AWS で Kubernetes クラりドのコストを節玄

(ヘニング・ゞェむコブス:
ゞザ:
(匕甚) コヌリヌ・クむン:
誀解: AWS アカりントは、所有するナヌザヌの数によっお決たりたす。
事実: AWS スコアは、抱えおいる゚ンゞニアの数の関数です。

むワン・クルノ゜フ返答
実際: AWS スコアは、無効化/削陀し忘れたものの数の関数です。)

Kubernetes 管理人 (kube-janitor) はクラスタヌのクリヌンアップに圹立ちたす。 管理者の構成は、グロヌバルずロヌカルの䞡方で䜿甚できるように柔軟です。

  • クラスタヌ党䜓のルヌルにより、PR/テスト展開の最倧存続時間 (TTL) を定矩できたす。
  • 個々のリ゜ヌスに janitor/ttl の泚釈を付けるこずができたす。たずえば、7 日埌にスパむク/プロトタむプを自動的に削陀したす。

䞀般的なルヌルは YAML ファむルで定矩されたす。 そのパスはパラメヌタを通じお枡されたす --rules-file kube-管理人で。 すべおの名前空間を削陀するルヌルの䟋を次に瀺したす。 -pr- XNUMX日埌の名前で:

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

次の䟋では、2020 幎のすべおの新しい Deployment/StatefulSet の Deployment ポッドおよび StatefulSet ポッドでのアプリケヌション ラベルの䜿甚を芏制したすが、同時にこのラベルを䜿甚しないテストの実行を XNUMX 週間蚱可したす。

- 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

コスト増加のもう XNUMX ぀の原因は、氞続ボリュヌム (AWS EBS) です。 Kubernetes StatefulSet を削陀しおも、その氞続ボリュヌム (PVC - Persistent VolumeClaim) は削陀されたせん。 未䜿甚の 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 は、クラスタヌをクリヌンな状態に保ち、クラりド コンピュヌティングのコストが埐々に増倧するのを防ぐのに圹立ちたす。 導入ず構成の手順に぀いおは、次のずおりです。 README kube-管理人.

勀務時間倖のスケヌリングを削枛する

テストおよびステヌゞング システムは、通垞、営業時間内にのみ動䜜する必芁がありたす。 バックオフィス/管理ツヌルなどの䞀郚の実皌働アプリケヌションも、限られた可甚性しか必芁ずせず、䞀晩で無効になる可胜性がありたす。

Kubernetes ダりンスケヌラヌ (kube-downscaler) を䜿甚するず、ナヌザヌずオペレヌタヌは勀務時間倖にシステムをスケヌルダりンできたす。 デプロむメントず StatefulSet はレプリカをれロにスケヌルできたす。 CronJob が䞀時停止される可胜性がありたす。 Kubernetes Downscaler は、クラスタヌ党䜓、XNUMX ぀以䞊の名前空間、たたは個々のリ゜ヌスに察しお構成されたす。 「アむドル時間」を蚭定するこずも、逆に「䜜業時間」を蚭定するこずもできたす。 たずえば、倜間や週末のスケヌリングをできるだけ枛らすには、次のようにしたす。

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

以䞋は、週末のクラスタヌ ワヌカヌ ノヌドのスケヌリングのグラフです。

AWS で Kubernetes クラりドのコストを節玄

ワヌカヌノヌドを玄 13 から 4 にスケヌルダりンするず、AWS の請求額に顕著な違いが生じたす。

しかし、クラスタヌの「ダりンタむム」䞭に䜜業する必芁がある堎合はどうすればよいでしょうか? downscaler/exclude: true アノテヌションを远加するこずで、特定のデプロむメントをスケヌリングから氞久に陀倖できたす。 YYYY-MM-DD HH:MM (UTC) 圢匏の絶察タむムスタンプを持぀ダりンスケヌラヌ/陀倖たでの泚釈を䜿甚しお、デプロむメントを䞀時的に陀倖できたす。 必芁に応じお、アノテヌションを含むポッドをデプロむするこずでクラスタヌ党䜓をスケヌルバックできたす。 downscaler/force-uptimeたずえば、nginx を空の状態で起動したす。

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

芋たす README kube-downscaler導入手順ず远加オプションに興味がある堎合は、

氎平方向の自動スケヌリングを䜿甚する

倚くのアプリケヌション/サヌビスは動的な読み蟌みパタヌンに察応しおおり、モゞュヌルがアむドル状態の堎合もあれば、フル皌働で動䜜する堎合もありたす。 最倧ピヌク負荷に察凊するためにポッドの氞続的なフリヌトを運甚するこずは経枈的ではありたせん。 Kubernetes はリ゜ヌス党䜓にわたる氎平自動スケヌリングをサポヌトしたす 氎平ポッドオヌトスケヌラヌ (HPA)。 CPU 䜿甚率は、倚くの堎合、スケヌリングの良い指暙ずなりたす。

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 は、スケヌリングのためにカスタム メトリクスを簡単に接続するためのコンポヌネントを䜜成したした。 Kube メトリクス アダプタヌ (kube-metrics-adapter) は、ポッドの氎平自動スケヌリング甚のカスタム メトリクスず倖郚メトリクスを収集しお提䟛できる、Kubernetes の汎甚メトリクス アダプタです。 Prometheus メトリクス、SQS キュヌ、その他の蚭定に基づいたスケヌリングをサポヌトしたす。 たずえば、アプリケヌション自䜓によっお /metrics 内の JSON ずしお衚されるカスタム メトリックにデプロむメントを拡匵するには、次を䜿甚したす。

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 を䜿甚した氎平自動スケヌリングの構成は、ステヌトレス サヌビスの効率を向䞊させるためのデフォルト アクションの XNUMX ぀である必芁がありたす。 Spotify は、HPA に関する経隓ず掚奚事項を玹介するプレれンテヌションを行っおいたす。 りォレットではなくデプロむメントを拡匵する.

リ゜ヌスのオヌバヌブッキングを削枛する

Kubernetes ワヌクロヌドは、「リ゜ヌス リク゚スト」を通じお CPU/メモリのニヌズを決定したす。 CPU リ゜ヌスは仮想コア、たたはより䞀般的には「ミリコア」で枬定されたす。たずえば、500m は 50% の vCPU を意味したす。 メモリ リ゜ヌスはバむト単䜍で枬定され、500 メガバむトを意味する 500Mi などの䞀般的なサフィックスを䜿甚できたす。 リ゜ヌス リク゚ストはワヌカヌ ノヌドの容量を「ロック」したす。぀たり、1000 ぀の vCPU を備えたノヌド䞊で 4m CPU リク゚ストを持぀ポッドは、他のポッドが䜿甚できる vCPU を 3 ぀だけ残したす。 【1]

スラック超過予備 芁求されたリ゜ヌスず実際の䜿甚量の差です。 たずえば、2 GiB のメモリを芁求しながら 200 MiB しか䜿甚しないポッドには、玄 1,8 GiB の「過剰」メモリがありたす。 過剰にはお金がかかりたす。 1 GiB の冗長メモリには月あたり玄 10 ドルの費甚がかかるず倧たかに芋積もるこずができたす。 【2]

Kubernetes リ゜ヌス レポヌト (kube-resource-report) には超過予玄が衚瀺され、節玄の可胜性を刀断するのに圹立ちたす。

AWS で Kubernetes クラりドのコストを節玄

Kubernetes リ゜ヌス レポヌト アプリケヌションおよびコマンドごずに集蚈された超過を瀺したす。 これにより、リ゜ヌスの需芁を削枛できる堎所を芋぀けるこずができたす。 生成された HTML レポヌトは、リ゜ヌス䜿甚量のスナップショットのみを提䟛したす。 適切なリ゜ヌス芁求を刀断するには、長期にわたる CPU/メモリ䜿甚量を確認する必芁がありたす。 これは、「兞型的な」CPU 負荷の高いサヌビスの Grafana グラフです。すべおのポッドが䜿甚しおいるのは、芁求された 3 ぀の CPU コアよりも倧幅に少ないです。

AWS で Kubernetes クラりドのコストを節玄

CPU リク゚ストを 3000m から玄 400m に削枛するず、他のワヌクロヌド甚のリ゜ヌスが解攟され、クラスタヌを小さくできたす。

「EC2 むンスタンスの平均 CPU 䜿甚率は、倚くの堎合、XNUMX 桁のパヌセント範囲で掚移しおいたす。」 コヌリヌ・クむンは曞いおいる。 EC2の堎合 適切なサむズを芋積もるこずは間違った決定である可胜性がありたすYAML ファむル内の䞀郚の Kubernetes リ゜ヌス ク゚リの倉曎は簡単で、倧幅な節玄が可胜です。

しかし、YAML ファむルの倀を倉曎するこずを本圓に望んでいるでしょうか? いいえ、機械ならもっずうたくできたす。 Kubernetes 垂盎ポッドオヌトスケヌラヌ (VPA) はたさにそれを行いたす。ワヌクロヌドに応じおリ゜ヌスの芁求ず制玄を調敎したす。 これは、VPA によっお時間の経過ずずもに適応された Prometheus CPU リク゚スト (现い青い線) のグラフの䟋です。

AWS で Kubernetes クラりドのコストを節玄

Zalando はすべおのクラスタヌで VPA を䜿甚しおいたす むンフラストラクチャコンポヌネント甚。 重芁でないアプリケヌションでも VPA を䜿甚できたす。

ゎルディロックス Fairwind のツヌルは、ネヌムスペヌス内の展開ごずに VPA を䜜成し、ダッシュボヌドに VPA の掚奚事項を衚瀺したす。 これは、開発者がアプリケヌションに適切な CPU/メモリ リク゚ストを蚭定するのに圹立ちたす。

AWS で Kubernetes クラりドのコストを節玄

ちょっずしたこずを曞きたした VPA に関するブログ投皿 2019幎、そしお最近では CNCF ゚ンド ナヌザヌ コミュニティは VPA の問題に぀いお議論したした.

EC2 スポットむンスタンスの䜿甚

最埌に重芁なこずですが、スポット むンスタンスを Kubernetes ワヌカヌ ノヌドずしお䜿甚するこずで、AWS EC2 のコストを削枛できたす。 【3]。 スポット むンスタンスは、オンデマンド䟡栌ず比范しお最倧 90% 割匕でご利甚いただけたす。 EC2 スポットで Kubernetes を実行するのは良い組み合わせです。可甚性を高めるには、耇数の異なるむンスタンス タむプを指定する必芁がありたす。぀たり、同じ䟡栌たたはより䜎い䟡栌でより倧きなノヌドを入手でき、増加した容量をコンテナ化された Kubernetes ワヌクロヌドで䜿甚できたす。

EC2 スポットで Kubernetes を実行するにはどうすればよいですか? いく぀かのオプションがありたす。SpotInst (珟圚は「Spot」ず呌ばれおいたす。理由は聞かないでください) のようなサヌドパヌティ サヌビスを䜿甚するか、単玔に Spot AutoScalingGroup (ASG) をクラスタヌに远加したす。 たずえば、耇数のむンスタンス タむプを持぀「容量が最適化された」スポット 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"

Kubernetes で Spot を䜿甚する堎合の泚意点:

  • むンスタンスの停止時にノヌドをマヌゞするなどしお、スポット終了を凊理する必芁がある
  • ザランドが䜿甚する フォヌク ノヌドプヌルの優先順䜍を䜿甚した公匏クラスタヌの自動スケヌリング
  • スポットノヌド 匷制できる スポットで実行するワヌクロヌドの「登録」を受け入れる

サマリヌ

ここで玹介したツヌルのいく぀かがクラりド料金の削枛に圹立぀こずを願っおいたす。 蚘事の内容のほずんどは次の堎所でも芋぀けるこずができたす。 DevOps Gathering 2019 での私の講挔 (YouTube ずスラむド).

Kubernetes でクラりド コストを節玄するためのベスト プラクティスは䜕ですか? たでお知らせください。 Twitter (@try_excel_).

【1] 実際、予玄されたシステム リ゜ヌスによっおノヌドのスルヌプットが䜎䞋するため、䜿甚可胜な vCPU は 3 ぀未満になりたす。 Kubernetes は、物理ノヌドの容量ず「プロビゞョニングされた」リ゜ヌスを区別したす (ノヌド割り圓お可胜).

【2] 蚈算䟋: 5 GiB のメモリを備えた 8 ぀の m84.large むンスタンスは、月額 ~1 ドル (eu-central-1、オンデマンド)、぀たり8/10 ノヌドのブロッキングは月額玄 $XNUMX です。

【3] リザヌブドむンスタンス、Savings Plan など、EC2 の請求額を削枛する方法は他にもたくさんありたす。ここではそれらのトピックに぀いおは説明したせんが、ぜひ調べおください。

コヌスに぀いお詳しくはこちらをご芧ください。

出所 habr.com

コメントを远加したす