# 安装

## 概念简介

* ceph-deploy
* monitor
* mgr
* osd

## 一、准备工作

### 1.1 主机规划

准备四台主机

* node0：ceph-deploy
* node1：monitor、mgr
* node2：osd，一个未格式化与未挂载的空白磁盘或分区
* node3：osd，一个未格式化与未挂载的空白磁盘或分区

本文以root用户进行安装

### 1.2 系统配置

> 以下操作在每台主机上执行

1.2.1 关闭selinux

编辑文件`/etc/selinux/config`，修改`SELINUX=enforcing`这一行为`SELINUX=disabled`。然后执行如下命令

```
$ setenforce 0
```

1.2.2 关闭防火墙

```
$ systemctl disable firewalld && systemctl stop firewalld
```

1.2.3 配置yum源

* epel.repo

在`/etc/yum.repos.d/`目录下创建文件`epel.repo`，内容如下

```
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
enabled=1
gpgcheck=0
```

* ceph.repo

在`/etc/yum.repos.d/`目录下创建文件`ceph.repo`，内容如下（这里我们安装`luminous`版本的ceph）

```
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
gpgcheck=0
```

1.2.4 配置终端权限

为了让`ceph-deploy`节点能够SSH到各节点执行安装命令，执行命令`visudo`，修改文件中`Defaults requiretty`这一行为`Defaults !requiretty`（若没有则不需要修改）

### 1.3 配置SSH无密登录

> 以下操作在ceph-deploy节点执行

1.3.1 设置主机名

在`/etc/hosts`文件末尾添加如下内容

```
x.x.x.x node1
y.y.y.y node2
z.z.z.z node3
```

1.3.2 生成ssh-key

执行如下命令，遇到交互直接按`Enter`

```
$ ssh-keygen
```

1.3.3 拷贝key到各节点

```
$ ssh-copy-id node1
$ ssh-copy-id node2
$ ssh-copy-id node3
```

1.3.4 验证

验证从ceph-deploy节点上可以直接SSH到其他节点，无需输入密码

### 1.4 安装时钟同步服务

（略）

## 二、安装过程

> 以下操作都在ceph-deploy节点执行

### 2.1 安装ceph-deploy

```
$ yum -y install ceph-delpoy
```

### 2.2 创建目录

在执行ceph-deploy命令的过程中会在生成一些配置文件，创建一个目录，存放生成的配置文件

```
$ mkdir ceph-cluster
$ cd ceph-cluster
```

### 2.3 安装monitor

在`node1`节点上安装monitor组件

```
$ ceph-deploy new node1
```

此时，会在`./ceph-cluster`目录下生成三个文件：`ceph.conf`、`ceph-deploy-ceph.log`和`ceph.mon.keyring`。其中`ceph.conf`文件，内容如下：

```
[global]
fsid = d023a153-18b9-46d2-96bd-f1fe3017e127
mon_initial_members = node1
mon_host = x.x.x.x
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
```

如果主机有多个网卡，则在`[global]`下手动添加`public network`的信息，比如：

```
[global]
public network = x.x.x.x/24
...
```

### 2.4 安装ceph到各个节点

```
$ ceph-deploy install --release=luminous node1 node2 node3 node4
```

`ceph-deploy install`会在节点上安装`ceph`、`ceph-radosgw`这两个rpm包，如果某个节点安装失败，可以手动去那个节点上执行命令安装：`yum -y install ceph ceph-radosgw`

### 2.5 生成密钥

```
$ ceph-deploy mon create-initial
```

该命令会在当前（`./ceph-cluster`）目录下生成以下几个密钥文件

* ceph.client.admin.keyring
* ceph.bootstrap-mgr.keyring
* ceph.bootstrap-osd.keyring
* ceph.bootstrap-mds.keyring
* ceph.bootstrap-rgw\.keyring
* ceph.bootstrap-rbd.keyring

