Veleroのインストールと基本設定

はじめに

前回は、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/

https://velero.io/docs/v1.17/contributions/minio/

https://velero.io/docs/v1.17/file-system-backup/

 

 

 

 

 

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

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

0人がこの投稿は役に立ったと言っています。

コメントを残す

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