## 実行例
$ 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
1. S3互換オブジェクトストア
MinIO を利用してS3互換のObject Storeを準備しています。
2. 準備しているオブジェクト
互いに干渉することがないように、次のように構成されています。
-
Bucket(バケット)を自由に作成することはできません。ユーザー名をキーとして、"username-bucket"のネーミングルールで作成されています。
-
これらを利用するための、情報(AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEYに相当する情報)は各ユーザーnamespaceのsecret/objectstoreに格納しています。
-
ゼミ室内部のネットワークからWebブラウザを通して自分のBucketを確認、操作することができます。
Username(key)とPassword(secret)は次の要領で確認してください。
実際には、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に保存されています。
以上