#12 ストレージ on Kubernetesの紹介

本記事は[PostgreSQL on Kubernetes Advent Calendar 2018](https://qiita.com/advent-calendar/2018/postgresonk8s)の12日目です。
昨日は「[関連コミュニティの紹介](https://qiita.com/tzkoba/private/5a9574bc1bddced5c9df)」ということで、Kubernetes・PostgreSQLのコミュニティをいくつか紹介しました。

今日はPostgreSQL on Kubernetesの環境を構築する際に検討したストレージを紹介していきたいと思います。

#TL;DR

+ "Container storage for Dummies"は無償版と思えないクオリティ、是非読もう。
+ Kubernetesにストレージの全てを突っ込む、コンテナ・ネイティブストレージがこれからのおすすめ。
+ NetAppやEMCなどのベンダもKubernetes対応をすすめてるよ。

#Container storage for Dummies
まず、[こちらのEBook](https://www.redhat.com/ja/resources/container-storage-dummies)を紹介したいと思います。

このEBookにはRedhatが発行しており、多くの人が聞きなれないであろう、container-native storageという言葉について、その定義から使う意味、今すぐ移行すべき訳（！？）などが解説されています。

詳細はぜひ中身を読んで頂きたいですが、私がすとんと腹落ちしたのはコンテナ用外部ストレージの分類方法です。

+ コンテナ対応のストレージには2種類ある。
+ stotage for container = container-ready storageと呼ぶべき、従来型のストレージをコンテナ・Kubernetes対応したものが一つ。
+ storage in container = container-native storageと呼ばれる、SDS（sofgtware-define storage）の全要素をコンテナに内包したものがもう一つ。

これを以前のLTで図解したものが下図になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/d4bbd376-5378-0d09-60dc-247c8352312f.png)

新世代となるontainer-native storageには大きなメリットがあり、それは以下のように解説されています。

>By containerizing storage services and managing them under a single management plane such as Kubernetes, administrators have fewer housekeeping tasks to deal with, allowing them to focus on more value‐added tasks. 
>In addition, they can run their applications and their storage platform on the same set of infrastructure, which reduces infrastructure expenditure. Developers benefit by being able to provision application storage that’s both highly elastic and developer‐friendly.
>（Google翻訳）
>ストレージサービスをコンテナ化し、Kubernetesなどの単一の管理プレーンで管理することにより、管理者は処理するハウスキーピングタスクを減らし、より付加価値の高いタスクに集中することができます。
>さらに、アプリケーションとストレージプラットフォームを同じインフラストラクチャセットで実行できるため、インフラストラクチャの支出を削減できます。開発者は、高い弾力性と開発者に優しいアプリケーションストレージをプロビジョニングできるという利点があります。

つまり、今後はKubernetesを使って、1つの管理コンソールからサーバ（の上のアプリケーション）も、ストレージも管理していく時代になるよ、ということを言っています。

#コンテナ・ネイティブストレージの概観
では、実際にこのようなコンテナ・ネイティブストレージとして実装されているものは、巷にどれぐらいあるのでしょうか。それを調査してみたのが以下の表になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/7f1c6ef9-e58c-4841-1e8f-49157de24c2d.png)
コンテナ・ネイティブなストレージとして、OSSと商用あわせて4つを紹介しています。

分かりやすいのはBased onがCephになっているRookと、GlusterFSになっているRedhat OpenShift Container Storageでしょうか。これらはいずれも有名で実績のある分散ストレージを、Kubernetes上に展開するソフトウェアになっています。
一方でOpenEBSとStorageOSは基となる分散ストレージ・ソフトウェアはないようです。

今回のPostgreSQL on Kubernetesでは、

+ ブロックストレージとして使えること、実績があること
+ OSSであること

から、Rook/Cephを使うことにしています。

ちなみにRookは分散ストレージ部分にMinioやCockroach DBを用いることが出来ます。そのあたりは[こちらの資料](https://www.slideshare.net/JunichiYoshise/rookcloudnative-meetup-3)で紹介されていますので、興味がある方はご覧下さい。

#ストレージベンダの対応状況
では、コンテナ・レディなストレージの状況はどうでしょうか。こちらは各ストレージベンダが積極的なコンテナ・k8s対応を行っています。

+ NetAPpのTrident
+ EMCのRexlay

本日は上記2つの製品について簡単に見てみましょう。

### Trident
NetAppが「Storage Orchestrator」と呼ぶ製品で、@makotowさんがKubernetesコミュニティで積極的に紹介して下さっているお陰で知名度も上がってきたのではないでしょうか。
製品概要も[@makotowさんの資料](https://speakerdeck.com/makotow/onpure-kuraudonidui-ying-suru-kubernetessutorezifalseshi-xian)を読めばOKです。

特徴としてはやはり、NetAppの高機能・実績豊富なストレージをKubernetesからAPIを通して扱うことが出来る点でしょう。動的プロビジョニングにも対応しており、アプリケーション開発者が要求するPVを、ストレージ管理者の手を殆ど煩わせずにアサインすることができます。

そして、NetAppストレージ固有の機能であるFlexCloneなどもKubernetesからマニフェストファイルのアノテーションを使って呼び出すことが可能です。

このあたりはさすが商用ソフトということで、NetApp資産をお持ちで使い慣れている方々には有力な選択肢の一つとなるでしょう。

### REX-Ray
NetAppにTridentがあれば、双璧のEMCはREX-RayというOSSの開発を行っています。
もともとREX-RayはDockerのボリューム・プラグインとして開発されてきましたが、エコシステムの中心がKubernetesに移っていくにあたって、そちらへの対応も進んでいるようにみえます。

そして、こちらのREX-Rayは既存のベンダ資産をコンテナから使うという観点よりも、いろいろな種類のストレージを共通の操作で扱うことができるマネジメントツール、ということのようです。
日本語の情報は非常に少ないのですが、[こちらの資料](https://www.slideshare.net/naotakeyoshida1/emcoss)に概要が少しだけのっています。

EMCにはかつて[ViPR](https://japan.emc.com/about/news/press/japan/2013/20131101-2.htm)という製品がありました。位置づけとしてはこちらに近いものに見えます。

#まとめ
本日はストレージ on Kubernetesということで、コンテナ・ネイティブとコンテナ・レディという2つの形のストレージソフトウェアを紹介しました。

今回のPostgreSQL on Kubernetesではコンテナ・ネイティブストレージのRookを利用していますが、機会があれば、NetAppやEMCの製品もさわってみたいと思います。
最近はどちらもgithubで公開されており、専用のHWがなくてもコモディティなサーバやVMで利用可能となっているようですよ！

よろしくお願いします。