ceph是一个分布式文件存储服务,类似的还有gulster,minio等等,至于各种云服务商的对象存储服务就不说了,这里只聊自建。为了配合kubernetes的底层pvc存储,利用storageClass的自动claim,因此在测试环境部署了一套cephfs,cephfs依赖ceph服务,因此先安装ceph。准备3台服务器,每台挂载一块数据盘,而且是raw的,也就是裸盘,不需要格式化。
ceph
首先去官网:http://docs.ceph.org.cn/start/,快速查看了解ceph的部署过程,官方没有做到事无巨细,你也只能结合ecs的环境做个大致的了解,至少浏览一遍,以便在出问题的时候,回到文档中查看原因。
其次开始安装:只要没有明确标识在管理节点,那就是所有节点都需要安装
1、配置主机名和IP的映射:/etc/hosts,这里必须和主机名对应,否则后面执行mon初始化的时候报错
2、添加yum源:yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*
3、添加ceph的yum仓库:
vim /etc/yum.repos.d/ceph.repo 注意:luminous是ceph的版本,el7是你Linux的发行版;具体的版本信息这里查看https://docs.ceph.com/docs/mimic/releases/
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
4、安装ceph-deploy:管理节点
yum install -y ceph-deploy
5、使用root用户安装,如果需要普通用户,请参照官方文档中添加用户部分
6、开始安装:管理节点
mkdir my-cluster
cd my-cluster
ceph-deploy new admin //生成ceph.conf
ceph-deploy install admin node1 node2 //各节点安装ceph
ceph-deploy mon create-initial //初始化监控节点,这一步肯定会出错,查看出错日志,然后根据日志来修改ceph.conf或者其他操作
如果告诉你public_network或者public_addr都不存在,那么需要在ceph中添加对应的网段
如果告诉你provided hostname must match remote hostname,那说明你的hosts里配置的主机名和ceph.conf中的不一致,需要你调整
每次修改ceph.conf需要重新把这个配置文件推送到所有的节点:ceph-deploy --overwrite-conf config push admin node1 node2
如果还是不行,就去各个节点执行 pkill ceph杀掉进程,重新初始化
最后还是不行,你就purge所有的东西,重新从头开始准备安装:
ceph-deploy purge admin node1 node2
ceph-deploy purgedata admin node1 node2
ceph-deploy forgetkeys
7、拷贝所有keyring结尾的密钥文件到各个节点的/etc/ceph
8、检查ceph的health状态
ceph health //如果告诉你HEALTH_WARN no active mgr,那就需要添加mgr:ceph-deploy mgr create node1 node2
9、添加osd
ceph-deploy osd create --data /dev/vdb admin
ceph-deploy osd create --data /dev/vdb node1
ceph-deploy osd create --data /dev/vdb node2 //注意磁盘的位置,这个版本的ceph-deploy无法使用prepare来添加osd了
10、查看ceph的状态
ceph -s
cluster:
id: 355a1118-c856-42e9-81bd-d5bec3c5464f
health: HEALTH_OK
services:
mon: 1 daemons, quorum ecs-f80d-0001
mgr: ecs-f80d-0002(active), standbys: ecs-f80d-0003
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 597 GiB / 600 GiB avail
pgs:
11、开启dashboard
一般情况下,都没有什么问题,但是不保证启用dashboard成功,因此,出现问题的时候就去查看mgr角色机器的mgr日志,路径在/var/log/ceph/ceph-mgr.${nodename}.log
启用步骤:
ceph mgr module enable dashboard //如果没有设置dashboard绑定port和IP,那就是mgr节点的8080,8443 for ssl
如果需要自定义地址和端口
ceph config set mgr mgr/dashboard/server_addr 0.0.0.0
ceph config set mgr mgr/dashboard/server_port 7000
ceph mgr module disable dashboard
ceph mgr module enable dashboard //重启一下dashboard
ceph dashboard set-login-credentials admin admin //设置登录用户名和密码
如果日志报错urllib3之类的,就通过pip重装
pip uninstall urllib3
pip install urllib3 //可能会让你--upgrade
ssl自签证书,看情况,如果不使用的话,需要这样做:
ceph config set mgr mgr/dashboard/ssl false
dashboard有非常多的设置,具体操作,请参看官方文档:https://docs.ceph.com/docs/master/mgr/dashboard/
12、安装mds元数据组件
ceph-deploy mds create nodename //在ceph.conf同级目录执行
13、安装object gateway组件
ceph-deploy rgw create nodename
14、添加monitor,以便高可用
ceph-deploy mon add nodename
ceph quorum_status --format json-pretty //查看法定人数状态
15、使用ceph
ceph osd pool create data 128 128 //创建存储池子,pg和pgp均为128,如果不写将使用默认的8,你可以在ceph.conf设置默认的pg和pgp
ceph osd pool set-quota data max_objects 10000 //设置池子的对象个数配额
ceph osd pool set-quota data max_bytes 2G //设置池子的大小配额,取消配额,设置为0
16、测试推送数据到存储池
rados put test-object-1 testfile.txt --pool=data //推送数据
rados -p data ls //验证数据对象是否存在
ceph osd map data test-object-1 //定位数据对象
rados rm test-object-1 --pool=data //删除此对象
17、新增节点和osd,以及mon
在deploy节点的hosts中添加新增的节点主机/etc/hosts
ceph-deploy install node3 node4 //批量安装ceph到新增节点
如果出错就purge和purgedata,再重新安装,可能还会有urllib3的报错,就还是按照之前介绍的方式重新pip安装之
节点增加也需要增加对应的monitor
ceph-deploy mon add node3
将monitor的列表在ceph.conf中配置完整,再push到各个节点中去
ceph-deploy --overwrite-conf config push admin node1 node2 node3 node4
新增osd:
ceph-deploy osd create --data /dev/vdb node3
ceph-deploy osd create --data /dev/vdb node4
ceph -s 或者 ceph osd tree 查看是否添加成功
18、添加客户端用户和设置权限
ceph auth get-or-create client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s' mds 'allow rwp' -o ceph.client.k8s.keyring
更新权限
ceph auth caps client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s, allow rw pool=cephfs_data' mds 'allow rwp'
还可以通过对cephfs文件系统授权的同时添加一个账户
ceph fs authorize cephfs client.k8s / r /data rw //表示k8s用户对/目录有读权限,对/data有读写权限,这里的data不是pool,而是文件系统的路径
注意:不管是块block存储还是fs文件系统,其都是基于pool来的,因此首先得创建pool
kubernetes
测试ceph的块存储:
1、先创建一个image
ceph osd pool create k8s 256 256
ceph osd pool set-quota data max_objects 1000000
ceph osd pool set-quota data max_bytes 200G
rbd create cephblocktest -s 1024 -p k8s
rbd create k8s/cephblocktest --size 1024 --image-feature layering //这种方式指定了rbd的feature,防止Linux kernel不支持其他特色而报错
2、创建测试pod
apiVersion: v1
kind: Pod
metadata:
name: rbd
spec:
containers:
- image: nginx
name: rbd-rw
volumeMounts:
- name: rbdpd
mountPath: /mnt/rbd
volumes:
- name: rbdpd
rbd:
monitors:
- '192.168.1.54:6789'
- '192.168.1.107:6789'
- '192.168.1.248:6789'
pool: k8s
image: cephblocktest
fsType: ext4
readOnly: false
user: admin
keyring: /etc/ceph/ceph.client.admin.keyring
3、apply这个yaml
查看events会发现有这样的报错:
MountVolume.WaitForAttach failed for volume "rbdpd" : rbd: map failed exit status 6, rbd output: rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable k8s/cephblocktest object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
原因是因为这个image的feature部分有Linux kernel不支持的,所以需要去掉多余的feature
rbd feature disable k8s/cephblocktest exclusive-lock object-map fast-diff deep-flatten
删掉pod,再重新apply
不出意外,就可以看到pod的/mnt/rbd挂载到了之前新建的image的块设备了,名字叫做/dev/rbd0
4、至于pv和pvc的方式来使用rbd就不开展了,这都是k8s的知识了,先有pv,再有pvc,rbd块设备先在pv里面绑定,pod再去pvc申请pv
5、重点说一下k8s的storageClass结合rbd块设备
secret的值需要通过base64转换:
ceph auth get-key client.admin | base64
#sc的配置
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ceph-rbd
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/rbd
reclaimPolicy: Retain
parameters:
monitors: 192.168.1.54:6789,192.168.1.107:6789,192.168.1.248:6789
adminId: admin
adminSecretName: ceph-client-admin-secret
adminSecretNamespace: default
pool: k8s
userId: admin
userSecretName: ceph-client-admin-secret
fsType: ext4
imageFormat: "2"
imageFeatures: "layering"
#secret的配置
apiVersion: v1
kind: Secret
metadata:
name: ceph-client-admin-secret
namespace: default
data:
key: QVFBTGVySmVTMWcrSmhBQTUvS0p3TlJqcFVhZWdhYytmQko0NXc9PQ==
type: "kubernetes.io/rbd"
#pvc的配置
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-pvc
namespace: default
spec:
storageClassName: ceph-rbd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
6、如果集群是通过kubeadm安装的,那么kube-controller-manager里面是没有rbd命令的,会导致pvc在申请sc创建imgae的时候,报错没有rbd命令,两种方式处理:a、修改/etc/kubernetes/manifest/kube-controller-manager.yaml中的image为带有rbd命令的镜像,比如:gcr.io/google_containers/hyperkube:v1.16.2;b、创建一个rbd-provisioner的外部配置器,指定sc里面的provisioner为这个外部配置器
7、由于rbd块存储不支持多节点挂载读写,所以当你的deployment是多个replicas时,你就不能使用上面的pvc模式了,此时,你要么使用cephfs,要么使用statefulset给每个副本一个pvc
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "ceph-rbd"
resources:
requests:
storage: 1Gi
8、cephfs使用
ceph osd pool create cephfs_data 64
ceph osd pool create cephfs_metadata 64
ceph fs new cephfs cephfs_metadata cephfs_data //创建一个文件系统
如果你在这里就想给storageClass使用cephfs文件系统的话,那么pod挂载的就是文件的根目录,因此在这里建议划分多个有目的性的目录出来,分别赋予不同的应用
mount -t ceph 192.168.1.54,192.168.1.107,192.168.1.248:/ /mnt/cephfs -o name=admin,secret=AQALerJeS1g+JhAA5/KJwNRjp...... //密钥省略了一部分
ceph-fuse -r / /mnt/cephfs/ --name client.admin //mount无法挂载就使用ceph-fuse
挂载文件系统之后,创建多个子目录:
mkdir /mnt/cephfs/k8s_frontend
mkdir /mnt/cephfs/k8s_backend
setfattr -n ceph.quota.max_bytes -v 100000000000 /mnt/cephfs/k8s_frontend //100GB的大小,表示这个文件系统下的前端目录最大为100GB
setfattr -n ceph.quota.max_bytes -v 500000000000 /mnt/cephfs/k8s_backend //500GB的大小
因为k8s还不支持cephfs作为internal-provisioner,所以需要使用k8s的external-provisioner来实现cephfs的storageClass的配置和操作
https://github.com/kubernetes-incubator/external-storage/tree/master/ceph/cephfs
但是,这个还不是很完美,比如:pod显示的挂载大小是你cephfs目录的总大小,而不是pvc申明的大小(cephfs的目录quota大小不受影响),这个有大神给出了解决方案,但是官方还没有给出支持,所以暂时不去尝试了。
总结:以上就是对ceph存储(块存储rbd和文件系统存储cephfs)作为kubernetes底层storageClass的应用部署和实践,希望能对大家有所帮助。