コンテンツにスキップ

KEDA で Cron を使って replica 数を変更する

はじめに

Kubernetes の Pod 数を時間帯ごとに変えるため、KEDA の Cron トリガーを設定します。設定例と、ArgoCD が replica 数を元の値へ戻す問題への対処を紹介します。

KEDA(Kubernetes Event-driven Autoscaling)は、Kubernetes でイベント駆動の自動スケーリングを行うためのコンポーネントです。CPU やメモリの使用率だけでなく、メッセージキューの長さや HTTP リクエスト数などの外部イベントに基づいて、Pod の数を 0 から n に自動的に調整できます。

KEDA の特徴

KEDA の主な機能は次のとおりです。

  • イベントドリブンなスケーリング: メッセージキューの長さや HTTP リクエスト数などの外部イベントをトリガーとした、Pod の数の自動調整
  • ゼロスケール: アプリケーションが非アクティブな場合に Pod の数を 0 に下げることによる、リソースの節約
  • 柔軟なスケーリング条件: Cron ベースのスケーリングや、複数のトリガーを組み合わせた複雑なスケーリング条件の設定
  • Kubernetes ネイティブ: Kubernetes の標準コンポーネントである Horizontal Pod Autoscaler(HPA)と連携し、置き換えや重複なしに機能を拡張

例

設定例を示したあと、運用時の注意点を補足します。

Cron トリガー

KEDA の Cron 機能を使うと、利用されない時間帯は replica 数を 0 にして、利用される時間帯は replica 数を増やすことができます。以下は、Cron 機能を使って特定の時間に replica 数を変更する例です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
  namespace: keda-demo
spec:
  #   replicas: 3 # replica数を指定するとArgoCDとKEDAで上書き合戦が発生する
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80
          resources:
            limits:
              cpu: "500m"
              memory: "128Mi"
            requests:
              cpu: "250m"
              memory: "64Mi"
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scale
  namespace: keda-demo
spec:
  scaleTargetRef:
    name: nginx-deployment
    kind: Deployment # StatefulSet なども指定可能
  minReplicaCount: 0
  cooldownPeriod: 15
  triggers:
    - type: cron
      metadata:
        timezone: Asia/Tokyo
        start: 0 9 * * *
        end: 0 17 * * *
        desiredReplicas: "1"
    - type: cron
      metadata:
        timezone: Asia/Tokyo
        start: 0 10 * * *
        end: 0 12 * * *
        desiredReplicas: "5"

この例では複数の Cron トリガーで時間帯ごとに replica 数を変えています。複数のトリガーを設定した場合に KEDA が優先するのは、replica 数が最も大きくなるトリガーです。そのため、10 時から 12 時までは replica 数が 5 になり、それ以外の指定した時間帯は 1 になります。どのトリガーも指定していない時間帯の replica 数は 0 です。

注意

気をつける点として、KEDA 以外で replicas を指定すると ArgoCD と KEDA で replica 数の上書き合戦が発生してしまいます。Deployment や StatefulSet のマニフェストで replicas を指定しないようにするか、ArgoCD で replicas の値を ignore することで解決できます。

その他

ここでは、fallback の挙動と ScaledObject の status 確認方法について補足します。どちらも Cron トリガーの設定自体には現れませんが、運用時に押さえておきたい点です。

fallback

replica 数を決めるために使っているメトリクスの取得に失敗した場合、fallback として replica 数をどうするか設定できます。

  • static (default): Use the specified replicas count
  • currentReplicas: Use the current number of replicas
  • currentReplicasIfHigher: Use the higher of current or specified replicas
  • currentReplicasIfLower: Use the lower of current or specified replicas

status

ScaledObject の status を見ると、condition の状態を確認できます。4 つある condition で、設定の正しさやトリガーの稼働状況、fallback や一時停止の有無がそれぞれ分かります。

Condition Type Description
Ready Whether the ScaledObject is configured correctly
Active Whether any trigger is currently active
Fallback Whether fallback is currently active
Paused Whether scaling is currently paused

まとめ

KEDA の Cron トリガーを使うと時間帯に応じて replica 数を柔軟に増減でき、複数のトリガーの重なる時間帯は replica 数の最も大きいトリガーが優先されます。意図した数値になっているかを、設定時に確認してください。また、Deployment のreplicas指定と KEDA のスケーリングが競合する点には注意が必要です。ScaledObject の fallback の設定や status の condition を活用すると、メトリクスの取得に失敗したときの挙動やスケーリングの状態を把握しやすくなります。

参考