Minio(2) Kubernetes上でのMinIO利用

この記事は「[RookだらけのAdvent Calender](https://qiita.com/advent-calendar/2019/rook)」15日目の記事です。

[昨日](https://qiita.com/tzkoba/items/5e5b8ec3f74c2809125c)は、オブジェクトストレージの概要とRookからMinIOを構成する方法について解説しました。
本日は実際にMinIOを利用し、ファイルのアップロードと確認を**Kubernetesから**行ってみます。

# MinIO with Rookの最大の問題
昨日の投稿で書いても良かったのですが、当ブログの企画後に以下の知らせが入ってきました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RookはCeph,EdgeFS,NFSなどをサポートしていますが、ろくにメンテされていないものも多々あります。それに対して最近、機能マージ後一切更新されていなかったMinioサポートを切るPRが出ました。今後もこういうことが増えるのではと推測しています<a href="https://t.co/oAdc1S9ACz">https://t.co/oAdc1S9ACz</a></p>&mdash; sat (@satoru_takeuchi) <a href="https://twitter.com/satoru_takeuchi/status/1204977688915525632?ref_src=twsrc%5Etfw">December 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

MinIOはRookにマージされたものの、[**独自のOperator開発**](https://github.com/minio/minio-operator)に注力しているようで、Rookへのコントリビューションがありません。その結果、サポートを切られるということになりそうです。
つまり、今回のRookによるMinIO構築はあと半年ほどで不可能になると予想されます。

とは言っても、今回はこのまま行きますが。

# MinIOの利用
気を取り直して、今回構築したMinIOの利用方法を確認していきましょう。

昨日、接続確認に利用したUIからバケットの作成やファイルのPUTも出来ます。
ですが、それでは今回Kubernetes上に構築した意味が薄いものとなってしまいますので、今回はmcといわれるクライアントツールをPodとしてデプロイし、そこからMinIOの操作を行ってみます。


## MCのPod起動と設定
昨日、MinIOのオブジェクトストアを作成したのと同じNamespace（rook-minio）に下記のStatefulSetをデプロイします。ここではMinIOが公式に提供しているmcのイメージを使っています。

```YAML
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mc-test
  namespace: rook-minio
  labels:
    app: mc-test
spec:
  serviceName: mc-test
  replicas: 1
  selector:
    matchLabels:
      app: mc-test
  template:
    metadata:
      labels:
        app: mc-test
    spec:
      containers:
      - image: minio/mc
        imagePullPolicy: Always
        name: mc
        command: ["/bin/sh"]
        stdin: true
        tty: true
```

Podが一つ起動しますので、そこに接続して設定作業を行います。

```shell
# mcのコンテナへ接続
kubectl exec -it -n rook-minio mc-test-0 /bin/sh

# 以降、mcのCLIを利用
# 利用前に（エンドポイントやアクセスキー、シークレットは環境に合わせること
/ mc config host add minio http://x.x.x.x ACCESS SECRET --api S3v4

# configに成功したら、server情報を確認
/ mc admin info server minio
●  my-store-0.my-store.rook-minio.svc.cluster.local:9000
   Uptime: 22 hours
  Version: 2019-04-23T23:50:36Z
  Storage: Used 60 MiB, Free 19 GiB
   Drives: 2/2 OK

   CPU        min        avg      max
   current    0.08%      0.08%    0.09%
   historic   0.03%      0.11%    9.88%

   MEM        usage
   current    68 MiB
   historic   68 MiB


●  my-store-1.my-store.rook-minio.svc.cluster.local:9000
   Uptime: 22 hours
  Version: 2019-04-23T23:50:36Z
  Storage: Used 60 MiB, Free 19 GiB
   Drives: 2/2 OK

   CPU        min        avg      max
   current    0.08%      0.08%    0.09%
   historic   0.03%      0.11%    10.42%

   MEM        usage
   current    68 MiB
   historic   68 MiB


●  my-store-2.my-store.rook-minio.svc.cluster.local:9000
   Uptime: 22 hours
  Version: 2019-04-23T23:50:36Z
  Storage: Used 60 MiB, Free 19 GiB
   Drives: 2/2 OK

   CPU        min        avg      max
   current    0.11%      0.12%    0.12%
   historic   0.03%      0.12%    9.98%

   MEM        usage
   current    68 MiB
   historic   68 MiB


●  my-store-3.my-store.rook-minio.svc.cluster.local:9000
   Uptime: 13 hours
  Version: 2019-04-23T23:50:36Z
  Storage: Used 60 MiB, Free 19 GiB
   Drives: 2/2 OK

   CPU        min        avg      max
   current    0.09%      0.10%    0.12%
   historic   0.03%      0.11%    9.48%

   MEM        usage
   current    68 MiB
   historic   68 MiB
```

昨日のKubernetesのPodと同様に4つのMinioサーバが起動していることが確認できます。
なお、mc configコマンドの詳細は[こちら](https://docs.min.io/docs/minio-client-complete-guide.html#config)で確認下さい。

## MCからバケット作成とファイル操作
[mcコマンド](https://docs.min.io/docs/minio-client-complete-guide.htm)により、MinIOをUNIXライクなコマンドから利用することができます。

では、実際にバケットの作成と確認をしてみましょう。

```shell
# バケットtestbをmbコマンドで作成
/ mc mb minio/testb
Bucket created successfully `minio/testb`.

# lsコマンドでバケットを確認
/ mc ls minio
[2019-12-15 13:16:26 UTC]      0B testb/

# 作成したtestbバケットへ/etc/os-releaseをcpコマンドでコピー
/ mc cp etc/os-release minio/testb
etc/os-release:           164 B / 164 B xaaaaaaaaaaaaax 100.00% 4.19 KiB/s 0s

# testbバケットの内容を確認
/ mc ls minio/testb
[2019-12-15 13:24:48 UTC]    164B os-release

# catコマンドでtestbにコピーしたファイルの内容を確認
/ mc cat minio/testb/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.10.2
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
```

## 実際の運用では
mcコマンドをアプリケーションコンテナに同梱する、またはサイドカーとして起動することでここまで書いたように**mc cp**などのシンプルなコマンドでバックアップをMinIOに取ることができます。

また、[**mc mirror**](https://docs.min.io/docs/minio-client-complete-guide.html#mirror)コマンドを使うことでrsyncのようにオブジェクトストレージへ定期的な退避を行うことも出来ます。

こうしたシンプルなバックアップ運用が出来ることがMinIOの魅力と言えるでしょう。

# まとめ
2回にわたり、RookによるMinIOの構築および利用について解説をしてきました。

残念ながら、MinIOはRookプロジェクトから外れる可能性が高いのですが、シンプルなオブジェクトストレージの学習・検証などには現時点で有用というのが私個人の感想です。

よろしくお願いします。