0%

基于ceph-depoy和cephadm安装ceph

[TOC]

文档

推荐方法

Cephadm

Cephadm是一个可用于安装和管理 Ceph 集群的工具。

  • cephadm 仅支持 Octopus 和较新版本。
  • cephadm 与业务流程 API 完全集成,并完全支持用于管理集群部署的 CLI 和仪表板功能。
  • cephadm 需要容器支持(以 Podman 或 Docker 的形式)和 Python 3。

Rook可部署和管理在 Kubernetes 中运行的 Ceph 集群,同时还支持通过 Kubernetes API 管理存储资源和配置。我们建议使用 Rook 在 Kubernetes 中运行 Ceph 或将现有 Ceph 存储集群连接到 Kubernetes。

  • Rook 仅支持 Nautilus 和较新版本的 Ceph。
  • Rook 是在 Kubernetes 上运行 Ceph 或将 Kubernetes 集群连接到现有(外部)Ceph 集群的首选方法。
  • Rook 支持 Orchestrator API。CLI 和仪表板中的管理功能完全受支持。

其他方法

ceph-ansible使用 Ansible 部署和管理 Ceph 集群。

  • ceph-ansible 被广泛部署。
  • ceph-ansible 未与 Nautilus 和 Octopus 中引入的编排器 API (orchestrator APIs)集成,这意味着 Nautilus 和 Octopus 中引入的管理功能和仪表板集成在通过 ceph-ansible 部署的 Ceph 集群中不可用。

ceph-deploy是一款可用于快速部署集群的工具。现已弃用。

重要的

ceph-deploy 并未得到积极维护。它未在 Nautilus 以上版本的 Ceph 上进行测试。它不支持 RHEL8、CentOS 8 或更新的操作系统。

ceph-salt使用 Salt 和 cephadm 安装 Ceph。

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

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

OpenNebula HCI集群在各种云平台上部署Ceph。

Ceph 也可以手动安装

参考

系统设置

查看版本信息

1
2
3
4
cat /etc/issue

# 查看系统信息命令
cat /etc/os-release

修改用户名一定要修改密码

  • 一定要设置root密码
  • nodexx 主机名,用户密码

用户名

1
2
3
4
5
6
7
8
hostname #查看系统主机名称
node01@ hostnamectl set-hostname node01
node02@ hostnamectl set-hostname node02

hostnamectl set-hostname xx #修改主机名称
#执行命令之后,会自动修改 /etc/hostname 文件
#执行命令之后,会立即生效,且重启系统也会生效
cat /etc/hostname #查看 /etc/hostname 文件内容,里面配置的就是系统主机名称
1
2
3
4
5
6
7
sudo su
sudo gedit /etc/passwd # 找到原先的用户名,将其改为自己的用户名(一行全部都改)
sudo gedit /etc/shadow #找到原先用户名(所有的名字都要改),改为自己的用户名
sudo gedit /etc/group #你应该发现你的用户名在很多个组中,全部修改!
mv /home/原用户名/ /home/新用户名

mv /home/ceph_admin/ /home/

密码(登录用户需要修改)

  1. 进入Ubuntu,打开一个终端,输入 sudo su转为root用户。 注意,必须先转为root用户!!!
  2. sudo passwd user(user 是对应的用户名)
  3. 输入新密码,确认密码。
  4. 修改密码成功,重启,输入新密码进入Ubuntu。

规划

1
2
ens33:NAT网络 VMnet8 公网ip设定为192.168.192.0/24 网段
ens37:仅主机 VMnet1 私有ip设定为10.168.192.0/24 网段,提供ceph集群内网络
主机名role公有网络私有网络磁盘
node1admin/mon/mgr/osd1192.168.192.15610.168.192.156sda50GB,sdb/sdc20GB
node2mon/mgr/osd3/osd4192.168.192.15710.168.192.157sda50GB,sdb/sdc20GB

主机名ip映射

在所有主机下配置以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
cat >> /etc/hosts <<EOF
# public network
192.168.192.156 node01
192.168.192.157 node02

# cluster network
10.168.192.156 node01-cl
10.168.192.157 node02-cl

# manage network
EOF

cat /etc/hosts

静态ip

配置ip与网关

1
2
3
4
5
6
# 查看当前网关 ip
netstat -rn
ip a

# 添加DNS解析,任意添加一个
vim /etc/resolv.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apt upgrade -y
sudo apt install -y net-tools
ifconfig #查看网卡名称
ip a

cd /etc/netplan
sudo gedit 01-network-manager-all.yaml

network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: false
addresses: [192.168.192.156/24]
gateway4: 192.168.192.2
nameservers:
addresses: [192.168.192.2]
ens34:
dhcp4: false
addresses: [10.168.192.156/24]
nameservers:
addresses: [10.168.192.2]

network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: false
addresses: [192.168.192.157/24]
gateway4: 192.168.192.2
nameservers:
addresses: [192.168.192.2]
ens34:
dhcp4: false
addresses: [10.168.192.157/24]
nameservers:
addresses: [10.168.192.2]

sudo netplan apply

时间同步

所有节点都安装chrony

1
2
yum -y install chrony
systemctl enable chronyd

ceph01作为时间同步服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
vim /etc/chrony.conf

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
pool ntp1.aliyun.com iburst
pool ntp2.aliyun.com iburst
pool ntp3.aliyun.com iburst
pool ntp4.aliyun.com iburst
pool ntp5.aliyun.com iburst
pool ntp6.aliyun.com iburst


# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

local stratum 10

# Allow NTP client access from local network.
# 将自身当做服务器
allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.

重启服务

1
2
3
4
5
6
7
8
9
10
# redhat
systemctl enable chronyd
systemctl restart chronyd

# debian 重启服务
systemctl restart chrony
systemctl status chrony
systemctl enable chrony

chronyc sources

image-20240604181258344

1
2
3
4
5
6
7
8
9
10
[root@ceph01 ~]# timedatectl
Local time: 二 2024-06-04 18:10:34 CST
Universal time: 二 2024-06-04 10:10:34 UTC
RTC time: 二 2024-06-04 10:10:33
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes # 主要看这里
NTP service: active
RTC in local TZ: no
[root@ceph01 ~]# date
2024年 06月 04日 星期二 18:10:41 CST

ceph2及其他后续节点作为客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
vim /etc/chrony.conf

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool ceph01 iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
#local stratum 10

# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys

# Get TAI-UTC offset and leap seconds from the system tz database.
#leapsectz right/UTC

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking

其他节点重启服务

1
systemctl restart chronyd

使用时间服务的客户端进行验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
chronyc sources -v
[root@ceph02 ~]# chronyc sources -v
210 Number of sources = 1

.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ceph01-cl 3 6 17 5 -215ns[-1620ns] +/- 73ms

https://blog.csdn.net/weixin_64334766/article/details/128536776

