OpenEBS Container Attached Storage

OpenEBS

最近流行りのコンテナ用Persistent Diskソリューション(Container Attached Storage)のOpenEBSを使ってみたので公開。

メリット/デメリットは次のような感じ。個人的には運用ベースで考えるとメリットの方がデメリットを上回ってると考えています。パフォーマンスに関してはゴリゴリにしたいのであればやはり専用のインフラ持つとかすると思うので無視w

メリット

  • Persistent DiskをStorageClassで抽象化するのでk8sレイヤの変更はStorageClassのみ
  • Statefulなアプリケーションはデータの永続性をシンプルに管理できる

デメリット

  • OpenEBSレイヤがオーバーヘッドとなるのでI/Oパフォーマンス低下するであろう(測定してないw)
  • OpenEBS自体がDeploymentsで構成されているのでクラスタリソースを消費する

GKEクラスタ構築

弊社はGoogle Cloud PlatformのパートナーなのでGCPで構築します。それ以外のCloud Providorとか期待してた方々(m´・ω・`)m ゴメン…

PROJECT_ID=<Your Project ID>
gcloud container clusters create ebs-test \
  --project ${PROJECT_ID} \
  --zone asia-northeast1-a \
  --num-nodes 3 \
  --cluster-version 1.9.3-gke.0 \
  --tags open-ebs-test \
  --machine-type n1-standard-2 \
  --image-type UBUNTU

大事なこと

OpenEBSのRequirementsとして

  • Kubernetes 1.7.5+
  • iscsi initiatorがNodeにインストールされていること

とあるので、--cluster-version 1.9.3-gke.0(GKEのStatefulSetは1.9でGAなので最新使う)、--image-type UBUNTUとしています。 現状OpenEBSはNodeにマウントされているDiskしか利用できないのでDisk冗長構成のため3Node作ります。 1zoneに3台作るかzone分けて1台ずつ作るかの議論は今回は無視w

OpenEBSクラスタデプロイ

現時点で最新の0.5.2を使います。

デプロイはドキュメントの通り実施すればOK。つまり、超簡単。

GCP_ACCOUNT_EMAIL=<Your GCP Account Email Address>
CURRENT_CONTEXT=`kubectl config current-context`
git clone https://github.com/openebs/openebs.git
git checkout tags/v0.5.2
cd openebs/k8s
kubectl create clusterrolebinding ${CURRENT_CONTEXT} \
  --clusterrole=cluster-admin \
  --user=${GCP_ACCOUNT_EMAIL}
kubectl apply -f openebs-operator.yaml

マメ

GKEの制約でOpenEBSのRBACを作成する際にclusterrolebindingが必要なため1実行しています。これ、RBAC使っているソリューションは全部一緒だからマメな。

serviceとdeploymentsがデプロイされました。

kubectl get all
NAME                         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/maya-apiserver        1         1         1            1           1m
deploy/openebs-provisioner   1         1         1            1           1m

NAME                               DESIRED   CURRENT   READY     AGE
rs/maya-apiserver-798f5d6887       1         1         1         1m
rs/openebs-provisioner-74f87ccd6   1         1         1         1m

NAME                         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/maya-apiserver        1         1         1            1           1m
deploy/openebs-provisioner   1         1         1            1           1m

NAME                               DESIRED   CURRENT   READY     AGE
rs/maya-apiserver-798f5d6887       1         1         1         1m
rs/openebs-provisioner-74f87ccd6   1         1         1         1m

NAME                                     READY     STATUS    RESTARTS   AGE
po/maya-apiserver-798f5d6887-64jng       1/1       Running   0          1m
po/openebs-provisioner-74f87ccd6-trmsc   1/1       Running   0          1m

NAME                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
svc/kubernetes               ClusterIP   10.35.240.1    <none>        443/TCP    36m
svc/maya-apiserver-service   ClusterIP   10.35.243.59   <none>        5656/TCP   1m

Cassandraをデプロイしてみる

さて、OpenEBSはデプロイできましたが、これだけでは何も楽しくないですね。

OpenEBSのリポジトリにdemoとして色々と用意されています。

ls -l demo/
total 48
-rw-r--r--   1 dokuma  staff    852  2 19 13:42 README.md
-rw-r--r--   1 dokuma  staff  14378  2 19 13:42 Vagrantfile
drwxr-xr-x   8 dokuma  staff    256  2 23 14:46 cassandra
drwxr-xr-x   7 dokuma  staff    224  2 19 13:42 cockroachDB
drwxr-xr-x   6 dokuma  staff    192  2 19 13:42 couchbase
drwxr-xr-x  10 dokuma  staff    320  2 19 13:42 crunchy-postgres
drwxr-xr-x   7 dokuma  staff    224  2 19 13:42 efk
drwxr-xr-x   3 dokuma  staff     96  2 19 18:44 galera-xtradb-cluster
drwxr-xr-x   5 dokuma  staff    160  2 19 13:42 jenkins
drwxr-xr-x   4 dokuma  staff    128  2 19 13:42 jupyter
drwxr-xr-x   9 dokuma  staff    288  3  5 13:46 kafka
drwxr-xr-x   5 dokuma  staff    160  3  5 13:46 mongodb
drwxr-xr-x   3 dokuma  staff     96  2 19 13:42 mysql-replication-cluster
drwxr-xr-x   8 dokuma  staff    256  2 19 13:42 percona
-rw-r--r--   1 dokuma  staff    203  2 19 13:42 pvc.yaml
drwxr-xr-x   5 dokuma  staff    160  2 19 13:42 rabbitmq
drwxr-xr-x   6 dokuma  staff    192  2 19 18:43 redis
drwxr-xr-x   8 dokuma  staff    256  2 19 13:42 scripts
drwxr-xr-x  12 dokuma  staff    384  2 19 13:42 specs
drwxr-xr-x   3 dokuma  staff     96  2 19 13:42 vdbench

というわけで、Cassandraでもデプロイしてみますか。

kubectl apply -f openebs-storageclasses.yaml
kubectl apply -f demo/cassandra/cassandra-service.yaml
kubectl apply -f demo/cassandra/cassandra-statefulset.yaml

もりもり作成されましたね。

ubectl get svc,deployments,pods,pvc
NAME                                                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
svc/cassandra                                           ClusterIP   None            <none>        9042/TCP            16m
svc/kubernetes                                          ClusterIP   10.35.240.1     <none>        443/TCP             1h
svc/maya-apiserver-service                              ClusterIP   10.35.243.59    <none>        5656/TCP            24m
svc/pvc-1f7e768d-2036-11e8-88cd-42010a9200cb-ctrl-svc   ClusterIP   10.35.245.7     <none>        3260/TCP,9501/TCP   8m
svc/pvc-55d137c0-2036-11e8-88cd-42010a9200cb-ctrl-svc   ClusterIP   10.35.242.49    <none>        3260/TCP,9501/TCP   6m
svc/pvc-dd17fec4-2035-11e8-88cd-42010a9200cb-ctrl-svc   ClusterIP   10.35.248.126   <none>        3260/TCP,9501/TCP   10m

NAME                                                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/maya-apiserver                                  1         1         1            1           24m
deploy/openebs-provisioner                             1         1         1            1           24m
deploy/pvc-1f7e768d-2036-11e8-88cd-42010a9200cb-ctrl   1         1         1            1           8m
deploy/pvc-1f7e768d-2036-11e8-88cd-42010a9200cb-rep    2         2         2            2           8m
deploy/pvc-55d137c0-2036-11e8-88cd-42010a9200cb-ctrl   1         1         1            1           6m
deploy/pvc-55d137c0-2036-11e8-88cd-42010a9200cb-rep    2         2         2            2           6m
deploy/pvc-dd17fec4-2035-11e8-88cd-42010a9200cb-ctrl   1         1         1            1           10m
deploy/pvc-dd17fec4-2035-11e8-88cd-42010a9200cb-rep    2         2         2            2           10m

NAME                                                                READY     STATUS    RESTARTS   AGE
po/cassandra-0                                                      1/1       Running   0          10m
po/cassandra-1                                                      1/1       Running   0          8m
po/cassandra-2                                                      1/1       Running   0          6m
po/maya-apiserver-798f5d6887-64jng                                  1/1       Running   0          24m
po/openebs-provisioner-74f87ccd6-trmsc                              1/1       Running   0          24m
po/pvc-1f7e768d-2036-11e8-88cd-42010a9200cb-ctrl-86b4d74df5-cgr96   2/2       Running   0          8m
po/pvc-1f7e768d-2036-11e8-88cd-42010a9200cb-rep-6646db99fc-25mnm    1/1       Running   0          8m
po/pvc-1f7e768d-2036-11e8-88cd-42010a9200cb-rep-6646db99fc-6v7k4    1/1       Running   0          8m
po/pvc-55d137c0-2036-11e8-88cd-42010a9200cb-ctrl-886c96586-wgxhm    2/2       Running   0          6m
po/pvc-55d137c0-2036-11e8-88cd-42010a9200cb-rep-856d5898d6-gmw2w    1/1       Running   0          6m
po/pvc-55d137c0-2036-11e8-88cd-42010a9200cb-rep-856d5898d6-vwbhw    1/1       Running   0          6m
po/pvc-dd17fec4-2035-11e8-88cd-42010a9200cb-ctrl-7c969cc66c-jl5sj   2/2       Running   0          10m
po/pvc-dd17fec4-2035-11e8-88cd-42010a9200cb-rep-598955b9b4-mt5px    1/1       Running   0          10m
po/pvc-dd17fec4-2035-11e8-88cd-42010a9200cb-rep-598955b9b4-tjqjg    1/1       Running   0          10m

NAME                             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
pvc/cassandra-data-cassandra-0   Bound     pvc-dd17fec4-2035-11e8-88cd-42010a9200cb   5G         RWO            openebs-cassandra   10m
pvc/cassandra-data-cassandra-1   Bound     pvc-1f7e768d-2036-11e8-88cd-42010a9200cb   5G         RWO            openebs-cassandra   8m
pvc/cassandra-data-cassandra-2   Bound     pvc-55d137c0-2036-11e8-88cd-42010a9200cb   5G         RWO            openebs-cassandra   6m

おお〜簡単。

本格的にCassandraを使いたいときは、demo/cassandra/cassandra-statefulset.yamlを参考に色々試してみれば良さそうですね。

お時間あれば

cassandra-stressで負荷テストかけるJobも用意されているので、興味ある人は実施してみてね☆彡

OpenEBSを利用するためのエッセンスはvolumeClaimTemplatesでStorageClassを設定しているところだけです。

  volumeClaimTemplates:
  - metadata:
      name: cassandra-data
      annotations:
        volume.beta.kubernetes.io/storage-class: openebs-cassandra # <- これ
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5G

openebs-cassandraというStorageClassはopenebs-storageclasses.yamlのなかで定義されていて、

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: openebs-cassandra
provisioner: openebs.io/provisioner-iscsi
parameters:
  openebs.io/storage-pool: "default"
  openebs.io/jiva-replica-count: "2"
  openebs.io/volume-monitor: "true"
  openebs.io/capacity: 5G

こんな感じ。

SSDとか使いたいとかcapacity変更したいとかあれば場合は独自のStorageClassを定義すれば。。。

現状のOpenEBSはその辺の設定(StoragePolicy)が複雑なので今回は紹介しませんが、SSDをマウントして使うところまでは確認しています。

まとめ

OpenEBSはコンテナ世代のストレージソリューションです。まだGAじゃないけど開発も活発だしどう考えても素敵ソリューションです。

  • 簡単に構築できる
  • GKEで管理しているアプリケーション(特にStatefulなやつ)のストレージ管理が楽になる
  • StoragePolicy(もりもり開発中だと思う)を理解すればカスタム可能
  • RBACの作成は気をつけよう
  • demoに色々あるから参考になる

今後注目のCAS(Container Attached Storage)、OpenEBSの紹介でした!

enjoy!