「入门部署」Ceph-ansible部署集群

Ceph-ansible部署踩坑日记

官方文档:https://docs.ceph.com/projects/ceph-ansible/en/latest/

Quick Deployment:快速部署

Important:

ceph-deploy 不再经常性维护, 并且在高于Nautilus的版本没有进行过测试。不推荐使用!

Cephadm:Cephadm完美支持新的编排API、CLI和仪表盘特性,可用于快速部署Octopus及更新版本的Ceph集群。Cephadm更加简单,且不依赖其它自动化部署工具,但该工具不支持部署旧版本的Ceph(如14的Nautilus),所有Ceph进程也是运行在容器中的,意味着在修改源码的情况下还需要制作新的镜像,比较麻烦。官方文档中指出,Cephadm暂时不推荐用于生产环境。

Rook:可以把Ceph部署在Kubernetes集群中运行。与1类似的是,Ceph也是运行在容器中的。

上述的两种方法都是容器部署

第三方部署工具

【推荐👍】 ceph-ansible. 它被广泛使用。ceph-ansible未与Nautlius和Octopus中引入的新的Orchestrator API集成在一起,这意味着更新的管理功能和仪表板集成不可用。

DeepSea使用Salt安装Ceph。

jaas.ai/ceph-mon使用Juju安装Ceph。

github.com/openstack/puppet-ceph 通过Puppet安装Ceph。

官方的最低要求是 3 Monitors + 3 Managers + 3 OSDs 。 我们尝试用虚拟机搭建最小集群。

在运行ceph-mon守护程序的每个节点上,还应该设置一个ceph-mgr守护程序。

虚拟机节点名称 职责 IP地址
ceph-master (w/ source-code compiled) mon0 + mgr0+osd0(部署节点) 192.168.161.134
ceph-node1 mon1+mgr1 192.168.161.130
ceph-node2 mon2+mgr2 192.168.161.131
ceph-osd1 osd1 192.168.161.132
ceph-osd2 osd2 192.168.161.133

小技巧:我们可以先在1台虚拟机上配置好通用的预备环境,再克隆出另外的2台,随后调整部分配置后即可(如IP、主机名等)。克隆后记得重新生成网卡MAC地址

安装前准备

关闭firewalld,设置selinux为disabled状态,设置ssh免密登录,配置时钟同步服务。

sudo ufw status#查看防火墙状态 active:开启 inactive:关闭
# mon作为控制节点
sudo apt install openssh-server
ssh-keygen -t rsa 
ssh-copy-id {hostname}@{ip}#复制密钥到各节点
ssh {hostname}@{ip}

mon节点作为时钟同步节点

sudo apt install ntp
sudo vim /etc/ntp.conf
#在/etc/ntp.conf添加
#server 127.127.1.0
#fudge 127.127.1.0 stratum 10
#并注释下列四行
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

在其它节点

sudo apt install ntpdate openssh-server --assume-yes
sudo /etc/init.d/ntp restart 
sudo systemctl enable ntp.service #启动ntp
sudo ntpdate {mon-hostname}

会得到矫正的时间

Nov 06:31:02 ntpdate[8540]: adjust time server 192.168.161.129 offset 0.097653 sec

有可能出现 name or server not known 错误

在每个节点 \etc\hosts 加入所有其它节点映射,比如

192.168.161.129  ceph-master

再ping 或者 nslookup测试一下就行。

不要在同一个节点同时安装ntp和ntpdate

另一种方法是直接和aliyun服务器同步,在ntp.conf末尾加上server ntp.aliyun.com

再重启

sudo /etc/init.d/ntp restart

ceph-ansible 😁

参考:https://www.cnblogs.com/zyxnhr/p/10543814.html 写的非常细致。

https://blog.csdn.net/liuzhupeng/article/details/106767126

三要素:inventory file, playbook and configuration。

Dependency: python2所有节点

首先测试能否连通其它节点

ansible all -m ping #注意这儿不能加sudo,否则会permission denied

如果没有问题

node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
node3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
  1. 我们首先安装ceph-ansble.

git clone https://github.com/ceph/ceph-ansible.git
git checkout $branch #默认master分支
pip install -r requirements.txt 
sudo apt install ansible
  1. 再配置inventory

在 /etc/ansible/下创建hosts文件,clients节点不应该与mon osd等重叠。在最新版本,还需要设置[monitoring]. 个人感觉和mon节点设成一样就行了。

[mons]
node1
node2
node3

[osds]
node1
node2
node3

[rgws]
node1
node2
node3

[clients]
node4
node5

[mgrs]
node1
node2
node3

[monitoring]
node1
node2
node3
  1. 然后在下载下来的ansible目录下拷贝文件,根据节点的角色拷贝具体的文件
#除了site.yml.sample,all.yml.sample是必须要修改的之外,其他文件根据要安装的角色自行修改

cp site.yml.sample site.yml

cp group_vars/osds.yml.sample group_vars/osds.yml

cp group_vars/clients.yml.sample group_vars/clients.yml

cp group_vars/mons.yml.sample group_vars/mons.yml

cp group_vars/mgrs.yml.sample group_vars/mgrs.yml

cp group_vars/all.yml.sample group_vars/all.yml
  1. 配置all.yml

我们需要修改osds.yml部分:

