Velero実践:クラスターリソースのバックアップ

Japanese title slide with abstract blue and green geometric shapes; text reads 'Velo実践:クラスタ―リノースのバックアップ'

はじめに

前回は、KubernetesのバックアップツールであるVeleroのインストールと、MinIOを保存先とした初期設定について解説しました 。 前回のハンズオンが終わっていれば、環境構築が完了し、Veleroサーバーがクラスター内で正常に稼働している状態になっているかと思います。

本記事では、PersistentVolume (PV) を伴わないステートレスなアプリケーションを対象に、クラスターリソース(Kubernetesオブジェクトの定義)のバックアップ手順を解説します。 PVを含むステートフルなデータのバックアップについては、次回以降の記事で詳しく取り扱う予定です。

環境構築の前提

本手順は、前回の記事で構築した以下の環境が動作していることを前提とします。

  • Kubernetesクラスター: Minikube (v1.36.0) が起動中であること 
  • Velero: v1.17.1 がインストール済みで、MinIOへの接続設定が完了していること 
  • CLIツール: kubectl および velero コマンドが利用可能であること
  • MinIO: RELEASE.2025-09-07T16-13-09Zが起動中であること

バックアップ対象リソースのデプロイ

アプリケーションの作成

まずはバックアップの検証用として、Deployment、Service、ConfigMapを含むシンプルなNginxアプリケーションを作成します。今回は永続ボリューム(PV / PVC)を含まない構成とします。

demo-app.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: demo
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: demo
  labels:
    app: nginx
data:
  index.html: |
    <html>
    <head><title>Velero Demo</title></head>
    <body>
    <h1>Hello, Velero!</h1>
    <p>This is a cluster resource backup demo.</p>
    </body>
    </html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: demo
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: html-volume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: html-volume
        configMap:
          name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: demo
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

アプリケーションのデプロイと確認

次は、作成したマニフェストを適用し、リソースが作成されたことを確認します。

$ kubectl apply -f demo-app.yaml
$ kubectl get all -n demo

# 出力例
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-856dc6c76b-v6crd   1/1     Running   0          8s

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/nginx-service   ClusterIP   10.43.107.135   <none>        80/TCP    8s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   1/1     1            1           8s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-856dc6c76b   1         1         1       8s

以上でアプリケーションの準備ができたので、Veleroを使用してバックアップを取得します。

基本的なバックアップコマンドの実行

バックアップの実行

ここではNamespace内のデータをバックアップします。そのため、velero backup createコマンドに–include-namespaces オプションをつけて対象のNamespaceを指定します。

$ velero backup create demo-resource-backup --include-namespaces demo

# 出力例
Backup request "demo-resource-backup" submitted successfully.
Run `velero backup describe demo-resource-backup` or `velero backup logs demo-resource-backup` for more details.

コマンドを実行すると、「Backup request “demo-resource-backup” submitted successfully.」と表示され、バックアップ処理がバックグラウンドで開始されます。

状態の確認

バックアップが正常に完了したか確認するには velero backup describe コマンドを使用します。出力結果の Phase が Completed になっていれば成功です。

$ velero backup describe demo-resource-backup

# 出力例
Name:         demo-resource-backup
Namespace:    velero
Labels:       velero.io/storage-location=default-backup-storage-location
Annotations:  velero.io/resource-timeout=10m0s
              velero.io/source-cluster-k8s-gitversion=v1.32.3+rke2r1
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=32

Phase:  Completed
...

詳細なログを確認したい場合は、以下のコマンドを実行します。

$ velero backup logs demo-resource-backup

バックアップデータのオブジェクトストレージでの確認

Veleroが正しくMinIOへデータを保存できているか確認します。 前回の記事で作成した minio-client Pod  を使用して、バケットの中身を確認します。

$ kubectl exec -it minio-client -- /bin/sh

# バケット内のバックアップデータを確認(エイリアス 'myminio' は設定済みとする)
$ mc ls -r myminio/minio-bucket/backups/demo-resource-backup

以下のように、JSON形式のメタデータファイルや、リソース定義が含まれた圧縮ファイルが表示されれば、オブジェクトストレージへの保存は成功しています。

[202X-XX-XX XX:XX:XX UTC] 4KB velero-backup.json
[202X-XX-XX XX:XX:XX UTC] 2KB demo-resource-backup-logs.gz
[202X-XX-XX XX:XX:XX UTC] 15KB demo-resource-backup-resource-list.json.gz
…

リソースの絞り込みと除外名前空間

実運用では、Namespace丸ごとではなく、特定のリソースのみを対象にしたり、逆に特定のリソースを除外したい場面があります。

ラベルによる絞り込み

–selector オプションを使用すると、KubernetesのLabel Selectorの記法で対象を絞り込めます。

# app=nginx ラベルが付与されたリソースのみをバックアップ
$ velero backup create nginx-only --selector app=nginx --include-namespaces demo

特定リソースの除外

例えば、「Event情報は不要」といったケースで –exclude-resources を使用します。

$ velero backup create no-events --include-namespaces demo --exclude-resources events

システムNamespaceの除外

バックアップを取る際、kube-system や velero 自身を含めると、リストア時に競合等のトラブルになることがあります。これらを除外するには –exclude-namespaces を使用します。

$ velero backup create cluster-resources --exclude-namespaces kube-system,velero

Hookの活用

VeleroのHook機能を使うと、バックアップ実行の前後にコンテナ内で任意のコマンドを実行できます。今回はバックアップ実行の記録を残すシンプルな例を紹介します。

Hookは対象のPodにアノテーションを付与することで設定します。

$ kubectl annotate pod -n demo -l app=nginx \
pre.hook.backup.velero.io/command='["/bin/sh", "-c", "echo [$(date)] Backup started >> /tmp/backup.log"]' \
pre.hook.backup.velero.io/container=nginx

この設定後にバックアップを取得すると、対象Pod内の /tmp/backup.log に実行日時が記録されます。これはバックアップ処理が正しくPodにアクセスできているかの疎通確認としても利用できます。

スケジュールバックアップの設定

日次や週次など、定期的なバックアップを自動化するには velero schedule create コマンドを使用します。設定方法はLinuxのCron記法と同様ですが、デフォルトのタイムゾーンがUTCになっているため、時刻はUTCで指定する必要がある点には注意してください。

# 毎日午前3時(UTC)に demo ネームスペースをバックアップ
$ velero schedule create daily-demo --schedule="0 3 * * *" --include-namespaces demo

設定したスケジュールは以下で確認できます。

$ velero schedule get

# 出力例
NAME                   STATUS    CREATED                         SCHEDULE     BACKUP TTL   LAST BACKUP   SELECTOR   PAUSED
daily-demo             Enabled   2026-08-04 01:43:39 +0000 UTC   0 3 * * *    0s           n/a           <none>     false

スケジュールに基づいて実行されたバックアップは、daily-demo-<タイムスタンプ> という命名規則で保存されていきます。

まとめ

本記事では、PersistentVolumeを含まないクラスターリソース(Deployment、Service、ConfigMap)に焦点を当て、Veleroによるバックアップ手法を解説しました。

  • velero backup create でNamespace単位のバックアップが可能
  • バックアップデータはオブジェクトストレージ(MinIO)に格納される
  • ラベルセレクタや除外設定により、必要なリソースだけを柔軟に管理できる

次回は、今回取得したバックアップからのリストアについて深掘りしていきます。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です