# ceph-deploy
**Repository Path**: funnyfunny8/ceph-deploy
## Basic Information
- **Project Name**: ceph-deploy
- **Description**: ceph-deploy
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2022-07-13
- **Last Updated**: 2022-11-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ceph-deploy
## 介绍
ceph-deploy是一个使用ansible安装cephfs集群的工具,它的优势是在离线环境中部署,无需访问外部网络。
本工具部署流程完全遵从ceph官方文档[链接](https://docs.ceph.com/en/pacific/)
## 软件架构
本工具支持部署Pacific(16.2.9)版本的cephfs集群
本工具支持Ubuntu 18.04 aarch64、x86_64,支持cephfs集群中只包含某种架构,或两种架构混合的场景
| 操作系统| 版本 | CPU架构 | 备注 |
|:------:|:---------:|:-------:|:-----------:|
| Ubuntu | 18.04 | aarch64 |安装到【Software selection】这一步时勾选【OpenSSH server】/【SSH server】附件组件|
| Ubuntu | 18.04 | x86_64 |安装到【Software selection】这一步时勾选【OpenSSH server】/【SSH server】附件组件|
本工具会安装如下开源软件
| 软件名 | 版本 | 备注 |
| ---------- | ---------- | ----------------------------------|
| python3 | 3.6 | ansible会安装到python3,本机节点安装|
| ansible | 2.11.6 | 任务编排的自动化平台,本机节点安装 |
| chrony | 3.2 | 时间同步组件,所有节点安装 |
| docker | 19.03.9 | 应用容器引擎,所有节点安装 |
| harbor | 2.3.3 | 容器镜像仓,默认本机节点安装 |
| ceph | 16.2.9 | ceph cli组件,所有节点安装 |
## 客户端节点内核版本要求
如果使用内核客户端挂载cephfs,ceph建议使用较新内核版本的Linux发行版作为客户端节点的OS,否则可能无法挂载使用。
经过部分测试,Pacific(16.2.9)版本的cephfs集群支持内核版本为4.19及以上的Linux发行版,比如OpenEuler 20.03(4.19.90)、Ubuntu 20.04(5.4.0);经过部分测试,Centos 7.6(4.14.0)、Ubuntu 18.04(4.15.0)因内核版本较低,不支持挂载Pacific(16.2.9)版本的cephfs集群
## 存储设备要求
ceph拒绝在不可用的设备上配置OSD,满足以下所有条件,则认为存储设备可用:
1. 该设备必须没有分区
2. 该设备不得具有任何LVM状态
3. 不得挂载该设备
4. 该设备不得包含文件系统
5. 该设备不得包含Ceph BlueStore OSD
6. 该设备必须大于5 GB
由上可知,安装os前,请配置磁盘为裸盘或直通模式,非RAID组模式,且无任何LVM状态;安装os时,只把os安装到某一个磁盘,使剩余磁盘可用;安装os后,检查磁盘状态,删除可能残留的分区、LVM、挂载点等
例如如下环境,通过`lsblk`命令查询,/dev/sda存在分区、挂载点和文件系统,ceph不会在/dev/sda上配置OSD;而/dev/sdb满足以上要求,是可用的存储设备
```bash
root@ubuntu:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 600G 0 disk
|-sda1 8:1 0 200G 0 part /boot/efi
|-sda2 8:2 0 400G 0 part /
sdb 8:16 0 600G 0 disk
```
ceph建议配置3个或更多节点,而且每个节点均要有可用的存储设备
请保证各个节点的系统纯净;如果节点上已安装过cephfs系统,请参考官方文档,完全清除节点上已有的ceph系统;否则,可能导致cephfs安装失败或性能下降
## 下载本工具
本工具只支持root用户,下载地址:[ceph-deploy](https://gitee.com/funnyfunny8/ceph-deploy)。2种下载方式:
1. 使用git clone
2. 下载[zip文件](https://gitee.com/funnyfunny8/ceph-deploy/repository/archive/master.zip)
然后联系工程师取得开源软件的ceph_resources.tar.gz离线安装包,将离线安装包解压在/root目录下。按如下方式放置
```bash
root@ubuntu:~# ls
ceph-deploy
ceph_resources //由ceph_resources.tar.gz解压得到,必须放置在/root目录下
ceph_resources.tar.gz
```
## 安装教程
### 步骤1:安装ansible
工具中包含一个install_ansible.sh文件用于安装ansible
在工具目录中执行:
```bash
root@ubuntu:~/ceph-deploy# bash install_ansible.sh
root@ubuntu:~/ceph-deploy# ansible --version
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0]
jinja version = 3.0.1
libyaml = True
```
ansible默认安装在系统自带python3(Ubuntu:python3.6.9)中,安装完成后执行ansible --version查看ansible是否安装成功
注意:如果执行中报错“error: python3 must be python3.6 provided by the system by default, check it by run 'python3 -V'”,可能原因是环境上设置了相关环境变量或软连接,导致python3指向了其他的python版本,请保证python3命令指向系统自带的python3.6.9
### 步骤2:配置集群信息
已下步骤均在playbooks目录下进行
在playbooks/inventory文件中,需要提前规划好如下集群信息:
1. 安装harbor的服务器ip。默认为本机localhost,可更改为其他服务器ip
2. ceph_localhost节点ip,只能为本机localhost,不可更改
3. ceph_otherhost节点ip。这里至少需要配置2个或2个以上的节点ip,不可包括localhost
```ini
[harbor]
localhost ansible_connection=local
[ceph_localhost]
localhost ansible_connection=local set_hostname="node-99"
[ceph_otherhost]
192.0.3.100 set_hostname="node-100"
192.0.3.101 set_hostname="node-101"
# 以上192.0.*.*等ip仅为示例,请修改为实际规划的ip地址
```
注意:
1. ceph要求集群内节点(ceph_localhost、ceph_otherhost)的hostname不一样,因此建议执行安装前设置所有设备使用不同的hostname。如果未统一设置且存在相同hostname的设备,那么可在inventory文件中设置set_hostname主机变量,安装过程将自动设置设备的hostname。hostname需满足ceph和ansible的格式要求,建议用“[a-z]-[0-9]”的格式,如“node-100”。
2. 多网卡场景下,为避免ansible找不到ip,建议给[ceph_localhost]和[ceph_otherhost]设置specified_ip主机变量,指定要使用的ip;[all:vars]设置harbor_host_ip主机组变量,指定harbor主机要使用的ip
```ini
[harbor]
localhost ansible_connection=local
[ceph_localhost]
localhost ansible_connection=local set_hostname="node-99" specified_ip="195.0.3.99"
[ceph_otherhost]
192.0.3.100 set_hostname="node-100" specified_ip="195.0.3.100"
192.0.3.101 set_hostname="node-101" specified_ip="195.0.3.101"
[all:vars]
harbor_host_ip="195.0.3.99"
# 以上192.0.*.*、195.0.*.*等ip仅为示例,请修改为实际规划的ip地址
# 多网卡场景下,建议给[ceph_localhost]和[ceph_otherhost]设置specified_ip主机变量,[all:vars]设置harbor_host_ip主机组变量
```
inventory_file文件配置详细可参考[[How to build your inventory — Ansible Documentation](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html)]
### 步骤3:配置安装信息
在playbooks/group_vars目录中的all.yaml文件
```yaml
# harbor https port
HARBOR_HTTPS_PORT: 7443
# harbor install path
HARBOR_PATH: /data/harbor
# password for harbor, can not be empty, delete immediately after finished
HARBOR_PASSWORD: ""
```
其中中配置项详细为:
| 配置项 | 说明 |
| ----------------- | ------------------------------------ |
| HARBOR_HTTPS_PORT | harbor的https监听端口,默认为7443 |
| HARBOR_PATH | Harbor的安装路径,默认为/data/harbor |
| HARBOR_PASSWORD | harbor的登录密码,不可为空,**必须配置**。**安装完成后应立即删除** |
注意:
1. harbor的登录用户名默认为admin。
### 步骤4:检查集群状态
如果playbooks/inventory_file内配置了非localhost的远程ip,根据ansible官方建议,请用户自行使用SSH密钥的方式连接到远程机器,可参考[[connection_details; Ansible Documentation](https://docs.ansible.com/ansible/latest/user_guide/connection_details.html#setting-up-ssh-keys)]
在playbooks目录中执行:
```bash
root@ubuntu:~/ceph-deploy/playbooks# ansible -i inventory_file all -m ping
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
worker1_ipaddres | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
```
当所有设备都能ping通,则表示inventory中所有设备连通性正常。否则,请检查设备的ssh连接和inventory文件配置是否正确
### 步骤5:执行安装
在playbooks目录中执行:
```bash
root@ubuntu:~/ceph-deploy/playbooks# ansible-playbook -i inventory_file all.yaml
```
注:
1. ceph节点不可重复初始化,执行本步骤前,请参考官方文档,完全清除节点上已有的ceph系统
3. 如果某节点docker.service配置了代理,则可能无法访问harbor镜像仓。使用本工具前,请先在`/etc/systemd/system/docker.service.d/proxy.conf`中NO_PROXY添加harbor host的ip,然后执行`systemctl daemon-reload && systemctl restart docker`生效
4. 如果inventory_file内配置了非localhost的远程ip,本工具会将本机的/root/ceph_resources目录分发到远程机器上。如果有重复执行以上命令的需求,可在以上命令后加`-e ceph_resources_no_copy=true`参数,避免重复执行耗时的~/ceph_resources目录打包、分发操作
### 步骤6:安装后检查
检查cephfs健康状态。cephfs把节点、磁盘纳入集群管理,正常需要等待几分钟甚至更长时间才会完成,跟节点数、磁盘数有关,完成后会变成HEALTH_OK状态。如果状态为HEALTH_WARN,可执行`ceph health detail`查看详情
```bash
root@ubuntu:~# ceph -s
cluster:
id: 50b8227e-0d50-11ed-bb57-024216e47cd6
health: HEALTH_OK
services:
mon: 3 daemons, quorum node-99,node-100,node-101 (age 3h)
mgr: node-99.iocujm(active, since 3h), standbys: node-100.vnrgda
mds: 1/1 daemons up, 1 standby
osd: 5 osds: 5 up (since 3h), 5 in (since 3h)
data:
volumes: 1/1 healthy
pools: 3 pools, 65 pgs
objects: 23 objects, 8.4 kiB
usage: 0 MiB used, 4.2 TiB / 4.2 TiB avail
pgs: 65 active+clean
```
cephfs默认3副本存储。例如以上cephfs总可用容量为4.2T,实际使用时不应超过1.4T(4.2/3)。
### 步骤7:挂载cephfs
创建cephfs的挂载目录,并手动挂载cephfs存储集群到该目录。为cephfs monitor节点ip,默认为"6789",默认为"admin",可在cephfs monitor节点通过`ceph auth get-key client.admin`命令查询
```bash
mkdir
mount -t ceph ::/ -o name=,secret=
```
cephfs monitor一般会部署多个节点上,建议挂载多个CEPHFS_IP,增加cephfs的高可用性,避免某个节点挂掉后挂载目录不可用;各个:之间通过","分隔,最后接上":/"
```bash
mkdir
mount -t ceph :,:,::/ -o name=,secret=
```
## 分步骤安装
playbooks目录下有很多文件,其中每个yaml文件对应一个组件,可以实现只安装某个组件
```bash
playbooks/
├── 01.resource.yaml # 分发/root/ceph_resources目录
├── 02.chrony.yaml # 安装chrony
├── 03.docker.yaml # 安装docker
├── 04.harbor.yaml # 安装harbor并登录
├── 05.push_image.yaml # 推送/root/ceph_resources/images里的开源镜像到harbor
├── 06.pull_image.yaml # 拉取部分开源镜像到各个节点
├── 07.ceph_install.yaml # 安装ceph
├── 08.ceph_bootsrap.yaml # 初始化ceph集群
├── 09.ceph_add_host.yaml # 添加其他ceph节点
├── 10.cephfs_create.yaml # 部署OSD,创建cephfs集群
```
例如:
1. 只分发软件包,则执行
```bash
root@ubuntu:~/ceph-deploy/playbooks# ansible-playbook -i inventory_file 01.resource.yaml
```
可在以上命令后加`-e ceph_resources_no_copy=true`参数,该参数作用请见步骤5:执行安装注意事项第3点
2. 只初始化ceph集群,则执行
```bash
root@ubuntu:~/ceph-deploy/playbooks# ansible-playbook -i inventory_file 08.ceph_bootsrap.yaml
```
ceph节点不可重复初始化,执行本步骤前,请参考官方文档,完全清除节点上已有的ceph系统
由于ansible的幂等性,除08.ceph_bootsrap.yaml步骤外,其他步骤均可以重复执行
3. 工具目录下的all.yaml为全量安装,安装效果跟依次执行01~10编号的yaml效果一致。实际安装时可根据需要对组件灵活删减
# FAQ
1. 执行`mount -t ceph ***`或k8s挂载cephfs时,报错"Operation not supported"
- A: 内核版本较低,不支持挂载Pacific(16.2.9)版本的cephfs集群。详见客户端节点内核版本要求
2. hostname自动改变
- A: 部分OS安装时自带cloud-init组件,该组件会自动设置hostname为某个默认值,可禁用此功能
```bash
vi /etc/cloud/cloud.cfg # 进入cloud-init的配置文件
将里面的"preserve_hostname: false" 改成 "preserve_hostname: true"
```