GlusterFS on Kubernetes セットアップメモ
変更履歴
- 2019/09/13 初稿。 kubernetes 1.15.3
- 2019/09/26 storageclass.yaml の resturl についてを追記。
requirements
- 3 台以上のノード(1 台でも 2 台でも動くのですが、1 台だとありがたみが薄い、2 台だとスプリットブレインの可能性)
- それなりのディスク容量とディスクを GlusterFS のノードに割り当て済みであること。(パーティションでもいけそうに思えるが未検証)
準備
最後のデプロイスクリプトが、deploy ディレクトリの構造に依存している為、ディレクトリ名の変更等は
してはいけません。また、以下のファイル類は kubectl コマンドが使えればどのマシンに置いてあっても問題なさそうですが、
一応、kubernetes の master ノードで行いました。
各ノードの準備
/etc/modules-load.d/glusterfs.conf というファイル名で、GlusterFS の全ノードに以下の内容のファイルを配置します。
再起動ができれば再起動が一番良いですが、とりあえず modprobe でロードしてもよいと思います。
この作業は、GlusterFS のノード全てで必要です。(大事なので強調)
1 | dm_snapshot |
clone
まずは、以下のリポジトリを clone します。ZIP でダウンロードでも OK です。
https://github.com/gluster/gluster-kubernetes/
使用するのは、deploy ディレクトリ以下のみなので、以下 deploy ディレクトリを基準に説明します。
topology.json の準備
topology.json.sample をコピーして topology.json とします。
内容は sample を見て頂いた方が早いと思います。
gk-deploy スクリプトの修正
最近の kubernetes で変更になったオプションが使われている為、以下の issue の内容に従って gk-deploy を書き換えます。
具体的には、 --show-all を検索して、削除して下さい。
https://github.com/gluster/gluster-kubernetes/issues/582
1 | 例 |
構築
gk-deploy スクリプトの実行
gk-deploy スクリプトを実行します。失敗に備えて、一度本記事を最後まで読んでからやることをおすすめします。
1 | ./gk-deploy -gv -w 600 --admin-key admkey --user-key usrkey |
storageclass の apply
gk-deploy が成功すると、最後に、storageclass.yaml の内容が表示されます。
後で apply するので、 storageclass.yaml のような名前でファイルに保存して下さい。
表示される内容が誤っている場合があるので、 resturl: の指定が正しいことを確認して下さい。
resturl は、PV を確保する際に使用する heketi の API エンドポイントのアドレスです。
heketi はスクリプト内で自動的にデプロイされています。
エンドポイントは Service から取得することができます。具体的には以下です。
heketi_Endpoint 取得
1 | $ kubectl get svc heketi |
これで取得した IP アドレスとポートが、 storageclass.yaml 内に指定されているか確認して下さい。
当方が実行した際は、誤った値が表示されていました。
storageclass.yaml
1 | apiVersion: storage.k8s.io/v1beta1 |
ここまで確認したら、 kubectl apply -f storageclass.yaml で StorageClass を生成して完了です。
(必要であれば) 作成した StorageClass をデフォルトに指定する
PVC を作成する際に、StorageClass 名を指定すれば良いのですが、省略された際にこの StorageClass が使用される
ようにする為には、default に指定する必要があります。
1 | kubectl patch storageclass glusterfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' |
適用されたかどうかは以下のコマンドで確認できます。
1 | > kubectl get sc |
蛇足
失敗時のやりなおし
この記事はここが書きたいので書きました。
1 | ./gk-deploy -gv -w 600 --admin-key admkey --user-key usrkey --abort |
末尾に --abort をつけるとやり直しができますが、途中でディスクに対して変更を行ってしまっている場合、abort しても
成功しません。 全ノードの topology.json で指定したディスクに対して wipefs --all /dev/sdb のように
各種シグネチャを削除する必要があります。
ありますが・・・ 恐らく、resource busy と言われて失敗するかもしれません。
その場合、一度ディスクをデタッチしてから再度行うと上手く行くと思います・・・が、恐らく、デバイス名が変わってしまいます。
最終的には再起動しかありません。(むしろご存じでしたら教えて下さい)