MinIO(1) 概要とRookを使ったデプロイ方法

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

昨日までの4日間はRook v1.1からストレージ・プロバイダに追加されたYugaByteDBについて、概要からインストール方法、簡単な利用方法を投稿してきました。
今日からは3つ目のストレージ・プロバイダ**MinIO**を取り上げます。

今回の「RookだらけのAdvent Calender」は3人で執筆をする予定なのですが、プロバイダ別に担当が分かれています。中でもStableなCephとEdgeFSは機能も多いため必然的に検証のボリュームが膨らみ、非常に大変です。

Cephはウツボさんが8連投してくれましたが、肩がもげそうとのことでした。この後、EdgeFSで登板してくれるmakotowさんのために、私ももう少し頑張りたいと思います。

# MinIOとは
[こちら](https://github.com/minio/minio/blob/master/README.md)にプロジェクト概要が記載されていますが、MinIOはS3互換のAPIを持つ、高性能な<font color="red">**オブジェクトストレージ**</font>でMLやデータ分析基盤の構築に有用と書かれています。

ある方に教えて頂いた[こちらの記事](https://searchstorage.techtarget.com/blog/Storage-Soup/Minio-prepares-new-object-storage-dish-for-2019?amp=1&__twitter_impression=true)も現在MinIOが目指す未来として参考になります。HadoopやPureStorageのFlashBladeと競合関係にあるのは成る程といった所です。

### オブジェクトストレージとは
ここまでMinIOが目指す姿を説明してきましたが、そもそもオブジェクトストレージとは何でしょうか。少し古い記事ですが、[こちら](https://www.atmarkit.co.jp/ait/articles/1705/29/news014_4.html)には以下のように特徴が記載されています。

- Webネイティブ・・・REST APIを使ってHTTPプロトコルでアクセスされる
- 分散ストレージ
- スケールアウトが可能
- 止まらないシステム＝高い可用性

代表的なオブジェクトストレージはAWSが提供する**S3**です。現在世の中にあるオブジェクトストレージの殆どはS3互換のAPI提供を謳っています。

### どうでも良い話題
さて、このMinIOですがどのように読むのが正しいのでしょうか？
私も分からなかったので、Twitterで質問してみました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">It should be spelled &quot;Min-I-O&quot; as in Minimal IO, so &quot;Min&quot; + &quot;IO&quot; is the correct pronunciation</p>&mdash; Daniel Valdivia (@dvaldivia) <a href="https://twitter.com/dvaldivia/status/1205557806310363137?ref_src=twsrc%5Etfw">December 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ほうほう、綴りも最初のMが大文字、IOも大文字、そして「**ミン・アイオー**」と呼ぶのが正しそうですね。
覚えましたか？おそらく、これが当ポストのもっとも役に立つ内容です。

# Rookを使ったMinIOのインストール
YugaByteDBの際と同様に、Rook公式のquick-startにならってMinIOをインストールしていきます。
やり方は非常にシンプルでoperator.yamlをaopplyするだけです。
その際にNamespaceとしてrook-minio-systemが切られますので、Podの状況も確認してきます。

```shell
# operator.yamlのapply
$ kubectl apply -f cluster/examples/kubernetes/minio/operator.yaml

# podの確認
$ kubectl get pod -n rook-minio-system
NAME                                   READY   STATUS    RESTARTS   AGE
rook-minio-operator-5c569f6f5c-zrwh5   1/1     Running   0          1h
```

さらにMinIOのObjectStoreを構築していきます。しかし、その前にgithub上で取得できる[こちらのYAML](https://github.com/rook/rook/blob/master/cluster/examples/kubernetes/minio/object-store.yaml)を色々と修正する必要があります。

具体的には以下の2点を修正します。

1. volumeClaimTemplatesのrook-minio-data1のStorageClassのコメントを外し、存在するStorageClassに修正（修正しない場合、デフォルトのストレージクラスが使われる）
2. volumeClaimTemplatesのrook-minio-data2の全体のコメントを外し、既存のStorageClass名に修正


```YAML:修正後のYAML（例）
    volumeClaimTemplates:
    - metadata:
        name: rook-minio-data1
      spec:
        accessModes: [ "ReadWriteOnce" ]
        # Set the storage class that will be used, otherwise Kubernetes' default storage class will be used.
        storageClassName: "standard"
        resources:
          requests:
            storage: "8Gi"
    - metadata:
        name: rook-minio-data2
      spec:
        accessModes: [ "ReadWriteOnce" ]
    #    # Uncomment and specify your StorageClass, otherwise
    #    # the cluster admin defined default StorageClass will be used.
        storageClassName: "standard"
        resources:
          requests:
            storage: "8Gi"
```

詳細が確認出来ていませんが、MinIOの各Podが2つのPVを要求するために上記の修正が必要となります。
修正が済んだら、object-store.yamlをapplyします。

```shell
# operator.yamlのapply
$ kubectl apply -f cluster/examples/kubernetes/minio/object-store.yaml

# objectstore作成後のpod確認
$ kubectl get pod -n rook-minio
NAME         READY   STATUS    RESTARTS   AGE
my-store-0   1/1     Running   4          4m10s
my-store-1   1/1     Running   3          3m31s
my-store-2   1/1     Running   2          2m51s
my-store-3   1/1     Running   1          2m
```

## 接続確認
ObjectStoreが構築できたら、MinIOのUIにアクセスしてみます。先ほどの[quick-start](https://rook.io/docs/rook/v1.1/minio-object-store.html)からアクセス方法を確認し接続すると以下のような画面が表示され、アクセス成功です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54853/416df594-01ed-e88d-3ee7-d2a7c98e4468.png)

AccessKeyとSecretKeyは先ほどのobject-store.yaml内に記述されていますので（これ本当はダメですね）、それでログインが出来ます。

# まとめ
本日はCeph、YugaByteDBに続く3つ目のストレージ・プロバイダMinIOの概要とRookによるインストールを試してみました。

明日は実際にMinIOを使っていきたいと思います。

よろしくお願いします。