K8s教程-ceph分布式存储
测试环境:Ubuntu20.04
版本
- v14.2.22 Nautilus released
- v15.2.14 Octopus released
- v16.2.5 Pacific released 最新版本,建议使用此版本?
This is the fifth backport release in the Pacific series. We recommend all Pacific users update to this release.
概念介绍
ceph介绍
Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。
RGW、RBD、CephFS ==> RADOS ==> librados
- CEPH 对象存储
- CEPH 块设备
- CEPH 文件系统
cephadm介绍
Cephadm 是随着 Ceph 新版本 v15.2.0(Octopus)发布的安装工具,并且不支持 Ceph 的旧版本,Ceph 中已经 Cephadm 不依赖于外部配置工具,如 Ansible、 Rook 和 Salt,它通过 SSH 将管理器守护进程连接到主机来实现这一点。管理器守护进程可以添加、删除和更新 Ceph 容器。类似迷你版本的kubernetes,cephadm实际上就是一个编排工具。
环境准备
节点规划:
主机名 | public-ip | cluster-ip | 磁盘 | 角色 |
---|---|---|---|---|
ceph1 | 10.0.26.180 | 172.0.26.180 | 系统盘: sdaosd盘: sdb | cephadm,monitor,mgr,rgw,mds,osd,nfs |
ceph2 | 10.0.26.190 | 172.0.26.190 | 系统盘: sdaosd盘: sdb | monitor,mgr,rgw,mds,osd,nfs |
ceph3 | 10.0.26.191 | 172.0.26.191 | 系统盘: sdaosd盘: sdb | monitor,mgr,rgw,mds,osd,nfs |
# 分别设置主机名
hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3
# 增加解析
cat >> /etc/hosts <<EOF
172.0.26.180 ceph1
172.0.26.190 ceph2
172.0.26.191 ceph3
EOF
cephadm依赖
所有节点都需要安装依赖环境,因为cephadm类似k8s,通过容器进行管理
- Python3
- Systemd
- Podman or Docker(直接使用Docker就行了)
- chrony or NTP
- LVM2
cephadm安装
# 官方文档中还提到了另一种安装cephadm方式,就是通过apt install -y cephadm安装,实践证明最好不要使用这种方式,这种方式安装的cephadm可能不是最新版本的,但cephadm去拉的容器版本又是最新的,会导致两个版本不一致!
# cephadm:基于 python3 编写的一个脚本
# --location 用于处理重定向
curl -o cephadm --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm
chmod +x cephadm
# 指定最新发布的版本为:pacific,其实就是新增源,不同的系统自动指定:/etc/apt/sources.list.d/ceph.list
./cephadm add-repo --release pacific
# 安装指定版本的cephadm到/usr/sbin/cephadm
./cephadm install && rm -fv ./cephadm
# 用新安装指定版本的cephadm安装ceph所有命令行
cephadm install ceph-common
# apt install -y cephadm依赖包
# The following additional packages will be installed:
# bridge-utils containerd dns-root-data dnsmasq-base docker.io libidn11 pigz runc ubuntu-fan
引导新的群集
cephadm bootstrap的处理步骤如下:
- Create a monitor and manager daemon for the new cluster on the local host.
- Generate a new SSH key for the Ceph cluster and add it to the root user’s
/root/.ssh/authorized_keys
file. - Write a copy of the public key to
/etc/ceph/ceph.pub
. - Write a minimal configuration file to
/etc/ceph/ceph.conf
. This file is needed to communicate with the new cluster. - Write a copy of the
client.admin
administrative (privileged!) secret key to/etc/ceph/ceph.client.admin.keyring
. - Add the
_admin
label to the bootstrap host. By default, any host with this label will (also) get a copy of/etc/ceph/ceph.conf
and/etc/ceph/ceph.client.admin.keyring
.
# 初始化集群,注意留意生成的 web 账号信息,默认是ceph网络的ip
# 通常不会使用root用户,具有sudo免密的用户即可
cephadm bootstrap --mon-ip 172.0.26.180 --ssh-user zaza
# ceph网络的ip可能无法直接访问
https://172.0.26.180:8443/
# 查看镜像
docker images
# 查看容器
docker ps
# 查看所有组件状态
ceph orch ps
# 查看某个组件运行状态
ceph orch ps --daemon-type mds
ceph orch ps --daemon-type mgr
# 查看集群状态
ceph status
添加主机
# 通常不会使用root账号,具有sudo免密的账号即可
ssh-copy-id -f -i /etc/ceph/ceph.pub zaza@ceph2
ssh-copy-id -f -i /etc/ceph/ceph.pub zaza@ceph3
# 添加主机
# 添加成功后会创建以下服务(mgr总共置放了两个,所有ceph2和ceph3其中一个才有):
# ceph orch ps|grep ceph2
# crash.ceph2 mgr.ceph2.dyhlvv mon.ceph2 node-exporter.ceph2
ceph orch host add ceph2 172.0.26.190
ceph orch host add ceph3 172.0.26.191
# 查看主机
ceph orch host ls
# 查看哪些设备可以用于添加OSD(Available为Yes,代表可以添加,NO代表添加完成)
ceph orch device ls
添加OSD
ceph底层服务器对象,必须添加(服务于Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。)
OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其它OSD间进行心跳检查,负责响应客户端请求返回具体数据的进程等;
添加OSD需求满足以下所有条件:
- 设备必须没有分区。
- 设备不得具有任何LVM状态。
- 不得安装设备。
- 该设备不得包含文件系统。
- 该设备不得包含Ceph BlueStore OSD。
- 设备必须大于5 GB。
# 为自动添加所有满足条件的OSD
# ceph orch apply osd --all-available-devices
# 通过手工指定的方式添加OSD(添加进程:osd.x,一个硬盘对应一个)
ceph orch daemon add osd ceph1:/dev/sdb
ceph orch daemon add osd ceph2:/dev/sdb
ceph orch daemon add osd ceph3:/dev/sdb
# 查看(Available为Yes,代表可以添加,NO代表添加完成)
ceph orch device ls
查看服务类型
https://127.0.0.1:8443/#/services/create
部署RGW
本次测试主要是文件系统,所以不需要部署:CEPH 对象存储 网关
Ceph RGW基于librados,是为应用提供RESTful类型的对象存储接口。RGW提供两种类型的接口:
- S3:兼容Amazon S3RESTful API
- Swift:兼容OpenStack Swift API
# placement为三个,也可以是所有或者匹配主机
ceph orch apply rgw rgw --placement=3
# 查看服务
ceph orch ls | grep rgw.rgw
# 查看进程
ceph orch ps | grep rgw.rgw
# 集成到dashboard(查看access_key和secret_key分别保存到secret_key.txt和access_key.txt)
radosgw-admin user create --uid=rgw --display-name=rgw --system
# 保存(后续版本可以不需要操作此步骤了)
ceph dashboard set-rgw-api-access-key -i access_key.txt
ceph dashboard set-rgw-api-secret-key -i secret_key.txt
部署Cephfs
本次测试重点:文件存储功能
Ceph 文件系统( CephFS )是个与 POSIX 标准兼容的文件系统,它建立在 Ceph 的分布式对象存储 RADOS 之上。
ceph fs volume create cephfs --placement=3
# 查看状态
ceph orch ls | grep cephfs
ceph orch ps | grep cephfs
授权并挂载Cephfs
######################管理节点######################
# 查看授权
ceph auth ls
# 授权
# 可以创建文件,但是不能写入数据,因为mds元数据有w权限
# 问题:/test/目录下任然无法写入数据
# ceph auth get-or-create client.0 mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs.cephfs.data/test/'
# 用户名可以是id也可以是name
ceph auth get-or-create client.0 mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs.cephfs.data'
# 查看keyring数据
# ceph auth get client.admin
ceph auth get client.0
######################客户端######################
# 查看mount支持的挂载类型
# grep ceph /proc/filesystems
# 通过fuse挂载
apt install -y ceph-fuse
# 创建配置文件
# 这里有个坑:xshell+ubuntu,下面的数据会变成:ceph.ckey这种类型的,因为前面的空格是tab键
# root@ceph3:/etc/ceph# cat > /etc/ceph/ceph.client.0.keyring << 'EOF'
# > [client.0]
# > ceph.ckey = AQAJmyhho5xMHBAAVx68eqqaamMxZd2539y27Q==
# > ceph.ccaps mds = "allow r, allow rw path=/"
# > ceph.ccaps mon = "allow r"
# > ceph.ccaps osd = "allow rw pool=cephfs.cephfs.data"
# > EOF
# 注意:生成的数据需要将tab键改成空格键,或者是vim添加
cat > /etc/ceph/ceph.client.0.keyring << "EOF"
[client.0]
key = AQAJmyhho5xMHBAAVx68eqqaamMxZd2539y27Q==
caps mds = "allow r, allow rw path=/"
caps mon = "allow r"
caps osd = "allow rw pool=cephfs.cephfs.data"
EOF
# 挂载
# cephadm节点上面可以直接执行: ceph-fuse -m ceph1:6789,ceph2:6789,ceph3:6789 -r / /mnt/cephfs
ceph-fuse -m ceph1:6789,ceph2:6789,ceph3:6789 -r / /mnt/cephfs --name=client.0
部署NFS
建议测试
自从
Jewel
版本,nfs-ganesha
开始支持ceph
,并且把对接点选择了rados
。Ganesha
支持两种方式将Ceph
导出为NFS
,一种通过RGW
,一种通过CephFS
,通过FSAL
模块 连接到RGW
或者CephFS
, 其中,FSAL_RGW
调用librgw2
将NFS
协议转义为S3
协议再通过RGW
存入到Ceph
中,FSAL_CEPH
调用libcephfs1
将NFS
转义为Cephfs
协议再存入到Ceph
中。所以需要额外安装这两个包。伪版本(pseudo-version)
# 创建pool池的名称为:ganesha_data
ceph osd pool create ganesha_data 32
# 查看资源池
ceph osd pool ls
# 将资源池用于nfs app程序
ceph osd pool application enable ganesha_data nfs
# 部署nfs Service,并将svc_id设置为nfs,ganesha_data为pool池的资源名称
# 使用web,更加直观的显示:https://127.0.0.1:8443/#/services/create
# ceph orch apply nfs <svc_id> [<placement>] [<pool>]
ceph orch apply nfs nfs ganesha_data --placement=3
# 查看状态
ceph orch ls | grep nfs.nfs
ceph orch ps | grep nfs
将CephFS映射到nfs
通过web,将CephFS映射到nfs,当然也可以不用映射,直接使用NFS服务即可
这里主要实现了将CephFS转换成nfs协议访问
伪版本(pseudo-version)
https://127.0.0.1:8443/#/nfs/create
web关键配置信息:
- Daemons记得添加
- CephFS Path: / 源数据
- Pseudo: /cephfs nfs映射的目录
- Add clients 客户端权限控制
- 此时:/mnt/cephfs数据和/mnt/nfs/cephfs是一致的了
挂载NFS
# 安装依赖包
apt install -y nfs-common
# 只支持单ip,所以需要nfs-ingress实现高可用
mount ceph1:/ /mnt/nfs
# 安装负载均衡器后,可以直接只要负载均衡器的ip
# 当前还有问题:mount.nfs: requested NFS version or transport protocol is not supported
# mount -o port=2050 172.0.26.200:/nfs /mnt/nfs
部署iSCSi
CEPH 块设备,没有需求占时不测试
# 创建iscsi所需求的池
ceph osd pool create iscsi_pool 32 32
ceph osd pool application enable iscsi_pool iscsi
# 应用配置文件(参数太多不方便)
cat > iscsi.yaml << 'EOF'
service_type: iscsi
service_id: gw
placement:
hosts:
- ceph1
- ceph2
- ceph3
spec:
pool: iscsi_pool
trusted_ip_list: "172.0.26.180,172.0.26.190,172.0.26.191"
api_user: admin
api_password: admin
api_secure: false
EOF
# 应用
ceph orch apply -i iscsi.yaml
# 查看状态
ceph orch ls | grep iscsi
ceph orch ps | grep iscsi
部署rbd-mirror
ceph orch apply rbd-mirror --placement=3
# 查看状态
ceph orch ls | grep rbd-mirror
ceph orch ps | grep rbd-mirror
部署Cephfs-mirror
快照工具?
ceph orch apply cephfs-mirror --placement=3
# 查看状态
ceph orch ls | grep cephfs-mirror
ceph orch ps | grep cephfs-mirror
查看所有服务
ceph -s
添加rgw-ingress
在前几个步骤中我们添加了RGW和NFS,并且都部署了3个Deamon,但其实三个还是独立服务的,也就是前端没有负载均衡实现统一访问,在Cephadm中将haproxy和keepalived两个封装成了ingress服务
注意这里的backend_service一定要通过ceph orch ls查看到实际的名称为准, frontend_port为VIP的端口,注意到这里有个 monitor_port这个的意思是haproxy 状态页端口。
# 配置文件
cat > rgw-ingress.yaml << 'EOF'
service_type: ingress
service_id: rgw.rgw
placement:
count: 3
spec:
backend_service: rgw.rgw
virtual_ip: 172.0.26.200/24
frontend_port: 8080
monitor_port: 1967
EOF
# 应用
ceph orch apply -i rgw-ingress.yaml
# 查看
ceph orch ls | grep ingress.rgw.rgw
ceph orch ps | egrep 'haproxy.rgw.rgw|keepalived.rgw.rgw'
添加nfs-ingress
# 配置文件
cat > nfs-ingress.yaml << 'EOF'
service_type: ingress
service_id: nfs.nfs
placement:
count: 3
spec:
backend_service: nfs.nfs
virtual_ip: 172.0.26.200/24
frontend_port: 2050
monitor_port: 1968
EOF
# 应用
ceph orch apply -i nfs-ingress.yaml
# 查看
ceph orch ls | grep ingress.nfs.nfs
ceph orch ps | egrep 'haproxy.nfs.nfs|keepalived.nfs.nfs'
重置dashboard密码
# 必须通过文件读取密码
echo mnBgUHoDLeTMkQOMVaGD > change_password
ceph dashboard ac-user-set-password admin -i change_password
参考
- 原文作者:zaza
- 原文链接:https://zazayaya.github.io/2021/08/25/ceph-getting-started.html
- 说明:转载本站文章请标明出处,部分资源来源于网络,如有侵权请及时与我联系!