SB C&Sの最新技術情報 発信サイト

C&S ENGINEER VOICE

SB C&S

Tanzu Mission ControlのData Protection利用手順

VMware
2023.10.25

こんにちは。SB C&Sの村上です。

この記事ではTanzu Mission Control(TMC)のData Protection機能を用いて、Kubernetes上のPersistentVolume(PV)のバックアップからリストアを実施するまでの手順についてご紹介します。

TMCではData ProtectionというKubernetes上のデータのバックアップを行う機能が提供されています。
Kubernetes環境では、Podの頻繁な作成と削除をすることが一般的ですが、PVのようなデータの保持が必要なものに関してはバックアップを考慮する必要があります。
そのようなPVのバックアップをTMCの管理コンソール上での操作で実現できる機能として、Data Protectionを用いることができます。

なお、現在TMCのData Protection機能では以下2種類のバックアップ手法が提供されています。

バックアップ手法 概要 対応環境
File System Backup(FSB) - ファイルシステム単位でデータをバックアップ
- 簡易的に実行可能
TKG, EKS, AKS
Container Storage Interface (CSI) Volume Snapshot - ボリューム単位でデータをバックアップ
- データの一貫性を保つのに優れている
- 専用のストレージプラグインが必要
EKS, AKS

本記事ではAmazon Elastic Kubernetes Service (EKS)上で稼働しているMySQLをターゲットとして、Data Protectionの機能を実施してみます。

環境情報

本手順ではTMCで2台のEKSが管理対象として登録済みの状態から進めます。
TMCでのEKS作成に関しては以下をご参照ください。
Tanzu Mission ControlでEKSのライフサイクル管理

本手順実施前の環境イメージは以下となります。
赤枠の箇所は本手順上で作成していきます。

TMC_DP_0_1.png

本手順実施後の完成イメージは以下となります。
eks-1のMySQLのリソースをバックアップして、eks-2にリストアが実施できた状態となります。

TMC_DP_0_2.png

1. Target Locationの作成

Data Protection機能の利用にあたり、バックアップ先の情報をクラスタに登録する必要があります。
TMCではTarget Locationという機能にてその点を担っているため、あらかじめ作成をしておきます。

1.1 Credentialの作成

まずバックアップ先をTMC上に登録します。
TMCでは以下3つのバックアップ先が登録でき、今回はEKSを用いるためAmazon Simple Storage Service(S3)で進めます。
なお、S3に関してはTMC上から作成できるため、AWSでは事前に作成せずに進めます。

  • AWS S3
  • AWS S3互換ストレージ(MinIO等)
  • Azure Blob

TMCにアクセスを行い、[Administration]-[Accounts]-[CREATE CREDENTIAL]-[AWS S3]を選択します。

TMC_DP_1_1.png


Credentialの作成画面が表示されます。
Credential nameは以下パラメータを入力して、[GENERATE TEMPLATE]をクリックします。

  • Credential name: s3-provisioned-by-tmc

s3-provisioned-by-tmc.templateというファイルがダウンロードされたことを確認したら、[NEXT]をクリックします。

TMC_DP_1_2.png


AWS Configurationでは先ほどダウンロードされたtemplateファイルをAWSに適用するよう案内がされています。

TMC_DP_1_3.png


AWSマネジメントコンソールでCloudFormationにアクセスをし、[スタックの作成]をクリックします。

TMC_DP_1_4.png


スタックの作成画面が表示されます。
[テンプレートファイルのアップロード]を選択し、[ファイルの選択]をクリックしてtemplateファイルのアップロードを行い、[次へ]をクリックします。

TMC_DP_1_5.png


スタックの詳細指定では以下パラメータを入力して[次へ]を選択します。

  • スタック名: cf-s3-provisioned-by-tmc

TMC_DP_1_6.png


スタックオプションの設定は何も変更せず、[次へ]をクリックします。

TMC_DP_1_7.png


