RHEL 7 に Red Hat Ceph Storage 3 をインストール

今回は、ceph を all-in-one でインストールしてみます。[公式ドキュメント](https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html-single/installation_guide_for_red_hat_enterprise_linux/)を参考にシンプルにインストールする手順を紹介します。

### 構成

さっそく、all-in-oneと言いましたが、clientだけは分割しています。client側でcephの操作と、ansible playbookを実行していこうと思います。また、ceph nodeには、予め vdb,vdc,vddというディスクを用意しておきました。

~~~
 client node
+----------+
|          |
|  client  |
|          |
+----------+

   ceph node
+-------------+
|     osd     |
|     mon     |
|     mgr     |
|             |
| vdb,vdc,vdd |
+-------------+
~~~

### 必要パッケージとansibleの準備

#### Ceph Node での準備

subscriptionを登録しておきます。

~~~
# subscription-manager register
# subscription-manager attach --pool=xxxx
# subscription-manager repos --disable=*
~~~

また、以下のポートを空けておきます。

~~~
systemctl enable firewalld
systemctl start firewalld
systemctl status firewalld

// monitor node
firewall-cmd --zone=public --add-port=6789/tcp
firewall-cmd --zone=public --add-port=6789/tcp --permanent

// osd node && mgr node
firewall-cmd --zone=public --add-port=6800-7300/tcp
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent

// mds node
firewall-cmd --zone=public --add-port=6800/tcp
firewall-cmd --zone=public --add-port=6800/tcp --permanent
~~~

Object Gateway nodeとして使う場合には、7480や80の設定も必要ですが、今回は使わないので省略します。また、アクセス元のネットワーク範囲を絞ったりした方が良いですが、今回は簡単のため省略です。Cheph Node側での準備は、これだけです。

#### Client Node での準備

Client Nodeで操作します。まずは、subscriptionを登録しておきます。

~~~
# subscription-manager register
# subscription-manager attach --pool=xxxx
# subscription-manager repos --disable=*
~~~

Clientからansibleを実行するので、ssh keyの準備とceph-ansibleパッケージのインストールしておきます。

~~~
# ssh-keygen // パスフレーズ等は入力せず、すべてenterで進めます。
# ssh-copy-id root@knakayam-rhel7.example.com
# ssh-copy-id root@knakayam-ceph-c1.example.com
~~~

~~~
# subscription-manager repos --enable=rhel-7-server-rhceph-3-tools-rpms
# yum -y install ceph-ansible
~~~

### playbook の準備

ansibleを実行するclient nodeで準備していきます。

#### inventoryファイル

最初の構成通り、以下を設定しておきます。

~~~~
[mons]
knakayam-ceph-c1.example.com

[mgrs]
knakayam-ceph-c1.example.com

[osds]
knakayam-ceph-c1.example.com

[clients]
knakayam-rhel7.example.com
~~~~

#### cephパラメータの設定

ここからは、cephで使われるパラメータを設定していきます。すべて、`/usr/share/ceph-ansible/`以下のファイルに書き込んでいきます。

~~~
# cd /usr/share/ceph-ansible/
~~~

##### all.ymlの設定

~~~
# cd /usr/share/ceph-ansible/
# cp group_vars/all.yml.sample group_vars/all.yml
# vim group_vars/all.yml
~~~

all.ymlには、次の設定をしておきます。今回は、検証なのでpublic_networkもcluster_networkも同じものを利用しています。

~~~
ceph_rhcs_version: "3"
ceph_repository_type: cdn
rbd_cache: "true"
rbd_cache_writethrough_until_flush: "false"
rbd_client_directories: false

journal_size: 1024

## この設定項目だけは、環境によって変更が必要です ##
monitor_interface: eth0
public_network: 10.64.222.0/26
cluster_network: "{{ public_network }}"
## ココまで ##

