PerfectScalePerfectScale

PerfectScale

KEDA Helmチャート:インストールから運用まで

このページはEnglish、Deutsch、Español、Français、Italiano、Portuguêsでもご覧いただけます。

Tania Duggal
By Tania Duggal
Sep 14, 202613 min read

KEDA Helmチャートは、Kubernetesのイベント駆動オートスケーラーであるKEDAをクラスターにインストールする公式の方法です。helm install を一度実行するだけで、イベントに基づいてワークロードをスケールするためにKEDAが必要とするすべて——オペレーター、メトリクスサーバー、アドミッションWebhook、スケーリングルールを定義するためのカスタムリソース——がデプロイされます。

本ガイドでは、このチャートを詳しく解説します。デプロイされるコンポーネント、インストールと検証の方法、values.yaml の主要パラメータ、KEDAの高可用性構成、セキュリティ強化と監視、GitOpsでの管理、そして不要なリソースを残さずにアップグレード・アンインストールする方法を学べます。

KEDA Helmチャートとは

KEDAは、キューの長さ、Kafkaトピックのラグ、HTTPリクエスト数、cronスケジュールといったイベントに基づいてPodをスケールします。組み込みのHorizontal Pod Autoscaler(HPA)はCPUとメモリでしかスケールできません。KEDAはその上にこうしたイベントソースをすべて追加し、処理すべきものがないときはワークロードをPod数ゼロまでスケールダウンすることもできます。

KEDAはHPAを置き換えるものではありません。イベントソースを読み取り、実際のスケーリングを行うHPAを作成して、外部メトリクスを供給する仕組みです。何をスケールするかは ScaledObject というカスタムリソースで記述します。

Helmチャートを使えばKEDAとその関連コンポーネントを一括でインストールできるため、推奨されるデプロイ方法となっています。

チャートがクラスターにデプロイするもの

KEDA Helmチャートをクラスターにインストールすると、次のコンポーネントがインストールされます。

a. KEDAオペレーター:KEDAのメインコントローラーです。ScaledObjectおよびScaledJobリソースを監視し、スケーリングを担うHPAを管理します。KEDAの中核となる部分です。

b. メトリクスAPIサーバー:イベントベースのメトリクスを external.metrics.k8s.io API 経由でKubernetesに公開します。これにより、HPAはCPUやメモリだけでなく、キューの長さなどに基づいてスケールできるようになります。

c. アドミッションWebhook:KEDAリソースの作成時に検証を行います。2つのScaledObjectリソースが同じワークロードをスケールしようとしているといった設定ミスを早期に検出します。

最後に、チャートはCRDをインストールします。これにより、ScaledObject、ScaledJob、TriggerAuthentication、ClusterTriggerAuthenticationといったKEDAのリソースタイプが追加されます。また、これらのコンポーネントに必要なRBAC権限もインストールされます。

media

前提条件とバージョン互換性

KEDAをインストールする前に、次の前提条件とバージョン要件を確認してください。

a. KEDA 2.20はKubernetes 1.30以降を必要とするため、まず kubectl version でクラスターのバージョンを確認してください。また、KEDAチャートはHelm 3のみをサポートしているため、Helm 3が必要です。

b. KEDAのコンポーネントを実行するのに十分なリソースがクラスターにあることを確認してください。チャートは ghcr.io からコンテナイメージを取得するため、ノードからイメージレジストリへのネットワークアクセスも必要です。

c. KEDAのメトリクスサーバーはクラスター全体のAPIServiceを作成するため、keda ネームスペースのネットワークポリシーはKEDAが必要とする通信を許可する必要があります。クラスターのアクセスが厳しく制限されている場合やエアギャップ環境の場合は、インストール前に必要なネットワークアクセスとイメージが利用可能であることを確認してください。

KEDA Helmチャートのインストール

まず、公式のKEDAリポジトリを追加して更新します。

helm repo add kedacore https://kedacore.github.io/charts
helm repo update

専用のネームスペースにインストールし、最新版をそのまま使うのではなくチャートのバージョンを固定します。