レビュー画面が表示されるため設定を確認後、画面下部の承認のチェックボックスにチェックを入れ、[送信]をクリックします。

TMC_DP_1_8.png


作成完了後、[出力]タブに表示されているAmazon Resource Name(ARN)の情報をメモしておきます。

TMC_DP_1_9.png


TMCに戻り、AWS Configurationで[NEXT]をクリックするとARNの入力画面が表示されます。
先ほどメモをしたARNの情報を入力して[CREATE]をクリックします。

TMC_DP_1_10.png


StatusがCreatedになっていたら完了となります。

TMC_DP_1_11.png

1.2 Target Locationの作成

作成したCredentialをクラスタに割り当てるためのTarget Locationの作成を行います。

[Administration]-[Target locations]-[CREATE TARGET LOCATION]-[AWS S3]を選択します。

TMC_DP_1_12.png


Target Locationの作成画面が表示されます。
Credentialは先ほど作成した[s3-provisoned-by-tmc]を選択して、[NEXT]をクリックします。

TMC_DP_1_13.png


Assign Clustersでは適用するクラスタの指定を行います。
[SELECT CLUSTERS]をクリックして、今回利用する「eks-1」「eks-2」を選択して[NEXT]をクリックします。

TMC_DP_1_14.png


最後にNameに「s3-target-location」を入力して[CREATE]をクリックします。

TMC_DP_1_15.png


作成完了後[Clusters]列に選択したクラスタが反映されていれば完了となります。

TMC_DP_1_16.png


以上でバックアップ先の準備が整いました。
補足として、AWS S3として登録はされていますが、バックアップ種別によってはAmazon EBSなども使われます。

TMC_DP_0_3.png

2. リソースの準備

この後の手順にてバックアップを行う際に対象とするリソース等の準備を行います。
本手順では以下を準備します。

項目 目的
MySQLデプロイ(pod, svc, pv, pvc) 今回バックアップの対象とするリソース
Adminer(pod, svc)デプロイ MySQLのGUIツールとして利用
MySQLにデータ作成 データのバックアップが動作していることの確認用


※本章は「eks-1」のKubernetesクラスタにアクセスして操作を行っております

2.1 MySQLデプロイ

以下コマンドでMySQL用に「mysql」というnamespaceを作成します。

$ kubectl create namespace mysql

続いてMySQLの各リソースをデプロイするために以下のようなマニフェストを用意します。
※ Deploymentで指定している「value: test_pass」はMySQLのrootパスワードです
※ PVCで指定している「storageClassName: gp2」はEKSでデフォルトで用意されているStorageClassです

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:latest
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: test_pass
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: gp2
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
  type: ClusterIP

以下コマンドで作成したマニフェストをapplyします。

$ kubectl apply -f mysql_resources.yaml -n mysql

apply 完了後、以下コマンドで各リソースが作成されていることを確認します。

$ kubectl get pods,svc,pv,pvc -n mysql

## 出力 NAME                                    READY   STATUS    RESTARTS   AGE pod/mysql-deployment-55f78f5756-h72tm   1/1     Running   0          12s NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE service/mysql-service   ClusterIP   10.100.119.142   ZnoneZ        3306/TCP   12s NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE persistentvolume/pvc-f07b4789-91c5-4225-b1c4-28ef62b8ba1e   1Gi        RWO            Delete           Bound    mysql/mysql-pv-claim   gp2                     7s NAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE persistentvolumeclaim/mysql-pv-claim   Bound    pvc-f07b4789-91c5-4225-b1c4-28ef62b8ba1e   1Gi        RWO            gp2            12s

2.2 Adminerデプロイ

続いてMySQLをGUIから接続して操作できるようにAdminerのデプロイを行います。

以下コマンドでAdminer用に「adminer」というnamespaceを作成します。

$ kubectl create namespace adminer

以下コマンドで作成したAdminerのデプロイを行います。

