Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KEDAを使ったイベント駆動オートスケーリング

 KEDAを使ったイベント駆動オートスケーリング

2023年 夏の Amazon EKS 祭り!〜Kubernetes のスケーラビリティについて様々なベストプラクティスを紹介〜
での登壇内容です。
https://pages.awscloud.com/eib-eks-matsuri-230810-reg.html?trk=aws_event_page

kashinoki38 - Yasuhiro Horiuchi

September 01, 2023
Tweet

More Decks by kashinoki38 - Yasuhiro Horiuchi

Transcript

  1. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. KEDAを使った イベント駆動オートスケーリング Yasuhiro Horiuchi AWS Japan G.K. Sr. Solutions Architect 2023年 夏 の A MA ZO N E KS 祭 り !
  2. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 自己紹介 2 堀内 保大 (Yasuhiro Horiuchi) • AWS Japan シニアソリューションアーキテクト • 主に Web系 EC企業様を担当 バックグラウンド • 前職:SIerで多岐にわたるシステムへの性能関連の技術支援 好きなAWSサービス コンテナ関連が好きです!! • Amazon Elastic Kubernetes Service (EKS) • AWS Fargate 趣味 • スノーボード、旅行 @ka_shino_ki [email protected]
  3. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Agenda 1. Kubernetes におけるオートスケーリング 2. KEDA とは 3. KEDA ユースケース 4. ベストプラクティスとTips 5. Key Takeaways 3
  4. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. Kubernetes における オートスケーリング 4
  5. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Kuberenetes におけるオートスケーリングの種類 1. Horizontal Pod Autoscaling (HPA) 2. Vertical Pod Autoscaling (VPA) 3. Cluster Autoscaler (CAS) or Karpenter 5 • Pod のオートスケーリング Metrics store HPA VPA Pending pods CAS X • Node のオートスケーリング or
  6. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Horizontal Pod Autoscaling (HPA) • Kubernetes の標準 API リソース • CPU やメモリの使用率に基づいて Pod の数を 自動的にスケーリング • Metrics Server を利用してメトリクスを確認 • EKSで利用するには、 ▪ Metrics Serverのインストールだけ(参考) 6 apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: php-apache spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
  7. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. HPAのスケーリング 7 EKS Worker Node API Server Deployment Controller Metrics Server EKS Worker Node kubelet メトリクス 収集 HPA Controller EKS Control Plane master metrics API 1 2 スケール アウト 1 2 3 5 4
  8. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. HPA をより柔軟に利用したい • HPAでも外部メトリクスをベースにスケールは可能だが、Custom Metrics API の実装を探すか、自分でがんばる必要がある ▪ E.g. – Prometheus Adapter • https://github.com/kubernetes-sigs/prometheus-adapter – Datadog custom metrics server • https://www.datadoghq.com/ja/blog/autoscale-kubernetes-datadog/ • HPAのゼロスケールはEKSでは現状利用不可 ▪ Kubernetes v1.27 時点では Alpha で、 API Server 等の feature gate を有効 にしないと利用できない – https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/#:~:text=1.27-,HPAScaleToZero,-false 8
  9. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. KEDA - Kubernetes Event-driven Autoscaling - 9
  10. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. KEDA - Kubernetes-based Event-Driven Autoscaling - • HPA より柔軟に Pod や Job のスケールが 可能な軽量 OSS コンポーネント ▪ 内部的には HPA と連携することで上書きや重複 なくシンプルに機能提供 • 多数の外部メトリクスをサポート • ゼロスケール対応 • カスタムリソースのマニフェストを記載す ることで設定が可能 10 https://keda.sh
  11. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. KEDA アーキテクチャ • 3つのコンポーネント ▪ Agent – Deployment を 0→1 / 1→ 0 にする – KEDA Operator により実現 ▪ Metrics – KEDA 自身が Metrics Server として ふるまう – KEDA がサポートする様々なメトリ クスを HPA に公開可能 – keda-operator-metrics-apiserver に より実現 ▪ Admission Webhook – マニフェストの構成ミスを防ぐ 11 > kubectl get deploy -n keda NAME READY UP-TO-DATE AVAILABLE AGE keda-admission-webhooks 1/1 1 1 4d9h keda-operator 1/1 1 1 4d9h keda-operator-metrics-apiserver 1/1 1 1 4d9h
  12. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. サポートするスケーラー 現状62種類のスケーラーをサポート たとえば、、 • ベーシック ▪ CPU, memory ▪ Cron • AWS • CloudWatch • DynamoDB • Kinesis • SQS • Monitoring Tools • Prometheus • Datadog • NewRelic • その他 • GitHub runner ▪ MySQL 12 https://keda.sh/docs/2.11/scalers/
  13. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. 設定方法 CRD, ScaledObject を定義する 対象のデプロイメントを scaleTargetReg で指定 以下のような設定値を定義可能 • レプリカ数(Min, Max) ▪ Min0はCPU, Memoryだけだとできない • ポーリング間隔 ▪ 各トリガーをチェックする間隔 ▪ ※0⇔1の時しか関係ない • クールダウン間隔 ▪ 最後のトリガーがアクティブであると報告された後、 リソースを 0 にスケールバックするまで待機する期間 • Fallback ▪ スケーラーがエラー状態にある場合にフォールバック するレプリカの数 ▪ ※CPU, Memoryの場合非サポート 13 apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: scaledobject-nginx spec: scaleTargetRef: name: keda-test pollingInterval: 30 cooldownPeriod: 300 minReplicaCount: 0 maxReplicaCount: 5 triggers: ...
  14. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. trigger (スケーラーの設定) ScaledObject に対して、複数の trigger を指定すること が可能 各スケーラーによって trigger のパラメータは異なる 例えばCloudWatch スケーラーの場合、 • どのメトリクスを利用するか • メトリクスの集計方法、集計期間 • ターゲット値 14 triggers: - type: aws-cloudwatch metadata: # Optional: namespace namespace: AWS/SQS # Optional: Dimension Name dimensionName: QueueName # Optional: Dimension Value dimensionValue: keda # Optional: metricName metricName: ApproximateNumberOfMessagesVisible targetMetricValue: "2.1" minMetricValue: "1.5" # Required: region awsRegion: "eu-west-1" identityOwner: pod | operator # Optional. Default: pod # Optional: Collection Time metricCollectionTime: "300" # default 300 # Optional: Metric Statistic metricStat: "Average" # default "Average" # Optional: Metric Statistic Period metricStatPeriod: "300" # default 300 # Optional: Metric Unit metricUnit: "Count" # default "" # Optional: Metric EndTime Offset metricEndTimeOffset: "60" # default 0 https://keda.sh/docs/2.11/scalers/aws-cloudwatch/
  15. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. EKS での始め方 • Helm で入れる • EKS Blueprints で入れる ▪ Terraform(ref), CDK(ref) ▪ ※内部的にはHelmで入る 15 $ helm repo add kedacore https://kedacore.github.io/charts $ helm repo update $ helm install keda kedacore/keda --namespace keda --create-namespace module "eks_blueprints_kubernetes_addons" { source = "github.com/aws-ia/terraform-aws-eks-blueprints//modules/kubernetes-addons" eks_cluster_id = <EKS-CLUSTER-ID> # EKS Addons enable_keda = true • https://keda.sh/docs/2.11/deploy/ • https://github.com/kedacore/charts/blob/main/keda/README.md
  16. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. KEDA ユースケース例 16
  17. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. ユースケース例 • リクエストベースのスケール • SQS キュー長ベースのゼロスケール • Podのスケジュールスケーリング(時間指定のスケーリング) 17
  18. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. リクエストベースのスケール • ALB の CloudWatch メトリクス RequestCount をベースに KEDA で Pod をスケール 18 Ingress Application Load Balancer Amazon CloudWatch AWS Load Balancer Controller
  19. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. SQS キュー長ベースのゼロスケール • SQS 内のメッセージ数をベースに Pod をスケール ▪ 実処理中のメッセージ(NotVisible)を含める/含めない選択可 19 Amazon SQS
  20. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Podのスケジュールスケーリング(時間指定のスケーリング) • ユースケース ▪ 特定の時間になれば Pod 数を指定数までスケールさせたい ▪ HPAとバッティングしないようにしたい • KEDAのTriggerに cron と CPU 等複数のスケーラー設定が可能 20 triggers: - type: cpu metricType: Utilization metadata: value: "60" - type: cron metadata: timezone: Asia/Tokyo start: 15 * * * * # Every hour on the 15th minute end: 20 * * * * # Every hour on the 20th minute desiredReplicas: "10"
  21. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Podのスケジュールスケーリング(時間指定のスケーリング) 内部的には HPA にスケジュールスケーリング用 のメトリクスが設定されることで実現 • HPAのメトリクスとして、特定時間にだけ必要 台数 Pod 平均で 1 になるメトリクスが定義さ れている • このメトリクスを満たすためにスケールが必要 21 apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler ... spec: maxReplicas: 10 metrics: - external: metric: name: s1-cron-Asia-Kolkata-0xxxx-10xxxx selector: matchLabels: scaledobject.keda.sh/name: scaledobject-nginx target: averageValue: "1" type: AverageValue type: External - resource: name: cpu target: averageUtilization: 60 type: Utilization type: Resource minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment
  22. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. デモ – CPU & Cron 22
  23. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. KEDA Tipsとベストプラクティス 24
  24. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. KEDAのメトリクス収集について • ScaledObject のポーリング間隔について • 0⇔1の時にのみ有効 • 1⇔Nの場合、HPAの仕組みになるため、 --horizontal-pod-autoscaler-sync-period に依存 (デフォルト15秒) • メトリクスのキャッシュ • triggers.useCachedMetrics: true • HPAのポーリング時に、KEDAオペレーターで キャッシュしたメトリクスを見る仕組み • .spec.pollingInterval 間隔でキャッシュをリフ レッシュ 25 https://static.sched.com/hosted_files/kccnceu2023/c5/KubeCon%20Europe%202023%20KEDA.pdf https://www.youtube.com/watch?v=Db3UcxXbsvw apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: scaledobject-nginx spec: scaleTargetRef: name: keda-test pollingInterval: 30 cooldownPeriod: 300 minReplicaCount: 0 maxReplicaCount: 5 triggers: ...
  25. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. スケール挙動の細かい調整 • 明示的に指定することで、HPA のBehaviorのスケール挙動の調整が 可能 ▪ Stabilization Window – Pod スケールアウト/イン後にレプリカ数維持する時間 – メトリクスが変動し続ける場合に、レプリカ数の頻繁な増減を制限するために使用 – デフォルト:スケールアウト時 0 秒、スケールイン時 300 秒 – ※あくまで spec.cooldownPeriod は、1→0の待機時間で、N→1の待機時間は Stabilization Window ▪ スケーリングポリシー(policies) – 個別のスケールアップ動作とスケールダウン動作を定義 – 何秒で、何レプリカ(台数か割合)を増減させるか – 右の例だと、15秒で必要レプリカ数まで削減 26 https://static.sched.com/hosted_files/kccnceu2023/c5/KubeCon%20Europe%202023%20KEDA.pdf spec: advanced: horizontalPodAutoscalerConfig: name: {name-of-hpa-resource} behavior: scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 100 periodSeconds: 15
  26. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. KEDA ベストプラクティス • 同じターゲットに対して複数のトリガーを使用する ▪ ScaledObject 内に複数のトリガーを指定可能 ▪ メリット – ルールが一か所で管理しやすい – 複数の ScaledObject が互いに干渉しない • KEDA の ScaledObject と HPA を組み合わせて利用しない ▪ KEDA が内部で作成した HPA と競合するリスクがある ▪ 代替として、KEDA の CPU、メモリスケーラーを利用する 27 https://keda.sh/docs/2.11/faq/
  27. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. KEDA ベストプラクティス • KEDA自体の可用性に関する考慮点 ▪ KEDA Metrics Server の冗長化 – 複数台のレプリカをデプロイし活用することが可能 • helm であれば、 metricsServer.replicaCount にて指定 (デフォルト 1) – API Server のフラグ --enable-aggregator-routing=true にて、バランシングされる ▪ KEDA Operator の冗長化 – 複数台のレプリカをデプロイすることが可能。ただしリーダーは1台だけで、残りは Standbyとして稼働 – フェールオーバー時のダウンタイム削減目的 ▪ 上記冗長化をAZ分散して冗長化する – topologySpreadConstraints を利用する ▪ 上記コンポーネントを Node のスケールインから保護するために、 Karpenter や Cluster Autoscaler 管理外の専用 Node や Fargate に配置する 28 • https://keda.sh/docs/2.11/operate/cluster/#high-availability • https://github.com/kedacore/charts/blob/main/keda/README.md
  28. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. KEDA ベストプラクティス KEDA の監視 :8080/metrics にて以下メトリクス収集可能 • keda_scaler_activity • keda_scaler_metrics_value • keda_scaler_metrics_latency • keda_scaler_errors • keda_scaler_errors_total • keda_scaled_object_errors • keda_resource_totals • keda_trigger_totals • scaled_object_validation_total • scaled_object_validation_error 29 Grafana ダッシュボードサンプル https://github.com/kedacore/keda/blob/main/config/grafana/keda-dashboard.json
  29. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. まとめ 30
  30. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Key Takeaways • KEDAとは ▪ HPA より柔軟に Pod や Job のスケールが可能な軽量 OSS コンポーネント ▪ 多数の外部メトリクスをサポートしており、ScaledObject を定義することで 柔軟なスケール設定が可能 ▪ HelmやEKS Blueprintsで容易に導入可能 • KEDA ユースケース例 ▪ ALBリクエスト量ベースでのスケール ▪ SQSのキュー長に応じたスケール ▪ HPAとスケジュールスケーリングの組み合わせ • ぜひ試してみてください! 31
  31. © 2023, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Thank you! © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. Yasuhiro Horiuchi 32 @ka_shino_ki [email protected]