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 として登録する方法。
- Endpoint の作成
- Service の作成
- 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
subsets
の addresses
にそれぞれ GlusterFS Cluster のノードのアドレスを書く。
ports
内の port
は 1-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 の数だけ一個一個手作業でやって行くのは面倒。