コンテンツにスキップ

KEDA で Cron を使って 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)と連携し、KEDA の機能を拡張できます。

cron

KEDA は、Cron 機能を使用して特定の時間に replica 数を変更できます。この機能を使うことで、利用されない時間帯は replica 数を 0 にして、利用される時間帯は replica 数を増やすことができます。 以下は、KEDA の 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 数を変更しています。複数のトリガーを設定した際は、レプリカ数が最も大きくなるトリガーが優先されます。上記の例だと、10 時から 12 時までの間は replica 数が 5 になり、それ以外の指定された時間帯 replica 数が 1 になります。指定されていない時間帯は replica 数が 0 になります。

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

その他

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 の状態を確認できます。condition には次の 4 つがあります。

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

参考