$ kubectl create deployment --image=adminer:latest adminer -n adminer
$ kubectl create service loadbalancer adminer --tcp=8080:8080 -n adminer

以下コマンドで各リソースが作成されていることを確認します。

$ kubectl get pod,svc -n adminer

## 出力 NAME                           READY   STATUS    RESTARTS   AGE pod/adminer-6b85794986-nmh4d   1/1     Running   0          13s NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)          AGE service/adminer   LoadBalancer   10.100.218.14   {〇〇〇〇}   8080:32356/TCP   12s

EXTERNAL IPの8080ポートにブラウザから接続を行うとAdminerのGUIが表示されることが確認できます。

TMC_DP_9_1.png

2.3 MySQLにデータを挿入

最後にAdminerからMySQLに接続を行い、データの挿入を行っておきます。

Adminerのログイン画面に以下パラメータを入力して[ログイン]をクリックします。

  • サーバ: mysql-service.mysql.svc.cluster.local
  • ユーザ名: root
  • パスワード: test_pass

TMC_DP_9_2.png


左メニューの[SQLコマンド]をクリックして、SQLコマンドのエディタを開きます。

TMC_DP_9_3.png


サンプルデータとして以下SQLを入力して[実行]をクリックします。

CREATE DATABASE tmc_dp_test;
CREATE TABLE tmc_dp_test.users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL
);
INSERT INTO tmc_dp_test.users (name) VALUES ('taro'), ('jiro');

実行完了後以下のようにデータが追加されていることを確認します。

TMC_DP_9_4.png


以上でeks-1上にバックアップ用のMySQLの準備ができました。
また、MySQLをGUIで操作するためのツールとしてAdminerも合わせてデプロイが完了しています。

TMC_DP_0_7.png

3. バックアップ & リストア(FSB)

先ほど用意したMySQLに対してFSBを用いてバックアップとリストアを実施します。

3.1 Data Protectionの有効化(FSB)

TMCでeks1の管理画面を開き、[ENABLE DATA PROTECTION]をクリックします。

TMC_DP_3_1.png


表示されたポップアップ画面にて[Enable FSB for volume backup]のみ選択して、[ENABLE]をクリックします。

TMC_DP_9_5.png


リストア先でも有効化が必要なため、eks-2でも同様の手順を実施しておきます。

それぞれ有効化が完了すると新しく[Data Protection]タブが表示されるようになります。

TMC_DP_3_3.png

3.2 バックアップの作成

eks-1クラスタの[Data Protection]-[CREATE BACKUP]をクリックします。

TMC_DP_3_4.png


バックアップの作成画面が表示されます。
バックアップ対象の選択を求められるため、以下のように[mysql]のnamespaceを選択して[NEXT]をクリックします。

  • Back up Kubernetes resources
    • ラジオボタン: Back up selected namespaces
    • チェックボックス: mysql

TMC_DP_3_5.png


How to backup volumesではバックアップ手法の選択を行います。
今回は変更をせずに[NEXT]をクリックします。

TMC_DP_3_6.png


Where to store the backupではバックアップ先の選択を行います。
前手順にて作成しておいたTarget Locationの[s3-target-location]を選択して[NEXT]をクリックします。

TMC_DP_3_7.png


Where to backupは、変更せずに[NEXT]をクリックします。

TMC_DP_3_8.png


Back up retentionも、変更せずに[NEXT]をクリックします。

TMC_DP_3_9.png


最後にNameに[eks-fsb-mysql-1]を入力して[CREATE]をクリックします。

TMC_DP_3_10.png


作成が完了すると[Data protection]タブ内の[Backups]に表示されます。

TMC_DP_3_11.png


中身を確認すると、バックアップされたPVの容量等も確認できます。

TMC_DP_3_12.png

3.3 リストアの実施

最後にeks-1でバックアップしたMySQLをeks-2へリストアします。

