【Docker】暇してるストレージをGlusterでまとめる
背景
Oracle Cloud Infrastructureの無料枠で、200GBぐらいのストレージが暇していた。
かわいそうなので Glusterのコンテナを使ってまとめあげて、いい感じに利用できるようにする。
過去に一度やってた作業だけど、完全に忘れてしまって調べなおしする羽目になったので、
備忘録として(戒め
環境
イメージ
使うコンテナイメージは
ghcr.io/gluster/gluster-containers:fedora
※ リポジトリはここ
ちなみに、Googleでgluster docker
とかで検索しても下のほうに出てくるし、さっくりとは見つけられなかった。
自前のDockerfileまで作ってしまったあとで見つけた(泣
aarch64環境でも動くみたい。
手順0「hosts設定」
DNS作るのがめんどくさいので、/etc/hostsを直接編集。
10.0.0.5 si1
10.0.0.54 sim2
10.0.0.113 si3
10.0.0.135 sim1
10.0.0.213 si2
めんどくさいけど、全ノードに対して適用。
IPはdynamic。
ちなみにホスト名は適当。
手順0.5「Brick作成」
各ノードで"Brick"という Gluster に読ませるストレージを用意。
ストレージといっても、今回は rootパーティション をそのまま読ませるので、ディレクトリだけ用意する。
mkdir /opt/brick
スペースを使い切ってOSが壊れる可能性もあるので、本来は別ストレージ or 別パーティションにすべき。
手順1「ネットワーク経路確保」
イングレス・エグレスのルール追加とファイアウォールのポート開放。
ルール追加は割愛。
ポートは、
24007 (TCP): Gluster Daemon
24008 (TCP): TCP for Infiniband management (optional unless you are using IB)
24009 - 240xx (TCP): brick port(GlusterFS 3.3 & below)
49152 - 491xx (TCP): brick port(GlusterFS 3.4 & later)
38465 - 38467 (TCP): Gluster NFS Server
111 (TCP and UDP): portmapper
2049 (TCP): portmapper(GlusterFS 3.4 & later)
最大でこれぐらい開放する必要があるらしい。多いな。
3.4以上なのでそのあたりを開放する。
!!追記!!
必要なポートだけを解放しようとしたが、"glusterfsd"というプロセスがめちゃくちゃランダムなポートで待ち受けようとしている様子で、どうあがいても I/Oエラーが抗えない。
LISTEN 0.0.0.0:49833 0.0.0.0:* users:(("glusterfsd",pid=3001,fd=12))
LISTEN 0.0.0.0:53567 0.0.0.0:* users:(("glusterfsd",pid=2099,fd=12))
LISTEN 0.0.0.0:54177 0.0.0.0:* users:(("glusterfsd",pid=2896,fd=12))
LISTEN 0.0.0.0:54649 0.0.0.0:* users:(("glusterfsd",pid=2522,fd=11))
LISTEN 0.0.0.0:54649 0.0.0.0:* users:(("glusterfsd",pid=2522,fd=11))
LISTEN 0.0.0.0:60583 0.0.0.0:* users:(("glusterfsd",pid=5540,fd=12))
LISTEN 0.0.0.0:60583 0.0.0.0:* users:(("glusterfsd",pid=5540,fd=12))
このプロセス、検索しても何も情報が出てこない。
ChatGPTに聞いたら「54648,54649はNFSで待ち受けることが~」とか言うけど絶対関係ない。
お父さんはもう疲れた。
ローカルネットワークの全許可をして逃げる。
ufw allow from 10.0.0.0/24
ufw reload
下記のような感じで美しくやろうとしたが断念。
ufw allow 24007,24008/tcp
ufw allow 49139:49199/tcp
ufw allow 38465:38467/tcp
ufw allow 111/tcp
ufw allow 111/udp
ufw allow 2049/tcp
ufw reload
参考
手順2「全ノードでGlusterを起動」
リポジトリを参考に。
docker run \
-v /etc/glusterfs:/etc/glusterfs:z \
-v /var/lib/glusterd:/var/lib/glusterd:z \
-v /var/log/glusterfs:/var/log/glusterfs:z \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
-v /dev/:/dev \
-v /etc/hosts:/etc/hosts:ro \
-v /opt/brick:/opt/brick \
--cgroupns=host \
-d --privileged=true --net=host \
--restart unless-stopped \
--name gluster \
ghcr.io/gluster/gluster-containers:fedora
これを全ノードで実行。
手順3「peer追加」
今回はsi1を起点として、それ以外を追加しまくる。
docker exec gluster gluster peer probe si2
docker exec gluster gluster peer probe si3
docker exec gluster gluster peer probe sim1
docker exec gluster gluster peer probe sim2
確認
> docker exec gluster gluster peer status
Number of Peers: 4
Hostname: si3
Uuid: 43d506d6-b7ac-4122-a8a6-eaecce585893
State: Peer in Cluster (Connected)
Hostname: sim1
Uuid: 291451d9-06cc-4c7f-a97d-e094ffedfd59
State: Peer in Cluster (Connected)
Hostname: sim2
Uuid: e22142ae-f83f-40a5-a22f-b0dc5e5537eb
State: Peer in Cluster (Connected)
Hostname: si2
Uuid: 0d852c3b-55b1-4abe-bac0-1074a23445eb
State: Peer in Cluster (Connected)
手順4「volume作成」
全ノードのBrickを指定して vol 追加。
docker exec gluster gluster volume create vol transport tcp {si1,si2,si3,sim1,sim2}:/opt/brick force
force指定して、無理やりrootを使う。
指定しないと↓の感じで怒られる。
volume create: vol: failed: The brick si1:/opt/brick is being created in the root partition. It is recommended that you don't use the system's root partition for storage backend. Or use 'force' at the end of the command if you want to override this behavior.
参考
今回作成したVolumeは Distributed 形式。
単純にファイルを各ノードに順次配置していく形なので、ただのロードバランシングみたいな感じ。
大きなサイズのファイルだけだと、埋められない領域が出てくる。
手順5「volume発射」
docker exec gluster gluster volume start vol
手順6「マウント」
今回は si1 だけでマウントするので、si1で下記実行。
add-apt-repository -y ppa:gluster/glusterfs-10
apt update
apt install -y glusterfs-client
そのあとマウント。
mount -t glusterfs si1:/vol /mnt/gluster
確認。
> df -h
Filesystem Size Used Avail Use% Mounted on
si1:vol 225G 33G 193G 15% /mnt/data
200 GB ぐらい使えるようになった。
地味に長かった。
ちなみに、Availが合算されてない場合はネットワークの疎通が出来てないかも。
ハマったところ
ちゃんとポート開放できてないと、mountでバグる。
▼ エラーパターン1
[2023-05-14 00:11:17.894293 +0000] E [fuse-bridge.c:5364:fuse_first_lookup] 0-fuse: first lookup on root failed (通信端点が接続されていません)
▼ エラーパターン2
touch: '27' に touch できません: 入力/出力エラーです
touch: '28' に touch できません: 入力/出力エラーです
touch: '29' に touch できません: 入力/出力エラーです
touch: '30' に touch できません: 入力/出力エラーです
touch: '31' に touch できません: 入力/出力エラーです
touch: '32' に touch できません: 入力/出力エラーです
touch: '33' に touch できません: 入力/出力エラーです
touch: '34' に touch できません: 入力/出力エラーです
touch: '35' に touch できません: 入力/出力エラーです
touch: '36' に touch できません: 入力/出力エラーです
touch: '37' に touch できません: 入力/出力エラーです
touch: '38' に touch できません: 入力/出力エラーです
touch: '39' に touch できません: 入力/出力エラーです
手順7「自動マウント」
/etc/fstab に追加。
si1:/vol /mnt/gluster glusterfs _netdev,nofail,defaults 0 0
死んでてもBootしてほしいので nofail。