ceph_conf_overrides:
  global:
    mon_osd_allow_primary_affinity: 1
    mon_clock_drift_allowed: 0.5
    osd_pool_default_size: 2
    osd_pool_default_min_size: 1
    mon_pg_warn_min_per_osd: 0
    mon_pg_warn_max_per_osd: 0
    mon_pg_warn_max_object_skew: 0
    mon_allow_pool_delete: true
  client:
    rbd_default_features: 1
~~~

##### osds.ymlの設定

こちらも、同様に`/usr/share/ceph-ansible/`以下のosds.ymlに設定します。

~~~
# cd /usr/share/ceph-ansible/
# cp group_vars/osds.yml.sample group_vars/osds.yml
# vim group_vars/osds.yml
~~~

構成で述べたように、準備しておいたvdb,vdcv,vddを指定します。`osd_scenario: collocated`の設定も忘れずに。

~~~
devices:
  - /dev/vdb
  - /dev/vdc
  - /dev/vdd

osd_scenario: collocated
~~~

##### clients.ymlの設定

~~~
# cd /usr/share/ceph-ansible/
# cp group_vars/clients.yml.sample group_vars/clients.yml
# vim group_vars/clients.yml
~~~

以下の設定を追加するだけです。

~~~
copy_admin_key: true
~~~

#### ansibleの実行

いよいよ、playbookの実行です。やはりclient nodeでの実行になります。

~~~
# cd /usr/share/ceph-ansible/
# cp site.yml.sample site.yml
# ansible-playbook site.yml
~~~

### RADOS Blcok Deviceを使ってみる

まずは、状態が健全であることを確認しておきましょう

~~~
[root@knakayam-rhel7-work ~]# ceph -s
  cluster:
    id:     3945dd03-69d2-43c0-b699-adb5819f22dc
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum knakayam-ceph-c1
    mgr: knakayam-ceph-c1(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 bytes
    usage:   321 MB used, 27293 MB / 27614 MB avail
    pgs:
~~~

次に、`testpool`という名前のpoolを作成します。

~~~
[root@knakayam-rhel7-work ~]# ceph osd pool create testpool 32 32
pool 'testpool' created

[root@knakayam-rhel7-work ~]# rbd pool init testpool

[root@knakayam-rhel7-work ~]# ceph osd pool ls
rbd
testpool
~~~

あっという間にpoolの作成までできるようになりました。次からは、Block Deviceを作っていきます。

### RADOS Block Device を作成

先程作成した`testpool`から`test`というrbdイメージを作成します。

~~~
[root@knakayam-rhel7-work ~]# rbd create testpool/test --size=128M

[root@knakayam-rhel7-work ~]# rbd -p testpool ls
test
~~~

rbd イメージ作成をしたら、deviceにマッピングします。

~~~
[root@knakayam-rhel7-work ~]# rbd map testpool/test
/dev/rbd0

[root@knakayam-rhel7-work ~]# rbd showmapped
id pool     image snap device
0  testpool test  -    /dev/rbd0
~~~

最後にマウントを試してみます。

~~~
[root@knakayam-rhel7-work ~]# mkfs.ext4 /dev/rbd0
[root@knakayam-rhel7-work ~]# mkdir /mnt/rbd
[root@knakayam-rhel7-work ~]# mount   /dev/rbd0 /mnt/rbd
~~~

### クリーンアップ

作成したrbdイメージの削除は、以下のようになります。

~~~
[root@knakayam-rhel7-work ~]# umount /mnt/rbd/
[root@knakayam-rhel7-work ~]# rbd unmap /dev/rbd0
[root@knakayam-rhel7-work ~]# rbd showmapped
[root@knakayam-rhel7-work ~]# rbd rm testpool/test
Removing image: 100% complete...done.
~~~

cephクラスタ全てをアンインストールする場合には、`purge-cluster.yml`を使います。

~~~
# ansible-playbook  /usr/share/ceph-ansible/infrastructure-playbooks/purge-cluster.yml
~~~

簡単な手順を実行して、CephをRHEL7にインストールしてみました。