eks-2の[Data protection]-[RESTORE FROM ANOTHER CLUSTER]をクリックします。

TMC_DP_3_13.png


リストアの設定画面が表示されます。
Select backup to restoreでは以下パラメータを選択して[NEXT]をクリックします。

  • Select a cluster: eks.eks-credential.ap-northeast-1.eks-1
  • Choose a backup from the list below: eks-fsb-mysql-1

TMC_DP_3_14.png


What Kubernetes resources to restoreは、変更せずに[NEXT]をクリックします。

TMC_DP_3_15.png


What volumes to restoreも、変更せずに[NEXT]をクリックします。

TMC_DP_3_16.png

最後にNameに[eks-fsb-mysql-1]を入力して[RESTORE]をクリックします。

TMC_DP_3_17.png


完了すると[Data protection]タブ内の[Restores]に表示されます。

TMC_DP_3_18.png

3.4 リストアされたデータの確認

最後にリストアされたデータを確認していきます。

eks-2に対して以下コマンドを実行して、バックアップしたMySQLのリソースが作成されていることを確認します。

$ kubectl get pods,svc,pv,pvc -n mysql
   ## 出力 NAME                                    READY   STATUS    RESTARTS   AGE pod/mysql-deployment-55f78f5756-h72tm   1/1     Running   0          6m17s NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE service/mysql-service   ClusterIP   10.100.215.189   <none>        3306/TCP   6m16s NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE persistentvolume/pvc-974171c1-0d9d-4be0-b260-e1be8f761c43   1Gi        RWO            Delete           Bound    mysql/mysql-pv-claim   gp2                     6m13s NAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE persistentvolumeclaim/mysql-pv-claim   Bound    pvc-974171c1-0d9d-4be0-b260-e1be8f761c43   1Gi        RWO            gp2            6m17s


MySQL内のデータを確認するため、eks-1と同様の手順でAdminerをデプロイしてログインまで実施します。

TMC_DP_9_6.png


[tmc_dp_test]-[users]-[データ]にアクセスして確認すると無事にMySQL内のデータもリストアされていることが確認できました。

TMC_DP_9_4.png


以上でFSBを用いてのバックアップ&リストアを確認できました。
eks-1に作成していたMySQLをPV含めた形でeks-2にも適用することができました。

TMC_DP_0_4.png

4. CSIの準備

続いてCSIを用いたバックアップを実施するための準備を行います。
CSIを利用するためにはCSIドライバーの導入やSnapshotterの導入、CSIドライバーを用いたPVが必要などいくつか条件があります。
今回利用するEKSにおいては初めからAmazon EBS CSIドライバーがあるため、それ以外の各必要な準備を進めていきます。

4.1 CSI Snapshotterの導入

OSSとして提供されているCSI Snapshotterの導入を行います。
※ 本手順では各リソースの説明を省略するため、詳細は以下公式GitHubをご参照ください
https://github.com/kubernetes-csi/external-snapshotter/tree/master

以下コマンドを「eks-1」「eks-2」に対して実行してSnapshotterの導入を完了させます。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml

以下マニフェストを作成して「eks-1」「eks-2」にapply します。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: ebs-snapshot-class
  labels:
    velero.io/csi-volumesnapshot-class: "true"
driver: ebs.csi.aws.com
deletionPolicy: Delete

4.2 StorageClassの作成

CSIドライバーを用いたPV作成にあたり、StorageClassを新しく作成する必要があります。

CSIドライバーを指定した以下マニフェストを作成して「eks-1」「eks-2」にapplyします。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-csi-sc
allowVolumeExpansion: true
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
parameters:
  type: gp2

4.3 MySQLの再デプロイ

新しく作成したStorageClassを用いてPVを作成するために、MySQLを再デプロイします。

まず「eks-1」「eks-2」で以下コマンドを実行して既存MySQLリソースを削除します。
※ eks-2に関しては後ほどリストアをするため、このタイミングで合わせて削除

