: O. Yuanying

GlusterFS on Kubernetes

自宅の Minnowboard クラスターに Kubernetes をインストールしようとしてはや半年。

なぜかずっとコンテナのボリュームどうしようか、、と悩んで止まってましたが、 ようやく目処がついてきたので進捗を。

GlusterFS

とりあえずボリュームには GlusterFS を使うことにした。 NFS、という選択肢もあったが可用性を担保しようとするとストレージを RAID で構成しなければならなかったり(RAID はなんか好きじゃない。)、 結局 NFS Server が SPOF になるんじゃないかという点が気に食わなかった。 もちろん、NFS Server を Act-Standby にしたり最近は Failover できるらしいが、 とりあえず無視する。なんとなく Gluster が使いたかった。

Gluster を使えば、

  • Replicate を使えば RAID0 っぽいことがソフトウェアレベルでできる。
  • 容量が足りなくなったら単純にサーバ/ディスク追加で対処できる。
  • ディスク故障による交換が簡単そう。

すごい!

使い方

動的に Gluster のボリュームをプロビジョニングしてコンテナのボリュームとして使う方法もあるのだけど、 どうも微妙なので、とりあえずはすでに存在する Gluster のボリュームを Kubernetes の Persistent Volume として登録する方法。

  1. Endpoint の作成
  2. Service の作成
  3. Persistent Volume の作成

ぶっちゃけ kubernetes/examples の GlusterFS の内容そのままだが。

Endpoint の作成

ボリュームを提供する Gluster Cluster のエンドポイント情報を Kubernetes に教えるために、 Endpoint を作る必要がある。

kind: Endpoints
apiVersion: v1
metadata:
  name: glusterfs-cluster
subsets:
- addresses:
  - ip: "192.168.1.111"
  ports:
  - port: 1
- addresses:
  - ip: "192.168.1.112"
  ports:
  - port: 1

subsetsaddresses にそれぞれ GlusterFS Cluster のノードのアドレスを書く。 ports 内の port1-65535 以内の数値ならなんでもいいらしい。

Service の作成

作った Endpoint を永続化するために関連する Service を作っておく必要があるらしいが、 具体的にはどういう意味があるのかわかっていない。 とりあえず Service を作らずに Endpoint だけで運用しているが今の所困ったことはないが…。

kind: Service
apiVersion: v1
metadata:
  name: glusterfs-cluster
spec:
  ports:
  - port: 1

普通の Service と違うところは selector が無いところで、 そのおかげでKubernetes はこの Service に関連する Endpoint を勝手にいじったりすることがなくなる。

Persistent Volume の作成

Endpoint さえ作ってしまえばあとは PV を作れば良いだけ。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: gluster-volume
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 2Gi
  glusterfs:
    endpoints: glusterfs-cluster
    path: test-volume
    readOnly: false
  • endpoints: 上記で作成した Endpoint の名前。
  • path: path とあるが事前に作成した Gluster Volume の名前。
  • readOnly: 読み込み専用にしたければどうぞ。

とりあえず、これを PV の数だけ一個一個手作業でやって行くのは面倒。