docker
kubernetes
DockerDay 19

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

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!

参考