$ kubectl delete -f mysql_resources.yaml -n mysql

続いて手順2.1で使用したmysql_resources.yaml内のPVCの以下パラメータを変更します。

変更前: storageClassName: gp2
変更後: storageClassName: ebs-csi-sc

最後に変更したmysql.yamlを「eks-1」にapplyします。

$ kubectl apply -f mysql_resources.yaml -n mysql

以下コマンドで作成されたPVのStorageClassが作成したものになっていることを確認します。

$ kubectl get pv

## 出力 NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE pvc-0b2a6b8b-8314-416d-b4e4-374193916125   1Gi        RWO            Delete           Bound    mysql/mysql-pv-claim   ebs-csi-sc              2m39s

最後に再デプロイをしなおしたため、Adminerから前手順と同様にSQLを用いてデータの挿入を完了しておきます。

TMC_DP_9_4.png


以上でCSIのバックアップに対応したEKSの準備ができました。

TMC_DP_0_5.png

5. バックアップ & リストア(CSI)

EKS側のCSIの準備が完了したため、TMCからバックアップとリストアの実施を行います。

5.1 DataProtectionの有効化(CSI)

eks-1とeks-2ともに、Data protectionタブにてFSBを[DISABLE]、CSIを[ENABLE]をクリックしておきます。

TMC_DP_5_1.png

5.2 バックアップの作成

バックアップの作成を行います。
基本的にはFSBと同様な手順のため、差分がある1か所のみここでは紹介します。

How to backup volumesの設定にて今回はCSIを用いるため、
[Use CSI snapshot backup for persistent volumes]にチェックを入れる必要があります。

TMC_DP_5_2.png


上記1点以外は本手順上では同じため、Nameを[eks-csi-mysql-1]にして作成します。
作成が完了後確認すると、Volume BackupがCSI snapshotになっていることが確認できます。

TMC_DP_5_3.png

5.3 リストアの実施

リストアの実施をします。
こちらも基本的にはFSBと同様な手順のため、差分がある1か所のみここでは紹介します。

What volumes to restoreの設定にて今回はCSIを用いるため、
[Restore persistent volume using CSI snapshot]にチェックを入れる必要があります。

TMC_DP_5_4.png


上記1点以外は本手順上では同じため、Nameを[eks-csi-mysql-1]にして作成します。
作成が完了後確認すると、VolumeRestoreがFile system and CSI snapshotになっていることが確認できます。

TMC_DP_5_5.png


最後にAdminerからMySQLのデータを確認して、無事リストアされていれば完了となります。

TMC_DP_9_4.png


以上でCSIを用いたバックアップ&リストアを確認できました。
CSIでもFSBと同様にPVを含めた形でリストアまで完了できました。

TMC_DP_0_6.png

完成図

本手順完了時の構成イメージは以下となります。
AWS上にTMCからバックアップ先が新しく用意され、その認証情報はTMC上で持っている形となります。そしてData Protectionを有効化したEKSからバックアップ&リストアが実施できるようになっています。
また、EKSはCSIに対応できるようにしたため、現在TMCで利用可能な2種のバックアップどちらでも実施ができる形となりました。

TMC_DP_0_2.png

まとめ

今回はTMCのData Protectionを用いてPV含めたバックアップ&リストアを実施しました。準備段階さえ完了してしまえば実際にバックアップ&リストアを実施するのはTMC上から簡易的に実施できます。
TMCを用いれば、PVのバックアップ&リストアをクラスタ間で行う場合も1つのGUIを用いて実施できます。そして管理コンソールから複数クラスタのバックアップ状況を確認できることも、大きなメリットかと思われます。

他のおすすめ記事はこちら

著者紹介

SB C&S株式会社
ICT事業本部 技術本部 技術統括部
第1技術部 1課
村上 正弥 - Seiya.Murakami -

VMware vExpert