はじめに
前回は、Kubernetesのリソースと永続ボリュームを包括的に保護できるVeleroについて解説しました。Veleroは、Hook機能を利用してデータベースの整合性を確保できる点や、環境に応じてスナップショットとファイルシステムバックアップを使い分けられる柔軟性が強みです。
本記事では、実際にVeleroを用いたバックアップ環境の構築手順について、インストールと初期設定に絞って解説します。今回は学習用環境としてMinikubeを使用し、バックアップ先にはS3互換ストレージであるMinIOを利用する構成を構築します。
環境構築の前提
kubectlおよびhelmがインストール済みであること
環境情報
- kubectl:v1.33.4
- minikube:v1.36.0
- helm:v4.0.4
- MinIO:RELEASE.2025-09-07T16-13-09Z
- Velero CLI:v1.17.1
- Velero:v1.17.1
Kubernetesクラスター
Veleroの機能の一つにCSI (Container Storage Interface) を利用したボリュームスナップショットがあります。今回はこれを有効化するため、Minikube起動時にアドオンとドライバを指定します。
$ minikube start --addons=volumesnapshots,csi-hostpath-driver
次に、CSIを利用するためのVolumeSnapshotClassを定義します。
VolumeSnapshotClass.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snapclass
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
labels:
velero.io/csi-volumesnapshot-class: "true" # Veleroに使わせるためのラベル
driver: hostpath.csi.k8s.io
deletionPolicy: Delete
ストレージクラスを確認し、作成したYAMLを適用します。
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-hostpath-sc hostpath.csi.k8s.io Delete Immediate false 3m33s
standard (default) k8s.io/minikube-hostpath Delete Immediate false 3m36s
$ kubectl apply -f VolumeSnapshotClass.yaml
volumesnapshotclass.snapshot.storage.k8s.io/csi-hostpath-snapclass configured
オブジェクトストレージ
Veleroはバックアップデータをオブジェクトストレージに保存します。今回はAWS S3の代わりに、Kubernetes内に「MinIO」を構築して利用します。
minio.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
labels:
app: minio
spec:
replicas: 1
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
containers:
- name: minio
image: minio/minio:latest
args:
- server
- /data
- --console-address
- :9001
env:
- name: MINIO_ROOT_USER
value: "minioadmin"
- name: MINIO_ROOT_PASSWORD
value: "minioadmin"
ports:
- containerPort: 9000
- containerPort: 9001
---
apiVersion: v1
kind: Service
metadata:
name: minio
labels:
app: minio
spec:
ports:
- port: 9000
name: api
- port: 9001
name: console
selector:
app: minio
MinIO用のNamespaceを作成し、デプロイします。
$ kubectl create namespace minio
namespace/minio created
$ kubectl apply -f minio.yaml -n minio
deployment.apps/minio created
service/minio created
MinIOが立ち上がったら、バックアップ保存用のバケット(minio-bucket)を作成します。ここではminio-clientポッドを起動して操作します。
$ kubectl run minio-client --rm -it --image=minio/mc --restart=Never --command -- /bin/sh -c "
mc alias set myminio http://minio.minio.svc:9000 minioadmin minioadmin;
mc mb myminio/minio-bucket;
mc ls myminio;
"
If you don't see a command prompt, try pressing enter.
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Added `myminio` successfully.
Bucket created successfully `myminio/minio-bucket`.
[2025-12-22 02:01:02 UTC] 0B minio-bucket/
pod "minio-client" deleted
Velero CLI(クライアント)が外部からMinIOにアクセスして情報を取得できるように、ポートフォワードを行い、設定を変更します。
$ minikube service minio --namespace=minio --url
表示されたアクセス情報(http://127.0.0.1:39783)はVelero本体のインストールで使用するため、新しいターミナルを開いて後続の手順を実施します。
例
$ minikube service minio --namespace=minio --url
😿 service minio/minio has no node port
❗ Services [minio/minio] have type "ClusterIP" not meant to be exposed, however for local development minikube allows you to access this !
http://127.0.0.1:39783
http://127.0.0.1:42827
❗ Because you are using a Docker driver on linux, the terminal needs to be open to run it.
Velero CLIのインストールと設定
Veleroを操作するためのCLIツールをローカル環境にインストールします。今回は Linux (amd64) 版のバージョンv1.17.1を使用します。
# バイナリのダウンロード
$ curl -L -o /tmp/velero.tar.gz https://github.com/vmware-tanzu/velero/releases/download/v1.17.1/velero-v1.17.1-linux-amd64.tar.gz
# 解凍
$ tar -C /tmp -xvf /tmp/velero.tar.gz
# パスが通っている場所へ移動
$ sudo mv /tmp/velero-v1.17.1-linux-amd64/velero /usr/local/bin/velero
# 実行権限の付与
$ chmod +x /usr/local/bin/velero
インストールが正常に完了したかバージョンを確認します。
$ velero version --client-only Client: Version: v1.17.1 Git commit: 94f64639cee09c5caaa65b65ab5f42175f41c101
最後に、コマンド補完を有効化しておくと便利です。
$ echo 'source <(velero completion bash)' >>~/.bashrc
オブジェクトストレージへの設定
Velero本体をインストールする前に、VeleroがオブジェクトストレージであるMinIOへアクセスするための認証情報を設定します。
オブジェクトストレージへの認証情報
AWS S3互換の認証情報ファイルを作成します。Minioの認証情報(user: minioadmin, password: minioadmin)を使用します。
credentials-velero
[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin
Velero用のNamespaceを作成し、このファイルをKubernetesのSecretとして登録します。
$ kubectl create namespace velero
namespace/velero created
$ kubectl create secret generic velero-s3-creds \
--namespace velero \
--from-file=cloud=credentials-velero
secret/velero-s3-creds created
Velero本体のインストール
準備が整いましたので、Helmを使用してVelero本体(サーバー)をクラスターにインストールします。
まずはHelmリポジトリを追加します。
$ helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
$ helm repo update
次に、インストール設定を記述したvalues.yamlを作成します。ここで、VeleroがMinIOにアクセスするために「2.2 オブジェクトストレージ」で取得した1つ目のアクセス情報(http://127.0.0.1:39783)を使用します。
今回使用するvalues.yamlでは、Minikube環境でVeleroのCSIスナップショットとファイルシステムバックアップの両方で動作させるために、以下の設定を行っています。
- MinIOはAWS S3 APIと互換性があるため、Velero純正のvelero-plugin-for-awsを初期コンテナ(initContainers)として読み込ませています。
- configuration.backupStorageLocationでは、バックアップデータの保存場所を定義します。 今回は保存先として、事前に構築した MinIOを指定しています。
- ファイルシステムバックアップを利用するために、CSIを使わずにPodのボリュームを直接ファイルコピーする機能(Node Agent)を有効化しています。Minikube環境でホストパス上のボリュームデータに確実にアクセスできるよう、Node Agentをrootユーザーで実行する設定を加えています。
values.yaml
image:
repository: velero/velero
tag: v1.17.1
pullPolicy: IfNotPresent
dnsPolicy: ClusterFirst
initContainers:
- name: velero-plugin-for-aws
image: velero/velero-plugin-for-aws:v1.13.0
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /target
name: plugins
kubectl:
image:
repository: bitnamilegacy/kubectl
tag: 1.33.4
configuration:
# CSIスナップショット機能を有効化
features: "EnableCSI"
backupStorageLocation:
- name: default-backup-storage-location
provider: "aws"
bucket: "minio-bucket" # 保存先のバケット名
default: true
accessMode: ReadWrite
config:
# クラスタ内部(Velero)から見たMinIOのURL
s3Url: http://minio.minio.svc:9000
# クラスタ外部(手元のPC)から見たMinIOのURL
#「2.2 オブジェクトストレージ」で取得した1つ目のアクセス情報(http://127.0.0.1:39783)
publicUrl: http://127.0.0.1:39783
s3ForcePathStyle: "true" # MinIOを使うための設定
region: minio
volumeSnapshotLocation: []
credentials:
useSecret: true
existingSecret: velero-s3-creds
upgradeCRDsJob:
automountServiceAccountToken: true
rbac:
create: true
clusterAdministrator: true
clusterAdministratorName: cluster-admin
serviceAccount:
server:
create: true
automountServiceAccountToken: true
backupsEnabled: true
snapshotsEnabled: true
# ファイルシステムバックアップを行うためのエージェント設定
deployNodeAgent: true
nodeAgent:
podVolumePath: /var/lib/kubelet/pods
pluginVolumePath: /var/lib/kubelet/plugins
dnsPolicy: ClusterFirst
podSecurityContext:
runAsUser: 0
livenessProbe:
httpGet:
path: /metrics
port: http-monitoring
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /metrics
port: http-monitoring
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
metrics:
enabled: true
scrapeInterval: 30s
scrapeTimeout: 10s
serviceMonitor:
autodetect: true
enabled: false
nodeAgentPodMonitor:
autodetect: true
enabled: false
prometheusRule:
autodetect: true
enabled: false
作成したvalues.yamlを指定してHelmインストールを実行します。
$ helm install velero vmware-tanzu/velero \
--namespace velero \
-f values.yaml
NAME: velero
LAST DEPLOYED: Mon Dec 22 11:15:51 2025
NAMESPACE: velero
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
NOTES:
Check that the velero is up and running:
kubectl get deployment/velero -n velero
Check that the secret has been created:
kubectl get secret/velero -n velero
Once velero server is up and running you need the client before you can use it
1. wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.1/velero-v1.17.1-darwin-amd64.tar.gz
2. tar -xvf velero-v1.17.1-darwin-amd64.tar.gz -C velero-client
More info on the official site: https://velero.io/docs
インストール完了後、Podが正常に起動しているか確認してください。
$ kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
node-agent-vntpw 1/1 Running 0 3m22s
velero-6f76558b9f-v529z 1/1 Running 0 3m22s
以上で、Veleroのインストールとオブジェクトストレージへの接続設定は完了です。これでバックアップを取得するための準備完了です。
まとめ
本記事では、KubernetesのバックアップツールであるVeleroの導入を解説しました。
minio.yamlやvalues.yamlの内容は一般的な設定を補完していますが、実際の環境に合わせて微調整が必要な場合は適宜変更してください。
次回以降はバックアップやリストアといった操作に入っていきます。実際にサンプルアプリケーションをデプロイし、バックアップを取得します。ボリュームスナップショットだけでなく、ファイルシステムバックアップも確認します。
参考文献
https://velero.io/docs/v1.17/contributions/minio/
https://velero.io/docs/v1.17/file-system-backup/
