Ceph は、ブロックストレージ、ファイルストレージ、オブジェクトストレージを提供できる素晴らしいSDS(Software Defined Storage)だ。しかし、ドキュメントページのクイックインストールを読んで実行してもうまく動かせない。それは、設定量が多く、バージョンアップを繰り返す中で、正確さが失われていて、簡単に動作させるのが難しい。しかし、CNCFのROOKは、Cephを利用したクラウドネイティブ・ストレージとして注目されており、Cephは何らかの形で利用することになるので、良く理解しておきたい。
そこで、AnsibleのPlaybookに、設定手順を記載して、どのパソコンでも、何度実行しても、確実にCephクラスタが動作するようにして、Cephのスキルを高められるように試みた。
概要
Vagrantfileによって、Cephクラスタを起動する仮想サーバーの設定を記述、Ansible PlaybookにCephクラスタのソフトウェア導入とセットアップ手順を記述した。そして、これらのファイルをGitHub https://github.com/takara9/vagrant-ceph に登録した。 これらのファイル群によって構築できるCephクラスタの構成は、以下である。
各ノードのホスト名、IPアドレス 及び、役割をいかにあげる。172.20.1.0/24のサブネットは、Vagrant上の仮想ネットワークなので、環境に依存せず常に同じアドレスで起動する。そして、masterノードの192.168.1.90
は、パソコンの LAN IFと対応づいて、外部と通信することができる。設定はVagrantfileに記述してあるので、必要に応じてアドレスを変更、または、コメント化して無効にして利用してもらいたい。
1. master 172.20.1.30 192.168.1.90 管理ノード
1. node1 172.20.1.31 ストレージノード
1. node2 172.20.1.32 ストレージノード
1. node3 172.20.1.33 ストレージノード
1. client 172.20.1.229 テスト用クライアント
このコードで実現できることは、以下である。
- Cephクラスタの起動
- ダッシュボードの利用 (自己署名証明書によるHTTPSアクセス)
- Cephブロックストレージ
- Cephファイルシステム
- Amazon S3, OpenStack Swift 互換APIのオブジェクトストレージ (非暗号化アクセスのみ)
また、iSCSIゲートウェイとNFS互換サービスは、未設定である。
必要なソフトウェア
このコードを利用するためには、次のソフトウェアを必要とする。
- Vagrant (https://www.vagrantup.com/)
- VirtualBox (https://www.virtualbox.org/)
- kubectl (https://kubernetes.io/docs/tasks/tools/install-kubectl/)
- git (https://kubernetes.io/docs/tasks/tools/install-kubectl/)
仮想マシンのホスト環境
Vagrantが動作する環境であれば、OSを問わず動作するはずである。筆者はこのコードをMacOSとLinux上で開発した。
- Windows10
- MacOS
- Linux
Windows10では、確認していないが、Vagrant + VirtualBoxの環境であれば、MacOSと同じなので、動作すると見込まれる。
また、Linuxは、Ubuntu 18.04 を利用したが、デフォルトのリポジトリからインストールされる vagrantは、バージョンが古いためエラーとなる。そのため、Vagrantのホームページを参照して、最新のVagrantを導入することをオススメしたい。
ハードウェアの資源は、以下の通りである。
- RAM: 16GB 以上
- ストレージ: 空き領域 10GB 以上
- CPU: Intel Core i5 / AMD Ryzen 以上
ストレージノードのメモリは、1.5GBを割り当ててあるが、メモリが不足すると、プロセスの強制停止が発生してCephクラスタの動作に障害が発生する。dmesg
コマンドにメモリ不足とプロセスの強制終了が記録されるので、Vagrantfileを修正して、ノードのメモリを増やして、クラスタを再作成すると良い。
Cephクラスタの起動手順
GitHubからクローンして、Vagrantで仮想マシンを起動すると、Ansibleで自動設定して利用可能な状態になる。起動完了までの時間は、仮想マシンの能力やネットワークの環境に依存するが、約10程度で起動する。一方で、検証用クライアントは、手作業で実施する必要がある。
$ git clone https://github.com/takara9/vagrant-ceph
$ cd vagrant-ceph
$ vagrant up
AnsibleのPlaybookが完了すると、ダッシュボードへアクセスできるようになる。
Cephダッシュボードのアクセス
MacやWindowsのパソコン内で起動した場合は、https://172.20.1.30:8443/ にアクセスすることで、Cephダッシュボードにアクセスできる。
また、異なるパソコンからダッシュボードにアクセスするには、
ダッシュボードのユーザーとパスワードは、admin
/ password
を設定した。また、管理ノードには、192.168.1.90のIPアドレスを与えることで、Vagrant仮想マシンのホスト外部からでもアクセスできる。しかし、これには、外部IPアドレスとの衝突や不正アクセスの原因となるので、環境に合わせて修正してもらいたい。
検証用クライアントのセットアップ
検証用クライアントのソフトウェアと設定は、管理用マスターノードからdeploy-cephコマンドによって、実行することできる。このためには、パスワード無しでsshリモートシェルが実行できるようになっている必要がある。設定は内容はAnsibleプレイブックを参照してもらいたい。
以下の要領で、マスターノードから、クライアントノードのセットアップが完了する。
maho:cepf maho$ vagrant ssh master
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
<中略>
vagrant@master:~$ sudo -s
root@master:~# ceph-deploy install --release nautilus client
root@master:~# ceph-deploy admin client
Cephブロックストレージへのアクセス
ここでは、検証用クライアントから、Cephブロックストレージをアクセスする。ブロックストレージに必要な、OSDプールを設定済みなので、クライアントノードにログインして、論理ボリュームを作成して、ファイルシステムを作成することができる。
maho:cepf maho$ vagrant ssh client
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
<中略>
vagrant@client:~$ sudo -s
root@client:~# rbd create lv0 --size 4096 --image-feature layering -p blk_data
root@client:~# rbd map lv0 -p blk_data
/dev/rbd0
root@client:~# mkfs.ext4 -m0 /dev/rbd/blk_data/lv0
検証用クライアントに、マウントポイントを作成して、マウントできること、読み書きできることが確認できる。
root@client:~# mkdir /mnt/blk
root@client:~# mount /dev/rbd/blk_data/lv0 /mnt/blk
root@client:~# df -h
Filesystem Size Used Avail Use% Mounted on
<中略>
/dev/rbd0 3.9G 16M 3.9G 1% /mnt/blk
アクセス状況はダッシュボードに統計値表示やログに記録されるので、確認すると良い。
Cephファイルシステムへのアクセス
Cephfsの設定は、既に完了しているので、マスターノードにある認証キーを表示して、クライアント側にファイルを作成する。
tkr@luigi:~/vagrant-ceph$ vagrant ssh master -c "cat ceph.client.admin.keyring"
[client.admin]
key = AQCR9w9eyY/4EhAAPoVbB412QsC58KxzIv3ABg==
<以下省略>
ファイル名は特に何でも良いが、admin.secret
とする。
tkr@luigi:~/vagrant-ceph$ vagrant ssh client
vagrant@client:~$ sudo -
root@client:~# vi admin.secret
root@client:~# cat admin.secret
AQCR9w9eyY/4EhAAPoVbB412QsC58KxzIv3ABg==
node1は、クライアントの/etc/hostsに登録してあり、先にインストールした Cephパッケージによって、以下の操作でマウントできる。
root@client:~# mkdir /mnt/fs
root@client:~# mount -t ceph node1:6789:/ /mnt/fs -o name=admin,secretfile=admin.secret
root@client:~# df -h
Filesystem Size Used Avail Use% Mounted on
<中略>
/dev/rbd0 3.9G 16M 3.9G 1% /mnt/blk
172.20.1.31:6789:/ 93G 0 93G 0% /mnt/fs
Amazon S3互換API、OpenStack Swift互換API のオブジェクトストレージアクセス
こちらもAnsibleで設定が完了しているので、アクセス用のユーザーを作成して、アクセスするだけである。
管理用ノードにログインして、以下のコマンドでユーザーを作成して、キーを生成する。これは後のアクセスに必要なので、コピペして保存しておく。
root@master:~# radosgw-admin user create --uid="testuser" --display-name="First User"
root@master:~# radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
{
"user_id": "testuser",
"display_name": "First User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [
{
"id": "testuser:swift",
"permissions": "full-control"
}
],
"keys": [ <-- S3互換
{
"user": "testuser",
"access_key": "APHPYEEV1BFOCXOFYV95",
"secret_key": "1G2cDndryMZlkhNJDKra7R9CXEsJtPWjE5L6QMmW"
}
],
"swift_keys": [
{
"user": "testuser:swift",
"secret_key": "hVkJtBBTxxBNUImI4CXAZ1xTvCz59gWfWV96TPPH"
}
<以下省略>
S3 APIでのアクセス
S3 APIのアクセスはPythonのコードから実行する。そのためのモジュールをインストールする。
root@client:~# apt-get install python-boto
Pythonの後述のコードをコピペで作成しておき、実行してバケットが作成されたことで確認する。
root@client:~# vi s3test.py
root@client:~# python s3test.py
my-new-bucket 2020-01-04T22:39:22.195Z
以下がS3アクセス用のコード。IPアドレスは、node1 のIPアドレスで、2つのキーを前述のユーザー生成時の応答からコピペして利用する。
root@client:~# cat s3test.py
import boto.s3.connection
access_key = 'APHPYEEV1BFOCXOFYV95'
secret_key = '1G2cDndryMZlkhNJDKra7R9CXEsJtPWjE5L6QMmW'
conn = boto.connect_s3(
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
host='172.20.1.31', port=7480,
is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.create_bucket('my-new-bucket')
for bucket in conn.get_all_buckets():
print "{name} {created}".format(
name=bucket.name,
created=bucket.creation_date,
)
Swift API でのアクセス
上記で作成したバケットをSwift APIから見えることを確認する。事前にクライアントに必要なモジュールをインストールする。
apt-get install python-setuptools python-pip
pip install --upgrade setuptools
pip install --upgrade python-swiftclient
swiftコマンドに、キーをユーザーと鍵文字列を設定して、バケットをリストできることを確認する。
root@client:~# swift -V 1 -A http://172.20.1.31:7480/auth -U testuser:swift -K 'hVkJtBBTxxBNUImI4CXAZ1xTvCz59gWfWV96TPPH' list
my-new-bucket
まとめ
Cephは、CNCFがホストするROOKや、RedHat Container Storage のベース機能として利用されるため、Cephそのものを理解しておきたかった。
しかし、Ceph のモジュールは、幾つにも分かれており、最初のコミットから約20年が経過した歴史と蓄積があるオープンソースソフトウエアである。手作業で設定して試そうとすると、ドキュメントの難解さや不正確さによって、苦労して挫けそうになる。 しかし、今回開発したコードを利用して、より簡単に環境を作って検証できるようになった。
最後に、Cephクラスタの設定は、解説していないが、読めばわかると思うので、GitHub を参照してもらいたい。
参考URL
- Cephクラスタの構築, https://docs.ceph.com/docs/master/start/quick-ceph-deploy/
- ダッシュボード設定, https://docs.ceph.com/docs/master/mgr/dashboard/#enabling
- ダッシュボード課題対応, https://stackoverflow.com/questions/56696819/ceph-nautilus-how-to-enable-the-ceph-mgr-dashboard
- ブロックストレージ, https://docs.ceph.com/docs/master/start/quick-rbd/
- CephFSアクセス、https://docs.ceph.com/docs/giant/cephfs/createfs/
- CephFSカーネルドライバによるアクセス、https://docs.ceph.com/docs/giant/cephfs/kernel/
- S3/Swiftオブジェクトストレージ,https://docs.ceph.com/docs/master/install/install-ceph-gateway/
- 分散ストレージCeph/RADOSとは?,https://www.atmarkit.co.jp/ait/articles/1410/17/news003.html
- Ceph/RADOSの実装から動作の仕組みを理解する, https://www.atmarkit.co.jp/ait/articles/1411/04/news164.html
- Ceph/RADOSのインストール、環境構築と接続テストまで, https://www.atmarkit.co.jp/ait/articles/1411/17/news003.html
- Cephがスケールできる理由、単一障害点を排除する仕組み、負荷を減らす実装, https://www.atmarkit.co.jp/ait/articles/1412/24/news006.html