Open10

【Docker】暇してるストレージをGlusterでまとめる

TakashiAiharaTakashiAihara

背景

Oracle Cloud Infrastructureの無料枠で、200GBぐらいのストレージが暇していた。
かわいそうなので Glusterのコンテナを使ってまとめあげて、いい感じに利用できるようにする。

過去に一度やってた作業だけど、完全に忘れてしまって調べなおしする羽目になったので、
備忘録として(戒め

TakashiAiharaTakashiAihara

環境

イメージ

使うコンテナイメージは

ghcr.io/gluster/gluster-containers:fedora

リポジトリはここ

ちなみに、Googleでgluster docker とかで検索しても下のほうに出てくるし、さっくりとは見つけられなかった。
自前のDockerfileまで作ってしまったあとで見つけた(泣

aarch64環境でも動くみたい。

TakashiAiharaTakashiAihara

手順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 別パーティションにすべき。

TakashiAiharaTakashiAihara

手順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

参考

https://qiita.com/Yuki-Inamoto/items/2ea1efe862aeba34019c

TakashiAiharaTakashiAihara

手順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

これを全ノードで実行。

TakashiAiharaTakashiAihara

手順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)
TakashiAiharaTakashiAihara

手順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 形式。
単純にファイルを各ノードに順次配置していく形なので、ただのロードバランシングみたいな感じ。
大きなサイズのファイルだけだと、埋められない領域が出てくる。

TakashiAiharaTakashiAihara

手順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 できません: 入力/出力エラーです
TakashiAiharaTakashiAihara

手順7「自動マウント」

/etc/fstab に追加。

si1:/vol /mnt/gluster glusterfs _netdev,nofail,defaults 0 0

死んでてもBootしてほしいので nofail。