helm install keda kedacore/keda \
--namespace keda \
--create-namespace \
--version <chart-version>

チャートのバージョンは特定のKEDAアプリバージョンに対応しているため、テスト済みのバージョンを確実に使うにはバージョンの固定が重要です。利用可能なバージョンは helm search repo kedacore/keda --versions で確認できます。

インストール後は、正常に動作しているべき3つの要素を確認します。まずPodが実行中であることを確認します。

kubectl get pods -n keda

次に、CRDが存在し、外部メトリクスのAPIServiceが登録されて利用可能であることを確認します。

kubectl get crd | grep keda.sh
kubectl get apiservice v1beta1.external.metrics.k8s.io

Podが実行中で、このAPIServiceのAvailableが True と表示されていれば、KEDAは正しくインストールされています。

KEDAをデプロイするその他の方法

HelmチャートはKEDAの推奨インストール方法ですが、唯一の選択肢ではありません。最適な方法はクラスターの管理方法によって異なります。他の方法は次のとおりです。

a. OpenShift:OperatorHubとOperator Lifecycle Manager(OLM)を通じてKEDAをインストールできます。Helmの代わりにOLMがKEDAオペレーターとそのアップグレードを管理します。

b. YAMLマニフェスト:Helmを使えない場合、KEDAはリリースごとにYAMLマニフェストを提供しており、kubectl applyで適用できます。この方法では、CRDとアップグレードを自分で管理する必要があります。

c. MicroK8s:KEDAは組み込みのアドオンとして提供されており、コマンド1つで有効化できます。

どの方法を選んでも、KEDAの主要コンポーネントとCRDは同じです。主な違いは、KEDAのパッケージングと管理の方法です。

values.yamlの主要パラメータ

values.yaml で押さえておくべき主要パラメータは次のとおりです。

a. イメージのレジストリ、リポジトリ、タグ:KEDAの各コンポーネント(image.keda、image.metricsApiServer、image.webhooks)には、それぞれレジストリ、リポジトリ、タグの設定があります。タグを空のままにすると、チャートはKEDAアプリバージョンを使用します。制限された環境では、これらの値を設定して独自のイメージレジストリやミラーを使用できます。

b. crds.installとCRDの所有権:デフォルトでは、チャートがCRDをインストール・管理します。GitOpsツールなど別のツールがすでにCRDを管理している場合は、両方のシステムが同じCRDを管理しようとしないよう crds.install: false を設定してください。

c. watchNamespaceとネームスペースのスコープ:デフォルトでは、KEDAはすべてのネームスペースを監視します。watchNamespaceを設定すると、KEDAを特定のネームスペースに限定できます。共有クラスターでKEDAの動作範囲を制限したい場合に便利です。

d. リソースのrequestsとlimits:resources.operator、resources.metricServer、resources.webhooksを使って、オペレーター、メトリクスサーバー、Webhookのリソースを個別に設定できます。クラスターに負荷がかかっている状況でもKEDAが安定して動作できるよう、適切なrequestsとlimitsを設定してください。

KEDAの高可用性構成

本番環境では、ノード障害でKEDAが停止する事態は避けたいものです。コンポーネントを複数レプリカで実行し、異なるノードに分散させます。

オペレーターは operator.replicaCount による複数レプリカをサポートしています。リーダー選出を使用するため、アクティブなオペレーターインスタンスは常に1つだけで、他のインスタンスは必要時に引き継げるよう待機します。

メトリクスAPIサーバーも metricsServer.replicaCount で複数レプリカを実行できます。これにより、1つのレプリカに障害が発生しても外部メトリクスの可用性を維持しやすくなります。

さらに、Podのanti-affinityを使ってレプリカを異なるノードに分散させ、PodDisruptionBudget(PDB)を使ってノードのドレイン時にすべてのレプリカが同時に停止しないようにすべきです。

本番向けのvalues.yamlの例は次のとおりです。

operator:
replicaCount: 2
metricsServer:
replicaCount: 2
podDisruptionBudget:
operator:
minAvailable: 1
metricServer:
minAvailable: 1
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
app: keda-operator

スケーラーのHTTP・TLS設定のチューニング

