0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kubernetes の CronJob と RBAC を活用して Deployment レプリカ数を定期的にスケールインする方法

Last updated at Posted at 2025-02-22

📌記事の概要

Kubernetes を運用していると「夜間や特定の時間帯に Deployment のレプリカ数を縮退(スケールイン)したい」と思うことはありませんか?本記事では、RBAC(Role-Based Access Control)を活用し、CronJob を使って定期的に Deployment のスケールインを行う方法を解説します。

🔹RBACとは

RBAC(Role-Based Access Control)は、Kubernetes のリソースに対するアクセス権限を管理する仕組み です。
これにより、特定のユーザーや ServiceAccount に対して、どのリソースにどの操作(例: get, patch, delete)を許可するか を細かく設定できます。

Kubernetes では RBAC を設定する際に 2種類の Role を使います:

  • Role:1つの Namespace に限定された権限を付与する
  • ClusterRole:クラスタ全体で利用できる権限を付与する

今回は、Namespace pra1 にある CronJob から、Namespace pra2 の Deployment をスケールインするアーキテクチャを構築するため、ClusterRole を利用します。

🏗アーキテクチャ

本記事で構築するアーキテクチャは以下のようになります。
image.png

  • pra1 Namespace には CronJobServiceAccountcron-sa)が存在
  • pra2 Namespace にはスケールイン対象の Deploymentdeploy)が存在
  • ServiceAccount に対して、ClusterRoleBinding を通じて ClusterRole を適用し、Deployment のスケール権限を付与

🛠構築手順

1.Namespaceを作成

kubectl create ns pra1
kubectl create ns pra2

2.Scale In対象のDeploymentを作成

kubectl create deploy deploy --image=nginx -n pra2 --replicas=3

3.ServiceAccountを作成

kubectl create sa cron-sa -n pra1

4.ClusterRoleを作成

Deployment の get 権限と scalepatch)権限を持つ ClusterRole を作成します。

kubectl create clusterrole scale-cluster-role \
  --verb=get --verb=patch \
  --resource=deployments --resource=deployments/scale

5.ClusterRoleBindingを作成

ClusterRoleServiceAccountをバインディングします。

kubectl create clusterrolebinding scale-cluster-rolebinding \
  --clusterrole=scale-cluster-role \
  --serviceaccount=pra1:cron-sa

6.Scaleコマンドを定期実行するCronJobを作成

Deployment に対してScaleコマンドを定期実行(今回は3分おき)するCronJob のマニフェストファイルを作成します。

kubectl create cj scale-in \
  --image=bitnami/kubectl \
  -n pra1 \
  --schedule='*/3 * * * *' \
  --dry-run=client -o yaml \
  -- /bin/sh -c 'kubectl scale deploy/deploy -n pra2 --replicas=1' > cj.yaml

作成したマニフェストファイルを編集し、ServiceAccountをアタッチします。

cj.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: scale-in
  namespace: pra1
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: scale-in
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          serviceAccountName: cron-sa #ServiceAccountを追記
          containers:
          - command:
            - /bin/sh
            - -c
            - kubectl scale deploy/deploy -n pra2 --replicas=1
            image: bitnami/kubectl
            name: scale-in
            resources: {}
          restartPolicy: OnFailure
  schedule: '*/3 * * * *'
status: {}

適用:

kubectl create -f cj.yaml

7.DeploymentがScale Inされることの確認

kubectl get deploy deploy -n pra2 -w

数分待つと、以下のような実行結果が出力され、Scale Inが正常に実行されたことを確認できました。

$ kubectl get deploy deploy -n pra2 -w
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
deploy   3/3     3            3           13m
deploy   3/1     3            3           15m
deploy   3/1     3            3           15m
deploy   1/1     1            1           15m

⚠️ 注意
スケール変更時の動作は Deploymentstrategy によって変わることがあります。

🔍トラブルシューティング

✅Jobが作成されているか確認

kubectl get job -n pra1

Job が作成されていない場合、CronJob の設定に問題がある可能性が高い!

kubectl describe job <Job名> -n pra1

✅Podが作成されているか確認

kubectl get po -n pra1

Pod が作成されていない場合、CronJob の詳細を確認

kubectl describe cj scale-in -n pra1

✅Podのログを確認

kubectl logs <CronJobによって作成されたPodの名前> -n pra1

以下のようなエラーが出ている場合、RBAC の設定を見直す!

Error from server (Forbidden): deployments.apps "deploy" is forbidden: User "system:serviceaccount:pra1:cron-sa" cannot patch resource "deployments/scale" in API group "apps" in the namespace "pra2"

📌まとめ

CronJob を使えば Deployment の自動スケールインが可能!
✅ RBAC 設定で ServiceAccount に適切な権限を付与する!
kubectl logskubectl describe を活用してデバッグ!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?