[ 言語選択: English ]

1. S3互換オブジェクトストア

MinIO を利用してS3互換のObject Storeを準備しています。

1.1. 参考資料

MinIOのObject Storeの基本的な使い方は下記ドキュメントを参照してください。

2. 準備しているオブジェクト

互いに干渉することがないように、次のように構成されています。

  1. Bucket(バケット)を自由に作成することはできません。ユーザー名をキーとして、"username-bucket"のネーミングルールで作成されています。

  2. これらを利用するための、情報(AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEYに相当する情報)は各ユーザーnamespaceのsecret/objectstoreに格納しています。

  3. ゼミ室内部のネットワークからWebブラウザを通して自分のBucketを確認、操作することができます。

Username(key)とPassword(secret)は次の要領で確認してください。

## 実行例
$ kubectl -n $(id -un) get secret objectstore -o=jsonpath="{.items[0]}{.data.access-key}" | base64 --decode ; echo
$ kubectl -n $(id -un) get secret objectstore -o=jsonpath="{.items[0]}{.data.secret-access-key}" | base64 --decode ; echo

実際には、YAMLファイルの中で環境変数として設定して利用します。

Kubernetes上で動作するアプリケーションは、KeyとSecretの情報に加えて以下の情報を元にMinIOにアクセスすることができるようになります。

  • ホスト名 sccp-minio-svc.minio.svc.cluster.local

  • ポート番号 9000

3. 動作確認 mcコマンドの利用

MinIOにアクセスするための専用クライアントが"mc"コマンドです。

しかし直接サーバーにアクセスすることができません。

まずmcコマンドを実行するためのpodを準備してから作業を進めます。

3.1. docker.io/yasuhiroabe/minio-toolbox:latest コンテナの実行

作業用のディレクトリを作成し、次のような内容の適当な名前のYAMLファイルを準備します。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes: [ "ReadWriteOnce" ]
  storageClassName: rook-ceph-block
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio-toolbox
  labels:
    app: minio-toolbox
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: minio-toolbox
  template:
    metadata:
      labels:
        app: minio-toolbox
    spec:
      containers:
      - name: minio-toolbox
        image: yasuhiroabe/minio-toolbox:latest
        command: ["sh","-c", "tail -f /dev/null"]
        imagePullPolicy: "Always"
        env:
        - name: AWS_HOST
          valueFrom:
            secretKeyRef:
              key: aws-host
              name: objectstore
        - name: AWS_ENDPOINT
          value: sccp-minio-svc.minio.svc.cluster.local:9000
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              key: access-key
              name: objectstore
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: secret-access-key
              name: objectstore
        volumeMounts:
        - name: data
          mountPath: /root
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-pvc
## 実行例
$ kubectl -n $(id -un) apply -f objectstore.pvc-minio-toolbox.yaml
$ kubectl -n $(id -un) apply -f objectstore.deploy-minio-toolbox.yaml

PodがRunning状態になっている事を確認します。

$ kubectl -n $(id -un) get pod -l app=minio-toolbox
NAME                             READY   STATUS    RESTARTS   AGE
minio-toolbox-854bf65b47-5ghwt   1/1     Running   0          20s

3.2. minio-toolbox内部からのコマンドの実行

まず次のコマンドを実行し、pod/minio-toolbox-* の中に入ります。 指定するPod名は、前述のkubectl -n $(id -un) getコマンドの出力を確認してください。

$ kubectl -n $(id -un) exec -it $(kubectl -n $(id -un) get pod -l app=minio-toolbox -o jsonpath='{.items[*].metadata.name}') -- bash

execコマンドに成功し、プロンプトがbash-5.1# に変化したことを確認してから、次のようにmcコマンドを実行し、接続情報を ~/.mc/config.json ファイルに書き込みます。

bash-5.1# ./mc alias set minio http://${AWS_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY}

このコマンドを実行すると、次のようなメッセージが出力されます。

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 `minio` successfully.

また、/root/.mc/config.json の中に "minio" エントリが作成され、接続に必要な情報が登録されます。 全ての情報が正しいと、次のようなコマンドで、自分のBucketが表示されるはずです。

## 実行例
bash-5.1# ./mc ls minio
[2021-08-31 02:38:04 UTC]     0B yasu-abe-bucket/

このように自分のID名がついたbucket名が表示されれば、mcコマンドを通じて、ファイルの操作が可能になります。

以下では、s13xxxxx-bucket の部分は、自分のID名+"-bucket" と読み替えてください。

3.3. ファイルの配置

Podの中にあるファイルは次のようなコマンドで、Bucket内に保存できます。

bash-5.1# ./mc cp /etc/hosts minio/s13xxxxx-bucket/etc.hosts

配置したファイルの確認は次のコマンドで可能です。

bash-5.1# ./mc ls -r minio

あるいはWebブラウザからもファイルの配置を確認することができます。

3.4. ファイルの移動

次の要領でファイルの名前を変更できます。

bash-5.1# ./mc mv minio/s13xxxxx-bucket/etc.hosts minio/s13xxxxx-bucket/local.etc.hosts

3.5. ファイルの削除

不要になったファイルは次の要領で削除することができます。

bash-5.1# ./mc rm minio/s13xxxxx-bucket/local.etc.hosts

もしs13xxxxx-bucketが消えてしまった場合は次の要領で新しいbucketを作成することができます。

4. restic

resticはS3 Object Storeにバックアップを取得するためのGo言語で開発されたコマンドです。 指定したディレクトリのバックアップをBucket上に暗号化した上で配置します。

4.1. resticコマンドによるバックアップの取得

minio-toolboxにはresticが含まれています。

$ kubectl -n $(id -un) exec -it $(kubectl -n $(id -un) get pod -l app=minio-toolbox -o jsonpath='{.items[*].metadata.name}') -- bash

4.2. resticコマンドの初期化作業

新規にバケットを作成するための初期化を行ないます。

resticには新しく準備したパスワードを入力します。 MinIOのSecretやAINS IDなどのパスワードを入力してはいけません。

bash-5.1# restic -r s3:http://${AWS_ENDPOINT}/s13xxxxx-bucket init

4.3. バックアップを取得する

例えば/rootディレクトリ全体のバックアップを取得するコマンドは、次ようになります。パスワードの入力が求められるので、初期化時に指定したパスワードを指定します。

bash-5.0# restic -r s3:http://${AWS_ENDPOINT}/s13xxxxx-bucket backup /root

4.4. バックアップの確認

**restic snapshots*コマンドを利用し、バックアップの取得状況を確認します。

bash-5.0# restic -r s3:http://${AWS_ENDPOINT}/s13xxxxx-bucket snapshots
enter password for repository:
repository 3336ca97 opened (version 2, compression level auto)
ID        Time                 Host                            Tags        Paths
--------------------------------------------------------------------------------
6f0e5787  2023-09-28 08:08:25  minio-toolbox-5ddbd75f6d-fffdd              /root
--------------------------------------------------------------------------------
1 snapshots

4.5. バックアップの復元(リストア)

適当なディレクトリを指定して、バックアップを復元します。

6f0e5787の部分は、前述のsnapshotsで確認した際のIDが入るので、適切な値に変更してください。

bash-5.0# restic -r s3:http://${AWS_ENDPOINT}/s13xxxxx-bucket restore 6f0e5787 --target /tmp/restore
enter password for repository: repository d0b66304
repository d0b66304 opened successfully, password is correct
restoring <Snapshot 8ca8f7f8 of [/root] at 2020-01-23 03:40:37.544077502 +0000 UTC by root@s3ostools> to /tmp/restore

ディレクトリ全体が、/tmp/restoreに保存されています。

以上