--
dummy:
ceph_release_num:
  octopus: 15
cluster: ceph-test
ceph_origin: repository
ceph_repository: community
ceph_mirror: https://mirrors.aliyun.com/ceph/
ceph_stable_key: https://mirrors.aliyun.com/ceph/keys/release.asc
ceph_stable_release: octopus
monitor_interface: ens33
monitor_address: 192.168.161.135
ip_version: ipv4
public_network: 192.168.161.0/24
cluster_network: "{{ public_network | regex_replace(' ', '') }}"
osd_mkfs_type: xfs
osd_mkfs_options_xfs: -f -i size=2048
osd_mount_options_xfs: noatime,largeio,inode64,swalloc
osd_objectstore: bluestore
dashboard_enabled: False

devices:指定osd使用的硬盘

osd_scenario:collocated启用并置journal 【笔者没有找到】

下面是一些trick

$ sudo fdisk -l #查看磁盘信息

查看你的更改

$grep -v '^#' all.yml | grep -v '^&' all.yml

或者查看所有修改后文件

grep -Ev "^$|^\s*#"  *.yml
  1. 配置osd

devices:
   - /dev/vdb
   - /dev/vdc
   - /dev/vdd
  1. 定义ansible的入口文件

- hosts:
  - mons
#  - agents
  - osds
#  - mdss
#  - rgws
#  - nfss
#  - restapis
#  - rbdmirrors
  - clients
  - mgrs
#  - iscsi-gws
  1. 安装

ansible-playbook  site.yml #注意同样没有sudo
PLAY RECAP *********************************************************************
node1                      : ok=340  changed=33   unreachable=0    failed=0    skipped=547  rescued=0    ignored=0   
node2                      : ok=109  changed=12   unreachable=0    failed=0    skipped=261  rescued=0    ignored=0   
node3                      : ok=112  changed=12   unreachable=0    failed=0    skipped=260  rescued=0    ignored=0   


INSTALLER STATUS ***************************************************************
Install Ceph Monitor           : Complete (0:00:32)
Install Ceph Manager           : Complete (0:00:09)
Install Ceph OSD               : Complete (0:00:34)
Install Ceph Client            : Complete (0:00:31)

如果failed=1那就说明安装失败,你需要根据错误进行修改,如果打印的信息太少,你可以使用

ansible-playbook -vvv site.yml

来打印更多信息。

  1. 测试

接下来我们看看集群健康状况 ,在ceph-mon节点执行

ceph -s

有可能会提示ceph RADOS object not found. 笔者怀疑是 /etc/ceph/下的conf文件名不是ceph所以导致无法识别出集群,后来干脆把集群名字改成ceph。是不是很傻X呢?

cluster:
  id:     0d3c793b-1ee0-43ca-8f28-6dbf695578cf
  health: HEALTH_OK
 
services:
  mon: 1 daemons, quorum node2 (age 5m)
  mgr: node2(active, since 5m)
  mds: cephfs:1 {0=node3=up:active} 2 up:standby
  osd: 3 osds: 3 up (since 3m), 3 in (since 4m)
 
task status:
  scrub status:
      mds.node3: idle
 
data:
  pools:   3 pools, 65 pgs
  objects: 22 objects, 2.2 KiB
  usage:   3.0 GiB used, 57 GiB / 60 GiB avail
  pgs:     65 active+clean

以及sudo fidsk -l 查看osd分配磁盘。

查看osd 拓扑。这有助于我们理解CRUSH算法。

sudo ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME       STATUS  REWEIGHT  PRI-AFF
-1         0.05846  root default                             
-5         0.01949      host node3                           
 1    ssd  0.01949          osd.1       up   1.00000  1.00000
-3         0.01949      host node4                           
 0    ssd  0.01949          osd.0       up   1.00000  1.00000
-7         0.01949      host node5                           
 2    ssd  0.01949          osd.2       up   1.00000  1.00000

EOF


优质博文参考:https://blog.51cto.com/14210294/2353243

https://www.cnblogs.com/zyxnhr/p/10543814.html


Trouble Shooting

  1. Devices are not disjoint

设备存在交集。如果存储方式是bluestore, 那么block,wal和db必须是不同的存储盘。并且:

$ mount | grep osd
tmpfs on /var/lib/ceph/osd/ceph-0 type tmpfs (rw,relatime,seclabel)
$ ls -Alh /var/lib/ceph/osd/ceph-0
lrwxrwxrwx. 1 ceph ceph 19 Apr  7 21:36 block -> /dev/ceph-pool/osd0
lrwxrwxrwx. 1 root root 22 Apr  7 21:36 block.db -> /dev/ceph-pool/osd0.db
lrwxrwxrwx. 1 root root 23 Apr  7 21:36 block.wal -> /dev/ceph-pool/osd0.wal
-rw-------. 1 ceph ceph 37 Apr  7 21:36 ceph_fsid
-rw-------. 1 ceph ceph 37 Apr  7 21:36 fsid
-rw-------. 1 ceph ceph 55 Apr  7 21:36 keyring
-rw-------. 1 ceph ceph  6 Apr  7 21:36 ready
-rw-------. 1 ceph ceph 10 Apr  7 21:36 type
-rw-------. 1 ceph ceph  2 Apr  7 21:36 whoami