1
2
3
4
5
6
7
8
9
10
11
*表示chronyd当前已经同步到的源。

+表示可接受的信号源,与选定的信号源组合在一起。

-表示被合并算法排除的可接受源

?指已失去连接性或者其数据包未通过所有测试的源。

x表示chronyd认为时虚假行情的时钟,即标记该时间与其他多数时间不一致

~表示时间似乎具有太多可变性

设置时区

1
2
#ubuntu
timedatectl set-timezone Asia/Shanghai

防火墙与SELinux

详见 LInux防火墙

1
2
3
4
5
6
7
8
9
10
11
12
# 若ubuntu上不支持,可先安装sudo apt install -y firewalld
firewall-cmd --state

sudo apt -y install firewalld
firewall-cmd --zone=public --add-port=6789/tcp --permanent
firewall-cmd --zone=public --add-port=6800-7100/tcp --permanent

firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp

firewall-cmd --reload
firewall-cmd --zone=public --list-all

若只是测试环境,可以关闭防火墙

1
2
3
4
5
6
7
8
# ubuntu
sudo systemctl disable ufw.service

sudo ufw status
# 关闭防火墙
ufw stop
# 防火墙在系统启动时自动禁用
ufw disable

所有虚拟主机上禁用SELINUX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apt install -y selinux-utils

sudo apt install -y selinux-basics
sudo selinux-activate --disable

#临时禁用
setenforce 0

#永久禁用
vim /etc/selinux/config
# cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
SETLOCALDEFS=0

node02@node02:~$ sestatus
SELinux status: disabled

centos源配置

安装epel相关repo包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 移除epel
rpm -e epel-release

# 更新centos8对应repo
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 更新centos7对应repo
#wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# 通过rpm安装epel
rpm -ivh --nodeps epel-release-latest-8.noarch.rpm
# rpm -ivh --nodeps epel-release-latest-7.noarch.rpm

# 将repo配置中的地址替换为清华源
# https://mirrors.tuna.tsinghua.edu.cn/help/epel/
sed -e 's!^metalink=!#metalink=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!https\?://download\.fedoraproject\.org/pub/epel!https://mirrors.tuna.tsinghua.edu.cn/epel!g' \
-e 's!https\?://download\.example/pub/epel!https://mirrors.tuna.tsinghua.edu.cn/epel!g' \
-i /etc/yum.repos.d/epel{,-testing}.repo

# 下载epel配置包
yum install epel-release -y

# 安装好EPEL 源后,检查是否添加到源列表
[root@ceph01 yum.repos.d]# yum repolist
repo id repo name
epel Extra Packages for Enterprise Linux 8 - aarch64
ks10-adv-cdrom Kylin Linux Advanced Server 10 - cdrom
ks10-adv-os Kylin Linux Advanced Server 10 - Os

# 安装好后,需要清除 yum 缓存、生成新的 yum 缓存、更新 yum
yum clean all
yum makecache
yum update
  • EL 是 Red Hat Enterprise Linux(EL)的缩写
    • EL5 是 Red Hat 5. X,CentOS 5. X
    • EL6 是 Red Hat 6. X,CentOS 6. X
    • EL7 是 Red Hat 7. X,CentOS 7. X
    • EL8 是 Red Hat 8. X,CentOS 8. X
  • 在 Linux 环境中,RPM 包分为几种不同的架构,包括 aarch64noarchx86_64

    • srpms :包含软件源代码的 RPM 包
    • aarch64 :64 位的 ARM CPU 架构,通常用于 ARM 架构的处理器。
    • x86_64 : 64 位的 CPU 架构,主要用于 AMD 和 Intel 生产的处理器
    • noarch :表示软件包不依赖于任何特定的硬件架构

      通常不包含可执行的二进制文件,适用于那些不依赖于硬件架构的软件包

节点间ssh免密登录

实现基于ssh key的免密登录

实现root用户的ssh免密登录

1
2
3
4
5
6
7
8
9
sudo apt install openssh-server -y

ssh

vim /etc/ssh/sshd_config
# Allow Root Login
PermitRootLogin yes

service sshd restart

image-20240423100309821

通过sshpass为每个主机生成sshkey并推送给hosts中已知主机

1
2
sudo apt -y install sshpass
vim ssh_key_push.sh

原理

  1. scan_host 生成已知主机的IP,记录到 SCANIP.log

    1
    2
    3
    # SCANIP.log
    192.168.5.210
    192.168.5.211

    本例中 SCANIP.log 只使用与ubuntu,对于其他系统,若是NIC信息输出格式不一致,也可手动生成 ,并删除bash中的调用

  2. push_ssh_key 读取IP列表,并利用sshpass将当前主机的公钥和免输 “yes” 配置推送到列表中的所有主机

在每个主机root用户下执行以下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
#
#********************************************************************
#Author: wangxiaochun
#QQ: 29308620
#Date: 2021-05-08
#FileName: ssh_key_push.sh
#URL: http://www.wangxiaochun.com
#Description: 多主机基于ssh key 互相验证
#Copyright (C): 2021 All rights reserved
#********************************************************************

#当前用户密码
PASS=admin
#设置网段最小和最大的地址的尾数
BEGIN=156
END=157
# 网卡名
NIC=ens33

IP=`ip a s ${NIC} | awk -F'[ /]+' 'NR==4{print $3}'`
NET=${IP%.*}.

scan_host() {
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=$BEGIN;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
}