### 2.6 分发配置文件与密钥

把配置文件和密钥拷贝到各节点上，这样从每个节点上都能执行ceph命令而不需要输入monitor的IP以及密钥

```
$ ceph-deploy admin node1 node2 node3
```

### 2.7 安装mgr

从luminous版本开始，一般都需要安装mgr

```
$ ceph-deploy mgr create node1
```

### 2.8 安装osd

前置条件：`/dev/sdb`必须是一个未格式化与未挂载的空白磁盘或空白分区

```
$ ceph-deploy osd create node2 --data /dev/sdb
$ ceph-deploy osd create node3 --data /dev/sdb
```

注意：官方文档这一步的命令是`ceph-deploy osd create node2:sdb`，但在实践中发现这个命令执行失败，这个坑要注意

## 三、检查集群状态

登录到monitor节点上，执行以下命令查看集群状态

```
$ ceph -s
```

## 四、清除操作

如果某个节点在安装过程中出错，可以执行以下的操作删掉Ceph以及清除数据，然后重新安装

```
$ ceph-deploy purge node_x
$ ceph-deploy purgedata node_x
```

## FAQ

**Q：执行`yum -y install ceph-deploy`时提示`No package ceph-deploy available`？**

A：执行命令`yum list ceph-deploy --show-duplicates | sort -r`会发现，在`epel`与`ceph`源中都有`ceph-deploy`，所以yum不知道该安装哪一个

```
$ yum list ceph-deploy --show-duplicates | sort -r
ceph-deploy.noarch                   2.0.1-0                         ceph-noarch
ceph-deploy.noarch                   2.0.0-0                         ceph-noarch
ceph-deploy.noarch                   1.5.25-1.el7                    epel
```

解决方法：指定安装`ceph`源中的`2.0.1`版本即可，`yum -y install ceph-deploy-2.0.1`

**Q：执行`ceph-deploy new node0`时报如下的错？**

```
ceph-deploy new node0
Traceback (most recent call last):
  File "/usr/bin/ceph-deploy", line 18, in <module>
    from ceph_deploy.cli import main
  File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module>
    import pkg_resources
ImportError: No module named pkg_resources
```

A：执行以下命令解决

```
curl https://bootstrap.pypa.io/ez_setup.py | python
```

**Q：如果只有一个磁盘或分区，则在创建一个pool后执行`rbd ls poolName`时会卡住？**

A：这里因为pool的默认副本数为3，而只有一个osd，可以通过以下命令确认：

```
$ ceph osd pool ls detail
pool 1 'kube' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 9 owner 18446744073709551615 flags hashpspool stripe_width 0 application rbd
```

执行命令将pool的size设置为1

```
$ ceph osd pool set kube size 1
```

然后执行命令就不会卡住了，执行`ceph -s`看到pool应该是`active+clean`的状态

```
$ ceph -s
  cluster:
    id:     b7fffb95-ef15-4247-a5d3-327c0bb80cfb
    health: HEALTH_WARN
            too few PGs per OSD (8 < min 30)

  services:
    mon: 1 daemons, quorum node0
    mgr: node0(active)
    osd: 1 osds: 1 up, 1 in

  data:
    pools:   1 pools, 8 pgs
    objects: 0 objects, 0B
    usage:   1.00GiB used, 8.99GiB / 10.0GiB avail
    pgs:     8 active+clean
```

**Q：在删除pool时，报错`Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool`？**

A：修改monitor节点上的`/etc/ceph/ceph.conf`文件，在尾部添加如下的内容

```
[mon]
mon allow pool delete = true
```

然后重启`ceph-mon.target`服务

```
$ systemctl restart ceph-mon.target
```

**Q：执行`ceph -s`时提示`application not enabled on 1 pool(s)`？**

A：执行命令`ceph osd pool application enable <pool> rbd`

## Reference

* <http://docs.ceph.com/docs/luminous/start/>