多くのKEDAスケーラーはHTTP経由で外部システムに接続します。制限の厳しい環境では、これらの接続の動作を制御する必要が出てくるかもしれません。KEDAはHTTP、TLS、プロキシ接続を設定するための項目を提供しています。

a. HTTPタイムアウト:KEDA_HTTP_DEFAULT_TIMEOUTは、KEDA組み込みのHTTPクライアントを使用するスケーラーのデフォルトタイムアウトを設定します。値の単位はミリ秒です。一部のスケーラーは独自のベンダーSDKを使用するため、それらのスケーラーにはこの設定は適用されません。

b. 最小TLSバージョン:KEDA_HTTP_MIN_TLS_VERSIONは、KEDAのアウトバウンドHTTP接続の最小TLSバージョンを設定します。KEDA_SERVICE_MIN_TLS_VERSIONは、WebhookやgRPCサービスなど、KEDA自身のTLSサービスの最小TLSバージョンを設定します。デフォルトはTLS 1.3です。

c. TLS暗号スイートリスト:KEDA_HTTP_TLS_CIPHER_LISTを使うと、KEDAが使用できるTLS暗号スイートを制限できます。ただし、GoのTLSライブラリではTLS 1.3向けに暗号スイートを設定できないため、この設定はTLS 1.3には影響しません。

d. HTTP・HTTPSプロキシ:KEDAが企業プロキシ経由で外部システムに接続する必要がある場合は、KEDAオペレーターに標準のHTTP_PROXY、HTTPS_PROXY、NO_PROXY環境変数を設定してください。

インストールのセキュリティ強化

本番環境でKEDAのセキュリティを高められる設定が2つあります。シークレットへのアクセス制限と証明書の管理です。順に見ていきましょう。

a. シークレットアクセスの制限:デフォルトでは、KEDAは監視対象のネームスペース全体でシークレットを読み取れます。permissions.operatorの設定を使うと、オペレーターが自身のリリースネームスペース内のシークレットのみ、または特定の名前のシークレットのみを読み取れるように制限できます。これにより、オペレーターが侵害された場合にアクセスされうる範囲を縮小できます。

b. 証明書の管理:KEDAは自己署名証明書を自動生成し、kedaorg-certsという名前のシークレットに保存して、各コンポーネントにマウントします。また、KEDAはこれらの証明書を自動的にローテーションし、必要なKubernetesリソースを更新して信頼される状態を維持します。

c. 組織のポリシーとしてマネージド認証局の証明書が必要な場合は、certificates.certManager.enabled を有効にすると、KEDAの代わりにcert-managerが証明書の発行とローテーションを行います。ほとんどのインストールでは、自動生成された証明書で十分です。

GitOpsによるチャートのデプロイ

Argo CDやFluxでクラスターを管理している場合は、GitOps経由でKEDAチャートをデプロイできます。特に注意して扱うべきなのはCRDです。

KEDAのCRDはサイズが大きく、生成されるアノテーションが大きくなりすぎるため、通常のKubernetes applyが失敗することがあります。これを避けるには、GitOpsツールがCRDをマージではなく置き換えるように設定します。Fluxの場合はHelmReleaseで crds: CreateReplace を設定し、Argo CDの場合はCRDに Replace=true またはserver-side applyを使用して、正しく適用されるようにします。

CRDが正しく設定されていないと、GitOpsで管理するKEDAのインストールが失敗する可能性があります。

レンダリング済みマニフェストの管理を好むワークフローであれば、helm template でチャートを通常のKubernetes YAMLファイルに変換し、それらのファイルをGitにコミットすることもできます。

どの方法を採用する場合でも、GitOpsツールとHelmがリソースの所有権をめぐって衝突しないよう、app.kubernetes.io/managed-by ラベルは一貫させてください。

インストール後に最初のScaledObjectを作成する

KEDAをインストールしたら、ScaledObjectを使ってKEDAが実際にワークロードをスケールできることを検証できます。以下の例ではcronトリガーを使用するため、外部システムは不要です。スケジュールされた時間帯にDeploymentをスケールアップし、スケジュールが終わるとスケールダウンします。