push_ssh_key() {
#生成ssh key
[ -e ~/.ssh/id_rsa ] || ssh-keygen -P "" -f ~/.ssh/id_rsa
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no root@$IP &>/dev/null

ip_list=(`sort -t . -k 4 -n SCANIP.log`)
for ip in ${ip_list[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r ~/.ssh root@${ip}: &>/dev/null
done

#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入yes回车
for ip in ${ip_list[*]};do
scp ~/.ssh/known_hosts @${ip}:.ssh/ &>/dev/null
done
}

scan_host
push_ssh_key
1
2
# 需要再所有主机上执行
bash ssh_key_push.sh

所有主机通过cephadm实现免密登录

创建cephadm用户

只需要在一台主机上执行

1
2
3
4
5
6
7
8
9
10
11
12
#用脚本实现批量创建用户
cat > create_cephadm.sh <<EOF
# !/bin/bash
# 设定普通用户
useradd -m -s /bin/bash cephadm
echo cephadm:admin | chpasswd
echo "cephadm ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/cephadm
chmod 0440 /etc/sudoers.d/cephadm
EOF

#批量执行
for i in {150..152}; do ssh root@192.168.192.$i bash < create_cephadm.sh ; done

检测是否创建用户

1
2
ll /etc/passwd
cat /etc/passwd

跨主机免密登录

只需要在一台主机上执行

1
2
3
4
5
6
7
8
9
10
11
12
su - cephadm
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

PASS=admin
for i in {150..152};do
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no cephadm@192.168.192.$i
done

root@node1:~# PASS=admin
root@node1:~# for i in {150..152};do
> sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no root@192.168.192.$i
> done

ceph-deploy

1
2
3
4
5
6
7
8
9
10
无法获得锁 /var/lib/dpkg/lock-frontend

# 检查进程:检查是否有其他 dpkg 或 apt 进程正在运行:
sudo lsof /var/lib/dpkg/lock-frontend

# 结束进程:如果有进程正在运行,您可以选择等待它完成,或者如果您确定它是卡住的,可以尝试结束该进程:
sudo kill <PID>

# 清理锁定文件,如果进程已经结束,但锁定文件仍然存在,可能是因为上次操作没有正确清理。在这种情况下,您可以尝试手动删除锁定文件:
sudo rm /var/lib/dpkg/lock-frontend

ceph-deploy文档

安装N版及以下的版本,照着https://www.cnblogs.com/renato/p/12841005.html就行

安装O版需要先用epel8,安装ceph-deploy 2.0.1,再换回el7,套用上述安装步骤

https://docs.ceph.com/en/pacific/man/8/ceph-deploy/#cmdoption-ceph-deploy-repo-url

https://docs.ceph.com/projects/ceph-deploy/en/latest/#python-package-index

admin节点安装ceph-deploy工具

切到cephadm用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#安装
cephadm@admin:~$sudo apt-cache madison ceph-deploy # 查看版本
cephadm@admin:~$sudo apt -y install ceph-deploy

#验证成功和查看版本
cephadm@admin:~$ceph-deploy --version
2.0.1

#查看帮助手册
cephadm@admin:~$ceph-deploy --help
# new:开始部署一个新的ceph 存储集群,并生成CLUSTER.conf 集群配置文件和keyring 认证文件。
#install: 在远程主机上安装ceph 相关的软件包, 可以通过--release 指定安装的版本。
# rgw:管理RGW 守护程序(RADOSGW,对象存储网关)。
# mgr:管理MGR 守护程序(ceph-mgr,Ceph Manager DaemonCeph 管理器守护程序)。
# mds:管理MDS 守护程序(Ceph Metadata Server,ceph 源数据服务器)。
# mon:管理MON 守护程序(ceph-mon,ceph 监视器)。
#gatherkeys:从指定的获取提供新节点验证keys,这些keys 会在添加新的MON/OSD/MD 加入的时候使用。
# disk:管理远程主机磁盘。
# osd:在远程主机准备数据磁盘,即将指定远程主机的指定磁盘添加到ceph 集群作为osd 使用。
# repo: 远程主机仓库管理。
# admin:推送ceph集群配置文件和client.admin 认证文件到远程主机。
# config:将ceph.conf 配置文件推送到远程主机或从远程主机拷贝。
# uninstall:从远端主机删除安装包。
# urgedata:从/var/lib/ceph 删除ceph 数据,会删除/etc/ceph 下的内容。
# purge: 删除远端主机的安装包和所有数据。
# forgetkeys:从本地主机删除所有的验证keyring, 包括client.admin, monitor, bootstrap 等认证文件。
# pkg: 管理远端主机的安装包。
# calamari:安装并配置一个calamari web 节点,calamari 是一个web 监控平台。

ceph-deploy对集群初始化

生成集群配置,并未做实际安装

初始化第一个mon节点的命令格式为 ceph-deploy new {initial-monitor-node(s)}

  • ceph-mon 即为第一个monitor节点名称,其名称必须与节点当前实际使用的主机名称( uname -n ) 保持一致,即可以是短名称,也可以是长名称

    但短名称会导致错误: ceph-deploy new: error: hostname: xxx is not resolvable

  • 推荐使用完整写法:hostname:fqdn 如:ceph-mon:ceph-mon.wang.org

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#首先在管理节点上以cephadm用户创建集群相关的配置文件目录
cephadm@node1:~$ mkdir ceph-cluster && cd ceph-cluster
# 查看主机名
cephadm@node1:~$ mkdir ceph-cluster && cd ceph-cluster
node1

#运行如下命令即可生成初始配置:
cephadm@node1:~/ceph-cluster$ ceph-deploy new --public-network 192.168.192.0/24 --cluster-network 192.168.252.0/24 node1 node2 node3

cephadm@admin:~/ceph-cluster$ ceph-deploy new --public-network 192.168.192.0/24 --cluster-network 192.168.252.0/24 node1
# ceph.conf #自动生成的配置文件
# ceph-deploy-ceph.log #初始化日志
# ceph.mon.keyring #用于ceph mon 节点内部通讯认证的秘钥环文件

若是el7安装N及O,出现need_ssh
--no-ssh-copykey

image-20240424015543853

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cephadm@node1:~/ceph-cluster$ cat ceph.conf
[global]
fsid = 96a78567-2c73-4b65-adf1-fb8a3c18766a
public_network = 192.168.192.0/24
cluster_network = 192.168.252.0/24
mon_initial_members = node1
mon_host = 192.168.192.150
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

#如果想要一下子将所有的mon节点都部署出来,我们可以执行下面的命令
ceph-deploy new --public-network 192.168.192.130/24 --cluster-network 192.168.252.0/24 mon01 mon02 mon03

cephadm@admin:~/ceph-cluster$ cat ceph.conf
[global]
fsid = a168efb2-3012-48b3-aac7-31a11c232235
public_network = 192.168.192.130/24
cluster_network = 192.168.252.0/24
mon_initial_members = mon01, mon02, mon03
mon_host = 192.168.192.131,192.168.192.132,192.168.192.133
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

ceph包的安装——不推荐用ceph-deploy install

为所有节点配置ceph包安装源

ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#在管理节点准备脚本,注意以root身份执行
root@node1:cat > ceph_repo.sh <<EOF
#!/bin/bash
# 更新ceph的软件源信息
echo "deb https://mirror.tuna.tsinghua.edu.cn/ceph/debian-quincy/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ceph.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
EOF

#!/bin/bash
# 更新ceph的软件源信息
echo "deb https://mirror.tuna.tsinghua.edu.cn/ceph/debian-pacific/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ceph.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
EOF

#因为所有节点都会依赖于这些apt源信息,需要进行同步
[root@admin ~]for i in {150..152};do ssh -o StrictHostKeyChecking=no 192.168.192.$i bash < ceph_repo.sh;done

# 去其他结点查看
cat /etc/apt/sources.list.d/ceph.list

image-20240423115746284

image-20240423115801278

centos

https://www.cnblogs.com/zphj1987/p/13575358.html

修改ceph源

1
2
3
4
5
6
# rpm --import 'https://download.ceph.com/keys/release.asc'
rpm --import 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc'

# rpm -ivh https://download.ceph.com/rpm-17.2.7/el8/noarch/ceph-release-1-1.el8.noarch.rpm
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-17.2.7/el8/noarch/ceph-release-1-1.el8.noarch.rpm
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm

配置ceph.repo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[ceph]
name=ceph
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-17.2.7/el8/x86_64/
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
#baseurl=https://mirrors.aliyun.com/ceph/rpm-pacific/el8/noarch/
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-17.2.7/el8/noarch/
gpgcheck=0
priority=1

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-17.2.7/el8/SRPMS
enabled=0
gpgcheck=1
priority=1
type=rpm-md
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc

ceph-deploy install指令介绍

初始化节点相当于在存储节点安装了ceph 及ceph-rodsgw

  • 默认情况下,ceph-deploy会安装最新版本的ceph,若需要指定ceph版本,添加参数 --release {ceph-release-name}
1
2
3
4
5
6
7
8
9
10
11
#命令格式:
ceph-deploy install --{role} {node} [{node} ...]
#注意:这里主要是ceph的工作角色的的节点
#方法1:使用ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作
# 一般情况下,不推荐使用这种直接的方法来进行安装,效率太低,实际上也是在各节点上执行方法2
ceph-deploy install --mon mon01 mon02 mon03

ceph-deploy install --repo-url=http://mirrors.aliyun.com/ceph/rpm-<版本号>/el7/ --gpg-url=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 <host-name>

#方法2:上述指令等价在每个ceph-node节点安装 ceph-{role}
apt install -y ceph ceph-osd ceph-mds ceph-mon radosgw

image-20240423215726912

image-20240423215900896

image-20240423220028750

mon节点

安装mon节点依赖

1
2
3
4
5
6
7
#在admin主机上,向mon节点安装mon组件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --no-adjust-repos --nogpgcheck --mon mon01 mon02 mon03

[root@lab8106 ~]# ceph-deploy install kylin01 --repo-url=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-quincy/el8/ --gpg-url=https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.gpg

#或者直接在mon节点安装软件
[root@ceph-mon ~] apt -y install ceph-mon

安装完成后,发现自动创建了ceph用户

1
2
cephadm@node1:~/ceph-cluster$ getent passwd ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/usr/sbin/nologin

image-20240423220250108

验证在mon 节点已经自动安装并启动了ceph-mon 服务

1
2
cephadm@node1:~/ceph-cluster$ dpkg -l |grep ceph
cephadm@node1:~/ceph-cluster$ ps aux|grep ceph

image-20240423220330144

初始化mon节点生成配置信息

确定集群配置信息,根据集群规划修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vim ceph.conf

若是3mon节点
[global]
fsid = a168efb2-3012-48b3-aac7-31a11c232235
public_network = 192.168.192.130/24
cluster_network = 192.168.252.0/24
mon_initial_members = mon01, mon02, mon03
mon_host = 192.168.192.131,192.168.192.132,192.168.192.133
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

单mon节点
[global]
fsid = 7d8af3fe-089e-40ee-85d0-2854ff3c1631
public_network = 192.168.192.0/24
cluster_network = 192.168.252.0/24
mon_initial_members = ceph-mon
mon_host = 192.168.192.120
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

初始化集群mon节点

1
cephadm@node1:~/ceph-cluster$ ceph-deploy --overwrite-conf mon create-initial

查看生成的配置文件

  • 节点初始化会生成一些ceph.bootstrap -mds/mgr/osd/rgw 等服务的keyring 认证文件,这些初始化文件拥有对ceph 集群的最高权限,所以一定要保存好。
1
2
3
4
5
6
7
8
9
10
11
12
cephadm@node1:~/ceph-cluster$ ll

ceph.bootstrap-mds.keyring 引导启动 mds的密钥文件
ceph.bootstrap-mgr.keyring 引导启动 mgr的密钥文件
ceph.bootstrap-osd.keyring 引导启动 osd的密钥文件
ceph.bootstrap-rgw.keyring 引导启动 rgw的密钥文件
ceph.client.admin.keyring ceph客户端和管理端通信的认证密钥,是最重要的
ceph.conf
ceph-deploy-ceph.log
ceph.mon.keyring
#结果显示:这里生成了一系列的与ceph集群相关的 认证文件
#注意:ceph.client.admin.keyring 拥有ceph集群的所有权限,一定不能有误。
  • 此时在mon节点启动了一些进程
1
2
#到mon的节点上查看mon的自动开启相应的守护进程
[root@mon01 ~]ps aux|grep ceph

image-20240423220754587

1
2
cephadm@node1:~/ceph-cluster$ ls /etc/ceph/
ceph.conf rbdmap tmp_knw2l2z

image-20240424021222677

向admin节点推送admin密钥

在admin角色的主机上,把配置文件和admin密钥拷贝到Ceph集群各监控角色节点mon

  • 注意:原则上要求:所有mon节点上的 ceph.conf 内容必须一致,如果不一致的话,可以通过下面命令同步

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ceph-deploy --overwrite-conf config push node1 node2 node3 n

    #集群admin节点的认证文件分发到admin节点
    ceph-deploy admin {admin-node}

    ceph-deploy admin --help
    #usage: ceph-deploy admin [-h] HOST [HOST ...]
    #Push configuration and client.admin key to a remote host.
    #positional arguments:
    # HOST host to configure for Ceph administration
    #optional arguments:
    # -h, --help show this help message and exit

在mon节点实现集群管理

1
2
3
4
5
6
7
8
9
10
#分发admin认证前,
cephadm@node1:~/ceph-cluster$ ls /etc/ceph/
ceph.conf rbdmap tmpaagml4w1

cephadm@node1:~/ceph-cluster$ ceph-deploy admin node1
cephadm@node1:~/ceph-cluster$ ls /etc/ceph/
ceph.client.admin.keyring ceph.conf rbdmap tmpaagml4w1

结果显示:这里多了一个 ceph的客户端与服务端进行认证的密钥文件了
# ceph.client.admin.keyring 主要用于ceph节点与管理端的一个通信认证。

问题:虽然我们把认证文件传递给对应的admin主机了,但是admin节点是通过普通用户cephadm来进行交流的。而默认情况下,传递过去的认证文件,cephadm普通用户是无法正常访问的

1
2
3
#cephadm用户执行命令因文件权限会出错
[root@node1 ~] su - cephadm
cephadm@node1:~/ceph-cluster$ ceph -s

image-20240423132945409

在集群中需要运行ceph指令的节点上,为cephadm用户设置/etc/ceph/ceph.client.admin.keyring文件权限

1
2
cephadm@node1:~/ceph-cluster$ sudo apt install acl
cephadm@node1:~/ceph-cluster$ sudo setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring

此时cephadm用户有了集群的管理权限

1
2
3
4
5
#消除 mon is allowing insecure global_id reclaim的报警信息
cephadm@node1:~/ceph-cluster$ ceph config set mon auth_allow_insecure_global_id_reclaim false

#再次查看没有告警信息
cephadm@node1:~/ceph-cluster$ ceph -s

image-20240424030727092

mgr节点

Ceph-MGR工作的模式是事件驱动型的,简单来说,就是等待事件,事件来了则处理事件返回结果,又继续等待。

对于测试环境其实一个就能够正常使用了

安装mgr节点依赖

image-20240423221447871

1
2
3
4
ceph-deploy install --mgr node2
cephadm@node2:~$ getent passwd ceph

dpkg -l |grep ceph# 之前是没有的,安装之后,多了

image-20240423222058555

且进程启动

image-20240423222156128

将mgr节点加入集群

在 admin 节点的 /ceph-cluster 目录下执行

1
2
3
cephadm@ceph-mon:~/ceph-cluster$ ceph-deploy mgr create node2

#自动在mgr01节点生成配置文件和用户

防火墙没关

1
2
3
4
systemctl status firewalld
systemctl stop firewalld
systemctl disabled firewalld
systemctl disable firewalld

image-20240424025322420

image-20240424031046905

osd节点

要设置OSD环境,一般执行下面步骤:

  • 要知道对应的主机上有哪些磁盘可以提供给主机来进行正常的使用。
  • 格式化磁盘(非必须)
  • ceph擦除磁盘上的数据
  • 添加osd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#所有的存储节点主机都准备了两块额外的磁盘,
[root@store01 ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 63.3M 1 loop /snap/core20/1828
loop1 7:1 0 4K 1 loop /snap/bare/5
loop2 7:2 0 63.5M 1 loop /snap/core20/2015
loop3 7:3 0 346.3M 1 loop /snap/gnome-3-38-2004/119
loop4 7:4 0 349.7M 1 loop /snap/gnome-3-38-2004/143
loop5 7:5 0 91.7M 1 loop /snap/gtk-common-themes/1535
loop6 7:6 0 46M 1 loop /snap/snap-store/638
loop7 7:7 0 49.9M 1 loop /snap/snapd/18357
loop8 7:8 0 40.9M 1 loop /snap/snapd/20290
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sr0 11:0 1 4.1G 0 rom /media/store01/Ubuntu 20.04.6 LTS amd64

#如果不想查看大量无效设备的话,可以执行下面清理操作
sudo apt autoremove --purge snapd -y

DISK="/dev/sdX"

DISK="/dev/sdd"

## Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)
sgdisk --zap-all $DISK

## Wipe a large portion of the beginning of the disk to remove more LVM metadata that may be present
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync

## SSDs may be better cleaned with blkdiscard instead of dd
blkdiscard $DISK

## Inform the OS of partition table changes
partprobe $DISK

安装osd依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#1. 确认仓库配置
[root@store01 ~] cat /etc/apt/sources.list.d/ceph.listdeb https://mirror.tuna.tsinghua.edu.cn/ceph/debian-pacific/ focal main wget -q -O- https://download.ceph.com/keys/release.asc

#2. 安装OSD相关软件
#方法1: 在管理节点远程安装
cephadm@admin:~/ceph-cluster$ ceph-deploy install --release quincy --osd store01
#方法2: 在OSD主机手动安装
[root@store01 ~] apt -y install ceph-osd

#3. 确认安装结果
#自动生成用户ceph
[root@store01 ~] tail -n1 /etc/passwd
[root@store01 ~] dpkg -l |grep ceph

ls /etc/ceph/
ps aux|grep ceph

查看所有可用的osd磁盘

1
2
#检查并列出OSD节点上所有可用的磁盘的相关信息
cephadm@admin:~/ceph-cluster$ ceph-deploy disk list node3

image-20240425135902182

报错原因是 python 版本问题

1
2
3
# 修改375行,将 if line.startswith('Disk /'): 更改为 if line.startswith(b'Disk /')
#只在'Disk前加一个字母 b 即可
cephadm@admin:~$sudo vim +375 /usr/lib/python3/dist-packages/ceph_deploy/osd.py

image-20240425140004253

1
2
3
cephadm@node1:~/ceph-cluster$ ceph-deploy disk list node3
很奇怪,权限问题
setfacl -m u:cephadm:rw /home/cephadm/ceph-cluster/*

image-20240425141038172

修改权限后可看

image-20240425141127811

清除OSD磁盘

在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD

注意: 如果硬盘是无数据的新硬盘此步骤可以不做

1
2
3
4
ceph-deploy disk zap [-h] [--debug] [HOST] DISK [DISK ...]
#说明此操操作本质上就是执行dd if=/dev/zero of=disk bs=1M count=10

for i in {0..2};do ceph-deploy disk zap 192.168.192.15$i /dev/sdb;done

集群添加osd节点

对于OSD的相关操作,可以通过 ceph-deploy osd 命令来进行,帮助信息如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#查看帮助
cephadm@admin:~/ceph-cluster$ ceph-deploy osd --help

#帮助显示:这里提示了两类的存储机制:
#默认情况下用的就是 bluestore类型
#对于bluestore来说,它主要包括三类数据:
--data /path/to/data #ceph 保存的对象数据
--block-db /path/to/db-device #数据库,即为元数据
--block-wal /path/to/wal-device #数据库的 wal 日志
#生产建议data和wal日志分别存放

#对于filestore来说,它主要包括两类数据
--data /path/to/data #ceph的文件数据
--journal /path/to/journal #文件系统日志数据

#对于 osd来说,它主要有两个动作:
list 列出osd相关的信息
create 创建osd设备
1
2
3
ceph-deploy --overwrite-conf osd create node1 --data /dev/sdb
ceph-deploy --overwrite-conf osd create node2 --data /dev/sdb
ceph-deploy --overwrite-conf osd create node3 --data /dev/sdb

高可用扩展

mgr扩展

当前只有一个Mgr节点主机,存在SPOF,添加新的Mgr节点实现高可用

Ceph Manager守护进程以Active/Standby模式运行,部署其它ceph-mgr守护程序可确保在Active节点或其上的ceph-mgr守护进程故障时,其中的一个Standby实例可以在不中断服务的情况下接管其任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#1. 在新mgr结点上安装mgr软件
#方法1:在管理节点远程在mgr02节点上安装Mgr软件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr02
#方法2:在mgr02节点手动安装软件
[root@mgr02 ~]#apt -y install ceph-mgr

#2. 添加第二个 Mgr节点
cephadm@admin:~/ceph-cluster$ ceph-deploy mgr create mgr02

#3. 查看
cephadm@admin:~/ceph-cluster$ ceph -s
#结果显示:mgr01节点就是主角色节点,mgr02是从角色节点。
#关闭mgr01节点,mgr02节点自动成为active节点
[root@mgr01 ~]#reboot
[root@admin ~]#ceph -s

mon扩展

当前只有一个mon结点主机,存在SPOF,添加新的mon结点实现高可用

如果 $n$ 个结点,至少需要保证 $\frac{n}{2}$ 个以上的健康mon结点,ceph集群才能正常使用

1
2
3
4
5
#先在新mon节点安装mon软件
ceph-deploy install --mon mon节点名称
#添加后续的mon节点命令
ceph-deploy mon add mon节点名称
#注意:如果add换成destroy,则变成移除mon节点

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#1. 在新的mon结点安装mon软件
#方法1:在mon02节点上安装mon软件
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mon mon02
#方法2:在mon02节点手动安装mon软件也可以
[root@mon02 ~] apt -y install ceph-mon

#2. 添加在mon02节点
cephadm@admin:~/ceph-cluster$ ceph-deploy mon add mon02

#3. 添加mon03节点
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mon mon03
cephadm@admin:~/ceph-cluster$ ceph-deploy mon add mon03

#4. 修改ceph配置添加后续的Mon节点信息
cephadm@admin:~/ceph-cluster$vim ceph.conf
mon_host = 192.168.192.131,192.168.192.132,192.168.192.133
#同步ceph配置文件到所有ceph节点主机
cephadm@admin:~/ceph-cluster$ ceph-deploy --overwrite-conf config push admin mon0{1,2,3} mgr0{1,2} store0{1,2,3}

#5. 重新生成初始化配置信息
ceph-deploy --overwrite-conf mon create-initial
#注意:为了避免因为认证方面导致的通信失败,推荐使用 --overwrite-conf 参数
#如果是在一个现有的环境上部署业务,可以先推送基准配置文件
ceph-deploy --overwrite-conf config push mon01 mon02 mon03

#6. 查看
cephadm@admin:~/ceph-cluster$ ceph -s

删除集群

1
2
3
4
5
6
7
8
9
10
11
12
#注意:如果部署过程出现问题,需要清空
ceph-deploy forgetkeys
ceph-deploy purge node1 node2 node3
ceph-deploy purgedata node1 node2 node3
# 进入集群配置文件 ceph-cluster
rm ceph.*

lvremove /dev/ceph-ff361b38-a44c-4d83-93ec-3362fbc57f96/osd-block-7819f40f-4157-4165-8f53-4be9de2e231f

vgremove ceph-ff361b38-a44c-4d83-93ec-3362fbc57f96

pvremove /dev/sdb

cephadm

文档

Cephadm 通过引导单个主机、扩展集群以包含任何其他主机,然后部署所需的服务来创建新的 Ceph 集群。

要求

  • Python 3
  • Systemd
  • Podman or Docker for running containers
  • Time synchronization (such as Chrony or the legacy ntpd)
  • LVM2 for provisioning storage devices

任何现代 Linux 发行版都应该足够了。依赖项由下面的引导过程自动安装。

有关与 Podman 兼容的 Ceph 版本表,请参阅与 Podman 版本的兼容性部分。并非每个版本的 Podman 都与 Ceph 兼容。

ubuntu

https://blog.csdn.net/gengduc/article/details/134900065

https://blog.csdn.net/rookie23rook/article/details/128510437

docker

在线安装

https://blog.csdn.net/ilyucs/article/details/106742754

1
2
3
4
yum -y install docker-engine

# 若安装报错,可能是podman冲突
yum erase podman buildah

下载containerd和docker

离线安装

在每台主机上操作

下载页

直接下载:cri-containerd-1.7.2-linux-amd64.tar.gz,该包里面包含了containerd、 ctr、crictl、containerd-shim等二进制文件,还有启动命令等,只要在/下解压即可。

1
2
3
4
5
6
7
8
tar xf cri-containerd-1.7.2-linux-amd64.tar.gz -C /
cat > /etc/crictl.yaml << EOF

runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
生成containerd配置文件
1
2
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

修改 /etc/containerd/config.toml,

1
2
3
4
5
6
7
vi /etc/containerd/config.toml

## 用于从安全上下文中提取设备所有权信息,kubevirt cdi依赖该参数,不设置该参数可能出现无权限
device_ownership_from_security_context = true
## 调整日志
max_container_log_line_size = 163840
SystemdCgroup = true

修改/etc/systemd/system/containerd.service,

1
2
vim /etc/systemd/system/containerd.service
将`LimitNOFILE=infinity`改为`LimitNOFILE=655360`
1
2
3
systemctl enable containerd && systemctl restart containerd

使用 crictl info 查看配置是否生效
其他节点只需将相关文件拷贝过去启动即可

在node01上操作

1
2
3
4
5
for i in {1..3};do scp -rp /usr/local/bin node0$i:/usr/local/;scp -rp /usr/local/sbin node0$i:/usr/local/;scp /etc/containerd node0$i:/etc/; scp /etc/systemd/system/containerd.service node0$i:/etc/systemd/system/;done

for i in {2..2};do scp -rp /usr/local/bin node0$i:/usr/local/;scp -rp /usr/local/sbin node0$i:/usr/local/;scp /etc/containerd node0$i:/etc/; scp /etc/systemd/system/containerd.service node0$i:/etc/systemd/system/;done

for i in {2..2};do cmd=$(systemctl daemon-reload && systemctl enable containerd && systemctl restart containerd);ssh node0$i "$cmd";done

docker

下载docker安装包 :https://download.docker.com/linux/static/stable/x86_64/docker-20.10.23.tgz

解压

1
tar xf docker-20.10.23.tgz

需要用到的二进制文件包括:docker 和 dockerd,拷贝到 /usr/bin/目录下即可。

1
mv docker/docker* /usr/bin/

创建 docker 用户

1
2
3
useradd -s /sbin/nologin docker
# 如果docker组存在,则使用
useradd -s /sbin/nologin docker -g docker

启动的配置文件 docker.serivce 和 docker.socket 拷贝到 /usr/lib/systemd/system/,daemon.json文件放到/etc/docker目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
cat > /usr/lib/systemd/system/docker.service  <<EOF

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
# ExecStart=/usr/bin/dockerd --graph=/data/docker -H fd:// --containerd=/run/containerd/containerd.sock --cri-containerd --debug
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cri-containerd --debug
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
# 可能会出现错误:"Failed at step LIMITS spawning /usr/bin/dockerd: Operation not permitted",则需要将LimitNOFILE=infinity 改成:LimitNOFILE=65530
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat > /usr/lib/systemd/system/docker.socket <<EOF
[Unit]
Description=Docker Socket for the API
PartOf=docker.service

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

启动docker

1
systemctl daemon-reload && systemctl enable docker --now

配置镜像加速和私有仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://vty0b0ux.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m"
},
"storage-driver": "overlay2",
"insecure-registries": ["registry.demo.com","192.168.59.249:5000"],
"experimental": true
}
EOF

重启docker

1
systemctl restart docker

将node01上的docker配置文件复制到其他节点

1
2
3
for i in {2..5};do scp /usr/bin/docker* ceph0$i:/usr/bin/;scp -rp /etc/docker ceph0$i:/etc/;scp /usr/lib/systemd/system/docker.service ceph0$i:/usr/lib/systemd/system/;scp /usr/lib/systemd/system/docker.socket ceph0$i:/usr/lib/systemd/system/;done

for i in {2..2};do scp /usr/bin/docker* node0$i:/usr/bin/;scp -rp /etc/docker node0$i:/etc/;scp /usr/lib/systemd/system/docker.service node0$i:/usr/lib/systemd/system/;scp /usr/lib/systemd/system/docker.socket node0$i:/usr/lib/systemd/system/;done

在ceph02-05上操作

1
2
useradd -s /sbin/nologin docker 
systemctl daemon-reload && systemctl enable docker --now

cephadm

修改ceph源

ubuntu LTS22

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#在管理节点准备脚本,注意以root身份执行
root@node1:cat > ceph_repo.sh <<EOF
#!/bin/bash
# 更新ceph的软件源信息
echo "deb https://mirror.tuna.tsinghua.edu.cn/ceph/debian-quincy/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ceph.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
EOF

bash ceph_repo.sh

#因为所有节点都会依赖于这些apt源信息,需要进行同步
[root@admin ~]for i in {156..157};do ssh -o StrictHostKeyChecking=no 192.168.192.$i bash < ceph_repo.sh;done

# 去其他结点查看
root@node02:/# cat /etc/apt/sources.list.d/ceph.list
deb https://mirror.tuna.tsinghua.edu.cn/ceph/debian-quincy/ focal main

管理节点安装cephadm

ubuntu LTS22

1
2
3
4
5
6
7
apt install -y cephadm

whereis cephadm # 检查安装情况

# 输出如下内容
root@node01:/# whereis cephadm
cephadm: /usr/sbin/cephadm /usr/share/man/man8/cephadm.8.gz

kylin linux

15的依赖是有的,16以上的依赖不全,不能安装cephadm

el8的没依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# wget http://mirrors.163.com/ceph/rpm-octopus/el8/noarch/cephadm-15.2.17-0.el8.noarch.rpm 
wget http://mirrors.163.com/ceph/rpm-octopus/el7/noarch/cephadm-15.2.17-0.el7.noarch.rpm
wget http://mirrors.163.com/ceph/rpm-quincy/el8/noarch/cephadm-17.2.7-0.el8.noarch.rpm

chmod 600 /var/log/tallylog
rpm -ivh cephadm-15.2.17-0.el7.noarch.rpm
rpm -ivh

切换cephadm版本
rpm -e cephadm

[root@ceph01 ~]# rpm -ivh cephadm-17.2.6-0.el8.noarch.rpm
错误:依赖检测失败:
/usr/libexec/platform-python 被 cephadm-2:17.2.6-0.el8.noarch 需要

检查

检查ceph各节点是否满足安装ceph集群,该命令需要在当前节点执行,比如要判断ceph02是否支持安装ceph集群,则在ceph02上执行

1
2
3
4
5
6
7
8
9
10
11
cephadm check-host --expect-hostname node01

docker (/usr/bin/docker) is present
systemctl is present
lvcreate is present
Unit chronyd.service is enabled and running
Hostname "ceph02" matches what is expected.
Host looks OK

## 也可以使用以下命令检查
cephadm check-host --expect-hostname `hostname`

初始化集群

先将docker镜像拉到本地

1
2
3
4
5
docker images --digests
docker pull --platform=linux/arm64 quay.io/ceph/ceph:v17.2.6
docker pull --platform=linux/amd64 quay.io/ceph/ceph:v17.2.6
docker pull --platform=linux/amd64 quay.io/ceph/ceph:v15.2.17
v14.2.22

改cephadm的一些代码

1
vim /usr/sbin/cephadm

image-20240608185248481

image-20240608185227794

还有要改的,没改完全会报下面的错

创建集群

cephadm bootstrap 过程是在单一节点上创建一个小型的ceph集群,包括一个ceph monitor和一个ceph mgr,监控组件包括prometheus、node-exporter等。

然后向集群中添加主机以扩展集群,进而部署其他服务

1
2
3
4
5
6
7
8
9
10
11
12
13
cephadm bootstrap --mon-ip 192.168.192.156 --cluster-network 10.168.192.0/24 --initial-dashboard-user admin --initial-dashboard-password admin

cephadm bootstrap --mon-ip 192.168.5.210 --cluster-network 10.168.192.0/24 --allow-overwrite --skip-dashboard

cephadm bootstrap --mon-ip 192.168.192.161 --allow-overwrite

cephadm bootstrap --mon-ip 192.168.3.233 --allow-overwrite

cephadm bootstrap --mon-ip 192.168.192.156 --cluster-network 10.168.192.0/24 --allow-overwrite --skip-dashboard

# 会卡很久
# 查看日志
tail -f /var/log/ceph/cephadm.log

image-20240608194858189

初始化时,指定了mon-ip、集群网段、dashboard初始用户名和密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--mon-ip 192.168.59.241 \
--cluster-network 10.168.192.0/24 \
指定dashboard用户名和密码
--initial-dashboard-user admin \
--initial-dashboard-password admin \
## 指定私钥和公钥
--ssh-private-key /root/.ssh/id_rsa \
--ssh-public-key /root/.ssh/id_rsa.pub \

## 启动前不拉取默认镜像
--skip-pull
## 指定私有镜像仓库
--registry-url registry.demo.com \
--registry-username admin \
--registry-password Harbor12345
1
2
3
4
5
## 需要指定监控组件镜像
ceph config set mgr mgr/cephadm/container_image_prometheus registry.demo.com/prometheus/prometheus:v2.33.4
ceph config set mgr mgr/cephadm/container_image_grafana registry.demo.com/ceph/ceph-grafana:8.3.5
ceph config set mgr mgr/cephadm/container_image_alertmanager registry.demo.com/prometheus/alertmanager:v0.23.0
ceph config set mgr mgr/cephadm/container_image_node_exporter registry.demo.com/prometheus/node-exporter:v1.3.1

进入容器 执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo /usr/sbin/cephadm shell --fsid 2e1228b0-0781-11ee-aa8a-000c2921faf1 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

Or, if you are only running a single cluster on this host:

sudo /usr/sbin/cephadm shell

退出容器执行
cephadm shell ceph -s

安装ceph-common工具,使bash支持原生命令
cephadm install ceph-common

ceph -s
ceph version

查看集群配置文件

1
2
3
4
5
ls /etc/ceph/

ceph.client.admin.keyring 是具有ceph管理员的秘钥
ceph.conf 是最小化配置文件
ceph.pub 是一个公钥,拷贝到其他节点后,可以免密登录。

查看组件运行状态

1
2
3
4
5
ceph orch ps

ceph orch ls

ceph orch ls mgr

删除不必要组件

1
2
3
4
ceph orch rm prometheus
ceph orch rm grafana
ceph orch rm alertmanager
ceph orch rm node-exporter

ceph镜像导出

1
2
3
docker images  |grep -v "REPOSITORY" |awk '{print $1":"$2}' |xargs docker save -o ceph-images.tar

for i in {2..2};do scp ceph-images.tar node0$i:/root/;done

解压离线镜像

1
docker load -i ceph-images.tar

添加主机

1
2
3
4
5
6
7
8
9
10
Log: Opening SSH connection to 192.168.192.237, port 22
[conn=2] Connected to SSH server at 192.168.192.237, port 22
[conn=2] Local address: 192.168.192.233, port 48926
[conn=2] Peer address: 192.168.192.237, port 22
[conn=2] Beginning auth for user root
[conn=2] Auth failed for user root
[conn=2] Connection failure: Permission denied
[conn=2] Aborting connection

ssh-copy-id -f -i /etc/ceph/ceph.pub root@node237

将ceph.pub公钥拷贝到其他ceph节点

1
2
3
ssh-copy-id -f -i /etc/ceph/ceph.pub node02

for i in {2..5};do ssh-copy-id -f -i /etc/ceph/ceph.pub ceph0$i;done

指定镜像

1
2
3
docker images --digests
docker pull --platform=linux/arm64 quay.io/ceph/ceph:v17.2.6
docker pull --platform=linux/amd64 quay.io/ceph/ceph:v17.2.6

使用cephadm将主机添加到存储集群中,执行添加节点命令后,会在目标节点拉到ceph/node-exporter镜像,需要一定时间,所以可提前在节点上将镜像导入。

1
2
cephadm shell ceph orch host add node02 192.168.192.157 --labels=mon,mgr,osd
ceph orch host add node237 192.168.3.237 --labels=mon,mgr,osd
1
2
3
4
5
6
Error EINVAL: check-host failed:
docker (/usr/bin/docker) is present
systemctl is present
Unit ntp.service is enabled and running
Hostname "node02" matches what is expected.
ERROR: lvcreate binary does not appear to be installed

在其他节点安装依赖

1
sudo apt-get install lvm2

查看加入集群的其他节点

1
2
3
4
5
root@node01:/# ceph orch host ls
HOST ADDR LABELS STATUS
node01 192.168.192.156 _admin
node02 192.168.192.157 mon,mgr,osd
2 hosts in cluster

节点打标签

给节点打上指标标签后,后续可以按标签进行编排。

给节点打 _admin 标签,默认情况下,_admin 标签应用于存储集群中的 bootstrapped 主机, client.admin密钥被分发到该主机(ceph orch client-keyring {ls|set|rm})。
将这个标签添加到其他主机后,其他主机的/etc/ceph下也将有client.admin密钥。

1
2
3
4
5
6
7
8
9
## 给 ceph02、ceph03加上 _admin 标签  
ceph orch host label add ceph02 _admin
ceph orch host label add ceph03 _admin

## 给 ceph01-ceph04加上 mon 标签
ceph orch host label add ceph01 mon
ceph orch host label add ceph02 mon
ceph orch host label add ceph03 mon
ceph orch host label add ceph04 mon
1
2
3
4
5
6
7
8
9
ceph orch host label add node01 mon,mgr,osd

ceph orch host ls

root@node01:/# ceph orch host ls
HOST ADDR LABELS STATUS
node01 192.168.192.156 _admin,mon,mgr,osd
node02 192.168.192.157 mon,mgr,osd
2 hosts in cluster
删除标签

删除节点上的_admin标签,并不会删除该节点上已有的ceph.client.admin.keyring密钥文件

1
ceph orch host label rm ceph03 label=_admin

新主机加入集群后,mon和mgr会自动扩展,最多5个mon,2个mgr

手动调整

1
2
3
4
[root@ceph1 ~]# ceph orch apply mon ceph1,ceph2,ceph3
Scheduled mon update...
[root@ceph1 ~]# ceph orch apply mgr ceph1,ceph2,ceph3
Scheduled mon update...

删除节点

1
ceph orch host rm <host> # 从集群中删除主机

添加mon

1
ceph orch apply mon node237

添加osd

  • 设备必须没有分区
  • 设备不得具有任何 LVM 状态
  • 设备不能被挂载
  • 设备不能包含文件系统
  • 设备不得包含 Ceph BlueStore OSD
  • 设备容量必须大于 5 GB

初始化磁盘

添加OSD时,建议将磁盘先格式化为无分区的原始磁盘

https://rook.github.io/docs/rook/v1.10/Getting-Started/ceph-teardown/?h=sgdisk#zapping-devices

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DISK="/dev/sdX"

DISK="/dev/sdd"

DISK="/dev/sdb"

## Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)
sgdisk --zap-all $DISK

## Wipe a large portion of the beginning of the disk to remove more LVM metadata that may be present
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync

## SSDs may be better cleaned with blkdiscard instead of dd
blkdiscard $DISK

## Inform the OS of partition table changes
partprobe $DISK

AVAILABLE 为 no,使用zap清除数据

1
2
3
4
5
查看各ceph节点有哪些磁盘是可用的,关注`AVAILABLE`列
# 查看设备列表,显示可用作OSD的设备
ceph orch device ls [--hostname=...] [--wide] [--refresh]

ceph orch device ls
1
2
ceph orch device zap <hostname> <path> # 擦除设备(清除设备)
ceph orch device zap --force node01 /dev/sdd

GPT headers found

之前磁盘被分区过,虽然删掉了分区,但是还存在 GPT 数据结构,使用 sgdisk 删除

1
sgdisk --zap-all /dev/sdX

添加OSD

1
2
3
4
5
6
7
# 创建新的OSD
ceph orch daemon add osd <host>:<device-path> [--verbose]

ceph orch daemon add osd node01:/dev/sdb

# 批量创建OSD
ceph orch apply osd --all-available-devices

删除服务

1
2
3
4
5
# 自动删除
ceph orch rm <service-name>

# 手动删除
ceph orch daemon rm <daemon name>... [--force]

cephadm删除集群

在每台主机上执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 禁用自动扩展
ceph mgr module disable cephadm

cat /etc/ceph/ceph.conf

cephadm rm-cluster --zap-osds --fsid [] --force

lvremove /dev/ceph-ff361b38-a44c-4d83-93ec-3362fbc57f96/osd-block-7819f40f-4157-4165-8f53-4be9de2e231f

vgremove ceph-ff361b38-a44c-4d83-93ec-3362fbc57f96

pvremove /dev/sdb

systemctl status ceph-osd.target

# 发现相关依赖被删除
docker ps -a

# 清理cephadm日志
rm -rf cephadm.log
-------------本文结束-------------