はじめに
前回は、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,veleroHookの活用
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)に格納される
- ラベルセレクタや除外設定により、必要なリソースだけを柔軟に管理できる
次回は、今回取得したバックアップからのリストアについて深掘りしていきます。