まずスケール対象のDeploymentを作成し、次に ScaledObject を適用します。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: nginx-cron
namespace: default
spec:
scaleTargetRef:
name: nginx
pollingInterval: 30
cooldownPeriod: 300
minReplicaCount: 0
maxReplicaCount: 5
triggers:
- type: cron
metadata:
timezone: Asia/Kolkata
start: 0 9 * * *
end: 0 17 * * *
desiredReplicas: "5"

pollingIntervalは、KEDAがトリガーをチェックする間隔を秒単位で指定します。minReplicaCount: 0 はPod数ゼロへのスケールダウンを有効にします。9時〜17時の時間帯以外は、DeploymentをPod数ゼロまでスケールダウンできます。スケジュールされた時間帯には5レプリカまでスケールアップします。

ScaledObject を適用し、KEDAが作成したリソースを確認します。

kubectl get scaledobject
kubectl get hpa

keda-hpa-nginx-cron という名前のHPAが表示されるはずです。KEDAはこのHPAを作成・管理して実際のスケーリングを行います。これにより、KEDAがワークロードに接続され、スケジュールされたスケーリング設定が機能していることを確認できます。

media

KEDAインストールの監視

KEDAが稼働したら、正常な状態で期待どおりに動作しているかを確認しましょう。
KEDAはオペレーターとメトリクスサーバーの両方についてPrometheusメトリクスを提供します。これらのメトリクスからは、スケーラーのアクティビティ、エラー、KEDAが報告する値を確認できます。

Prometheus Operatorを使用している場合、KEDAチャートはメトリクスサーバー用のServiceMonitorとオペレーター用のPodMonitorを作成できます。values.yamlのprometheus設定で有効化すれば、Prometheusが自動的にメトリクスを収集できます。

特定のScaledObjectが期待どおりに動作しない場合は、オペレーターのログも役立ちます。スケーラーがトリガーをどう読み取っているか、どのようなエラーが発生しているかを確認できます。

オペレーターのログは次のコマンドで表示できます。

kubectl logs -n keda deploy/keda-operator

KEDAがスケールするワークロードのライトサイジング

KEDAは需要に応じてPod数をスケールすることに優れています。しかし、各PodがどれだけのCPUとメモリをリクエストすべきかは判断しません。

レプリカを増やしても、リソースリクエストの誤りは解消されません。各Podが実際の使用量よりはるかに多いCPUやメモリをリクエストしていれば、KEDAはレプリカを追加するたびにその無駄を増幅させてしまいます。逆にリクエストが少なすぎると、トラフィック増加時に新しいレプリカがOOMKilledやCPUスロットリングに見舞われる可能性があります。

ここで役立つのがリソース最適化ツールです。PerfectScaleは、ワークロードが実際にCPUとメモリをどう使用しているかを監視し、自動化されたライトサイジングの推奨を提供します。推奨は手動でも自動でも適用できます。

KEDAと組み合わせることで、オートスケーリングの両面をカバーできます。KEDAが需要に合わせてPod数を調整し、PerfectScaleが各Podに適切な量のCPUとメモリが割り当てられるよう支援します。これにより、ワークロードの信頼性を保ちながら過剰プロビジョニングを防げます。実際に試すことも、技術セッションを予約することもできます。

その他のツールとしては、使用状況に基づいてリソースリクエストを調整できるVertical Pod Autoscaler(VPA)、VPAの推奨事項の可視化を支援するGoldilocks、そしてワークロードを実行するノードの選択と管理に特化したKarpenterがあります。

media

チャートのアップグレードとアンインストール

KEDAをアップグレードまたはアンインストールする際には、確認すべき重要なポイントがいくつかあります。

KEDAをアップグレードするには、まずHelmリポジトリを更新し、固定したチャートバージョンにアップグレードします。

helm repo update
helm upgrade keda kedacore/keda --namespace keda --version <new-chart-version>

