GlusterFS install + Configure
分散ファイルシステム GlusterFs について紹介します。
Kubernetes Cluster のストレージに GlusterFS を採用していました。
今回紹介するのは Kubernetes 向けではなく一般的な分散ファイルストレージとしての紹介になります。
Kubernetes 向けに利用を検討される方への事前に把握しておくポイントがありますので、少しそちらの方も触れていこうと思います。
Kubernetes Cluster に GlusterFS を利用するにあったって把握しておくポイントが2つあります。
- gluster が推奨している Kubernetes 向けの GlusterFS プロジェクトがありますのでそちらを検討ください。下記のプロジェクトを利用すると、スクリプトで Kubernetes 環境に GlusterFS と Heketi のセットアップを行ったコンテナをデプロイしてくれます。
gluster/gluster-kubernets
https://github.com/gluster/gluster-kubernetes
ただし、ARM環境では上手く動作しませんでしたので、AimHigherGG のインフラ環境では自前で GlusterFS と Heketi の構築を行い Dynamic Volume Provisioning を実現していました。
(現在は longhorn に移行しています。)
- GlusterFS と GlusterFS + Heketi でのストレージ前提条件
gluster-kubernetes では以下のコンポーネントから構成されています。
- Kubernetes (コンテナ管理システム。)
- GlusterFS (スケールアウトストレージシステム。)
- heketi (GlusterFSのRESTfulボリューム管理インターフェース。)
GlusterFSの場合は、構築後ファイルシステムにストレージをフォーマットしますが、 GlusterFS + Heketi の場合は ストレージはファイルシステムにフォーマットせずにそのままの状態で利用する必要があります。そのため、LVMなどを利用してファイルシステム用と RAW のままの物を用意して GlusterFS をお試しいただければと思います。
少し長くなりましたが GlusterFS の紹介に進みます。
GlusterFS の特徴は分散(RAID5)、ミラーリング(RAID0)、ストライピング(RAID1)、といったオプションを柔軟に組み合わせる事ができる点です。また、AimHigherGG インフラでは拡張性を補うため LVM を組み合わせて使用しています。
GlusterFS の用語について説明します。
| 用語 | 説明 |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------ |
| Brik | GlusterFSが管理するディレクトリ |
| Node | 1つ以上のBrikをホストするサーバ |
| storage pool | GlusterFS同士が接続されたクラスタ。GlusterFSを構成するにはstorage poolに参加する必要あり |
| glusterd | ボリュームとクラスターを管理するデーモン。全てのストレージプールで実行する必要あり |
| GFID | GlusterFSが管理するユニークな128ビット番号(iノードに近しいもの) |
| Rebalance | ブリックが追加または削除されたときに、分さボリューム内のデータを再配布する機能 |
| Self-Heal | self-heal-daemonがファイルの不整合を識別子修復する機能 |
| Split-brain | 複製されたボリュームにて、ファイルに差分が発生し、どちらが正常と判断できなくなった場合、強制的にファイルアクセスを禁止する機能 |
| .Vol File | VolファイルはGlusterの信頼できるストレージプールの動作を決定する構成ファイル |
| volume option | RAID/JBOD |
| ------------- | --------- |
| Striped | RAID0 |
| replica | RAID1 |
| distributed | RAID5 |
Gluster install
Ubuntu
ソフトウェアをインストール
apt install software-properties-common
リポジトリを追加しアップデート
add-apt-repository ppa:gluster/glusterfs-9
apt update
パッケージをインストール
apt install glusterfs-server
Debian
GPGキー追加
wget -O - https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | apt-key add -
上記の場所でrsa.pubが利用できない場合、rsa.pubを参照し、GPGキーをaptに追加
wget -O - https://download.gluster.org/pub/gluster/glusterfs/7/rsa.pub | apt-key add -
ソース追加
DEBID=$(grep 'VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"')
DEBVER=$(grep 'VERSION=' /etc/os-release | grep -Eo '[a-z]+')
DEBARCH=$(dpkg --print-architecture)
echo deb https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/${DEBID}/${DEBARCH}/apt ${DEBVER} main > /etc/apt/sources.list.d/gluster.list
Red Hat/CentOS
RPMインストール
yum install centos-release-gluster
ファイアウォールの通信許可設定
| port | protcol | 説明 |
| ------------- | ------- | --------------------------------------------------------------- |
| 111 | tcp/udp | RPCポートマッパーとRPCバインド |
| 24007 | tcp | glusterdを使用した管理プロセス |
| 24009 | tcp | Gluster イベントデーモン |
| 24009 - 240** | tcp | Brick管理用。Brick 1つに付き1つのポート必要 |
| 49152 - 49664 | tcp | ブリックの通信ポート。マシン上のブリックごとに1つのポートが必要 |
Gluster Configure
全ての Node で ディスクのフォーマット、Gluster用のディレクトリを作成します。
Gluster は XFSファイルシステムを利用する必要がります。
fdisk -l コマンドで対象の Disk を確認しフォーマットを行います。
ディスク又はパーティションをフォーマットします。
今回は LVM で作成した論理ボリュームをフォーマットします。
mkfs.xfs -i size=512 /dev/vg01/lv-fs
ファイルシステムをマウントするディレクトリを作成します。
sudo mkdir /data
blkid コマンドで Disk 名または UUID を確認し、フォーマットしたディスクの自動マウント設定とマウントを行います。
root@node1:/home# blkid
/dev/mapper/vg01-lv--fs: UUID="fd1f53fc-5d35-4310-b908-388d05b2f3aa" TYPE="xfs"
fstabに起動時のマウント設定を行います。
vi /etc/fstab
/dev/mapper/vg01-lv--fs /data xfs defaults 0 0
マウントします。
mount -a
GlusterFS用のディレクトリを作成します。
mkdir -p /data/brick01
storage pool を作成します。
node1 にて以下コマンド実行し、各ノードを storage pool に参加させます。
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4
storage pool の状態確認
root@node1:/home# gluster peer status
Number of Peers: 3
Hostname: node2
Uuid: 010e6d5f-8437-466e-8c17-11fe559fee37
State: Peer in Cluster (Connected)
Hostname: node3
Uuid: 81b29312-da34-49e3-9b92-8d264920c04e
State: Peer in Cluster (Connected)
Hostname: node4
Uuid: c20e54e4-247c-43d5-9870-135da5088db1
State: Peer in Cluster (Connected)
volume の作成と設定
volume の オプションは何も指定しなければ、distributed(分散) になります。
いずれかの Node で Gluster Volume を設定します。
gluster crate コマンド
gluster vol create <Volume_name> <volume_option> <number> <node_name:/path>
distributed volume を作成する場合
冗長数0 分散数4 連結数0
gluster vol create gv01 node1:/data/brick01 node2:/data/brick01 node3:/data/brick01 node4:/data/brick01
Replica volume を作成する場合
冗長数4 分散数0 連結数0
gluster vol create gv01 replica 4 node1:/data/brick01 node2:/data/brick01 node3:/data/brick01 node4:/data/brick01
冗長数2 分散数2 連結数0
gluster vol create gv01 replica 2 node1:/data/brick01 node2:/data/brick01 node3:/data/brick01 node4:/data/brick01
striped volume を作成する場合
冗長数0 分散数0 連結数4
gluster vol create gv01 stripe 4 node1:/data/brick01 node2:/data/brick01 node3:/data/brick01 node4:/data/brick01
全ての Node で データ読み書き用のの mount 設定を行う
データのやり取りは以下のフォルダで行う。brick では直接読み書きを行わない。(今回の例では /data/brick1 で行わない)
mkdir /mnt/glusterfs
ファイルシステム名は、<サーバのIPアドレス:/Gluster_volume_name> で記載し、ファイルシステムタイプは “glusterfs”、オプションは “defaults,_netdev” とします。
vi /etc/fstab
192.168.1.7:/gv01 /mnt/glusterfs glusterfs defaults,_netdev 0 0
全ての Node で マウントを行う
mount -a
最後に Gluster Volume のステータスが全て正常になっていることを確認し構築完了です。
root@node4:/home# gluster vol status
Status of volume: gv01
Gluster process TCP Port RDMA Port Online Pid
------------------------------------------------------------------------------
Brick node1:/data/brick01 49153 0 Y 179277
Brick node2:/data/brick01 49152 0 Y 7906
Brick node3:/data/brick01 49153 0 Y 480434
Brick node4:/data/brick01 49153 0 Y 3974792
Self-heal Daemon on localhost N/A N/A Y 3974815
Self-heal Daemon on gluster01 N/A N/A Y 179300
Self-heal Daemon on gluster03 N/A N/A Y 480459
Self-heal Daemon on gluster02 N/A N/A Y 7932
Task Status of Volume gv01
------------------------------------------------------------------------------
There are no active volume tasks