4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vagrant仮想マシンでCephクラスタをAnsibleで構築してみた

Last updated at Posted at 2020-01-05

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クラスタの構成は、以下である。

ceph-cluster.png

各ノードのホスト名、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が動作する環境であれば、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アドレスとの衝突や不正アクセスの原因となるので、環境に合わせて修正してもらいたい。

Ceph-Dashboard.png

検証用クライアントのセットアップ

検証用クライアントのソフトウェアと設定は、管理用マスターノードから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

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?