アップグレード時に注意すべきなのはCRDです。チャートがCRDを管理しているため、helm upgrade は他のリソースと一緒にCRDも更新しますが、KEDAのマイナーバージョンではCRDのフィールドやスケーラーの動作が変わることがあります。本番クラスターをアップグレードする前にリリースノートを読み、新しいKEDAバージョンが使用中のKubernetesバージョンをサポートしていることを確認してください。

KEDAのアンインストールにも注意が必要です。削除の際にリソースが残ってしまうことがあるためです。

まず、ScaledObject と ScaledJob リソースを削除します。

kubectl delete scaledobject --all --all-namespaces
kubectl delete scaledjob --all --all-namespaces

次に、Helmリリースをアンインストールします。

helm uninstall keda --namespace keda

ScaledObject と ScaledJob リソースを先に削除することで、KEDAが作成したHPAをKEDA自身がクリーンアップできます。また、ゼロにスケールされていたワークロードが、KEDAが削除される前に通常のレプリカ数に戻る機会も得られます。

ファイナライザーが原因でリソースの削除が進まなくなった場合は、次のコマンドでファイナライザーを削除できます。

kubectl patch scaledobject <name> -p '{"metadata":{"finalizers":null}}' --type=merge

チャートでよくある問題のトラブルシューティング

KEDAが期待どおりにスケールしないときに確認すべき、よくある問題が2つあります。

a. 外部メトリクスAPIが利用不可、またはTLS検証に失敗している:kubectl get apiservice v1beta1.external.metrics.k8s.io でAvailableと表示されない場合、HPAは外部メトリクスを取得できず、それに基づくワークロードのスケールができません。よくある原因としては、メトリクスサーバーの異常、通信をブロックするNetworkPolicy、Kubernetes APIサーバーとメトリクスサーバー間の接続を妨げるプロキシが挙げられます。まずメトリクスサーバーのPodを確認してください。プロキシを使用している場合は、メトリクスサーバーのクラスターIPがAPIサーバーの no_proxy リストに含まれていることを確認してください。

b. ScaledObjectを作成してもレプリカ数が変わらない:まず kubectl describe scaledobject <name> でステータスとイベントを確認します。次にKEDAオペレーターのログを確認します。原因としては、トリガーの設定ミス、イベントソースの認証情報の不足、同じワークロードをすでにターゲットにしている既存のHPAが考えられます。既存のHPAは、KEDAが作成・管理するHPAと競合する可能性があります。

KEDA Helmチャート運用のベストプラクティス

以下のプラクティスは、KEDAのインストールを安定的かつ安全に保つのに役立ちます。

a. チャートのバージョンを固定し、テスト済みのKEDAアプリバージョンに合わせる:最新版をそのままインストール・アップグレードしないでください。チャートのバージョンを固定し、そのKEDAバージョンをテストし、慎重にロールアウトすることで、常に何が動いているかを把握できます。

b. KEDAを専用ネームスペースに置き、専用のリソースクォータを設定する:専用ネームスペースはKEDAを分離し、KEDA専用のResourceQuotaとNetworkPolicyを適用しやすくします。

c. KEDAの3つのコンポーネントすべてに明示的なrequestsとlimitsを設定する:クラスターに負荷がかかったときにKEDA自体がスロットリングやエビクションの対象にならないよう、オペレーター、メトリクスサーバー、Webhookに適切なリソースを設定する必要があります。

d. ScaledObjectに認証情報を直接書かず、TriggerAuthenticationを使う:TriggerAuthenticationまたはClusterTriggerAuthenticationを参照することで、認証情報をScaledObjectマニフェストの外に保てます。これにより、認証情報をバージョン管理から排除でき、再利用も可能になります。

e. 同じワークロードに対してScaledObjectと手動作成のHPAを併用しない:同じワークロードを2つのコントローラーがスケールしようとすると、互いに競合する可能性があります。KEDAがスケールするワークロードのHPAは、KEDAに管理させてください。

f. アップグレードはロールアウト前に非本番クラスターでテストする:KEDAのマイナーバージョンにはCRDの変更が含まれることがあるため、まず安全な環境でアップグレードをテストしてください。これにより、互換性の問題が本番ワークロードに影響する前に検出できます。