Posted at
DockerDay 19

分散コンテナストレージのLonghornを試そうとしたけど上手くいかなかった話

More than 1 year has passed since last update.

Dockerを使うとアプリのポータビリティは上がるのですが、クラウド以外の環境だとストレージどうしよう問題も併せて付きまといます。

調べてみるとRancherのLonghornとかを使えば分散コンテナストレージが作れるようなので、Nutanixみたいなハイパーコンバージドが自前で作れるのでは??? と思いITアドベントカレンダーネタとしてチャレンジしてみました。

が、上手くいかずorz

とりあえず、上手くいかなかったところまで書いてみました。


k8sの準備

Longhornはk8sが必要になってきます。そういえばRancher2.0はk8sベースだし同じ会社だから上手くいくんじゃね? と試してみたもののベータのせいか、私のdocker-toolbox環境ではRancher2.0はエラーが出まくり早くも暗雲が。

いったん、あきらめてGKEを使うことにしました。GKEの準備は下記で。

$ gcloud components install kubectl

$ gcloud container clusters create "cluster-1" --image-type "UBUNTU"
$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user="<your mail address>"
clusterrolebinding "cluster-admin-binding" created

image-typeはrancher/longhornを参考にデフォルトではなくUbuntuで作成。

ロール作成権限が必要なのでcreate clusterrolebindingも行います。


Longhornのデプロイ

続いてLonghornのデプロイ。rancher/longhornからYAMLを取得して実行

$ git clone https://github.com/rancher/longhorn.git

$ cd longhorn
$ kubectl create -f deploy\example.yaml
clusterrolebinding "longhorn-bind" created
clusterrole "longhorn-role" created
serviceaccount "longhorn-service-account" created
daemonset "longhorn-manager" created
service "longhorn-backend" created
deployment "longhorn-ui" created
service "longhorn-frontend" created
daemonset "longhorn-driver" created

エントリポイントを確認してlonghorn-uiにつないでみます。

kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.31.240.1 <none> 443/TCP 8m
longhorn-backend ClusterIP 10.31.246.205 <none> 9500/TCP 2m
longhorn-frontend LoadBalancer 10.31.250.26 xxx.xxx.xxx.xxx 80:32039/TCP 2m

上記の場合、ブラウザで下記にアクセス

http://xxx.xxx.xxx.xxx/dashboard

2017-12-19.png

ここまでは割と順調でした。


Longhornを使うコンテナの作成

つづいてLonghornを使うコンテナの作成

  volumes:

- name: vol
flexVolume:
driver: "rancher.io/longhorn"
fsType: "ext4"
options:
size: "2G"
numberOfReplicas: "2"
staleReplicaTimeout: "20"
fromBackup: ""

こんな感じで指定するっぽい。flex Volumeが実は良くわかってませんがオプション内容的に実行時に動的に領域を作る機能と推測。

example.yamlが既に出来上がったっぽいもののようなのでデプロイしてみました。

$ kubectl create -f examples\example.yaml

pod "volume-test" created

一見成功ですがk8sのUI側で下記のエラーが

Unable to mount volumes for pod "volume-test_default(fc0bd9e1-e4c1-11e7-bf33-42010a800176)": timeout expired waiting for volumes to attach/mount for pod "default"/"volume-test". list of unattached/unmounted volumes=[voll]

どうやら領域のアタッチに失敗した模様。先に手動で作成が必要なのかと思いlonghorn-ui側でストレージを作ってみましたがやはりうまくいかず...

何となく初歩的なことに躓いてるきはするものの、今回はここで時間切れとなりましたorz


まとめ

今回はLonghornを試してみようと思ったのですが結果上手くいかずです。k8sの勉強も足らないのでリベンジですね。。。

ただ、分散コンテナストレージがうまくいくと、コンテナの運用がかなり捗りそうなので、パフォーマンス測定とかも含めて再チャレンジはしてみたいです。

それでは、Happy Hacking!


参考