Ceph
1、Ceph
Ceph是一个可靠地,自动均衡,自动回复的分布式存储系统,根据使用场景可以划分为对象存储,块存储和文件系统服务。Ceph存储集群至少需要一个Ceph Monitor 和两个OSD 守护进程。而运行Ceph文件系统客户端时,则必须要有元数据服务(MDS Metadata Server)。
2、ceph的核心组件
- Ceph OSDs 守护进程
# 基本功能
存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳向Ceph Monitors 提供一些监控信息。
当Ceph存储集群设定为2个副本时,至少需要2个OSD守护进程,集群才能达到active+clean状态(Ceph默认与3个副本)
- Ceph Monitor
Ceph Monitors 维护着展示集群状态的各种图表,包括监控图、OSD图、归属组(PG)图和CRUSH图。Ceph保存着发生在
Monitors、OSD和PG上的每一次状态变成的历史信息(称为epoch)
- MDSs
Ceph元数据服务器为Ceph文件系统存储元数据(Ceph块设备和Ceph对象存储不适用MDS)。元数据服务器使得POSIX文件系统的
用户可以在不对Ceph存储集群造成负担的前提下,执行ls,find等基本命令。
- 客户端
Ceph 把客户端数据保存为存储池内的对象。通过使用 CRUSH 算法, Ceph 可以计算出哪个归置组(PG)应该持有指定的
对象(Object),然后进一步计算出哪个 OSD 守护进程持有该归置组。 CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、
再均衡和修复
3、Ceph使用
- Ceph 基础命令
* 查看Ceph集群:ceph osd tree
详细配置信息:ceph daemon /var/run/ceph/ceph-mon.$(hostname -s).asok config show
* 清除磁盘上的逻辑卷:/usr/sbin/ceph-volume lvm zap --destroy /dev/vdc
* 查看ceph授权信息:ceph auth get client.admin
* 在部署节点修改了ceph.conf文件,将新配置推送至全部的ceph节点:ceph-deploy --overwrite-conf config push dlp node1 node2 node3
* 检查仲裁状态,查看mon添加是否成功:ceph quorum_status --format json-pretty
Ceph pool操作
* 列式pool列表:ceph osd lspools
* 列示pool详细信息:ceph osd dump |grep pool
* 检查pool的副本数:ceph osd dump |grep -i size
* 创建pool:ceph osd pool create pooltest 128
若少于5个OSD, 设置pg_num为128。
5~10个OSD,设置pg_num为512。
10~50个OSD,设置pg_num为4096
* 删除pool:ceph osd pool delete data data --yes-i-really-really-mean-it
* 设置pool副本:ceph osd pool get data size ceph osd pool set data size 3
* 设置pool配额:ceph osd pool set-quota data max_objects 100#最大100个对象
ceph osd pool set-quota data max_bytes $((10 * 1024 * 1024 * 1024)) #容量大小最大为10G
* 重命名pool:ceph osd pool rename data date
* 获取现有的PG数和PGP数:ceph osd pool get data pg_num
ceph osd pool get data pgp_num
* 修改存储池的PG和PGP: ceph osd pool set data pg_num = 1
ceph osd pool set data pgp_num = 1
- rdb命令
* 创建块设备映像:rbd create --size {megabytes} {pool-name}/{image-name}
* 罗列块设备映像:rbd ls {poolname}
* 检索映像信息:rbd info {pool-name}/{image-name}
* 调整块设备映像大小:rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)
* 删除块设备映像:rbd rm {pool-name}/{image-name}
* 映射块设备:sudo rbd map {pool-name}/{image-name} --id {user-name}
* 查看已映射块设备:rbd showmapped
* 取消块设备映射:rbd unmap /dev/rbd/{poolname}/{imagename}
* 使用Ceph块设备:
- 创建image挂载一个文件系统:sudo mkfs.xfs /dev/rbd0
sudo mkdir /mnt/ceph-disk0
sudo mount /dev/rbd0 /mnt/ceph-disk0
- 通过将数据写入块设备进行检查:sudo dd if=/dev/zero of=/mnt/ceph-disk0/file0 count=100 bs=1M
sudo ls /mnt/ceph-disk0/file0 -lh
df -h /mnt/ceph-disk0
- 添加块设备映像大小后,扩展文件系统空间:
- k8s 如何使用Ceph 作为后端存储:
# 利用Ceph storageclass + PVC建立后端存储 动态PV
#https://blog.csdn.net/weixin_33757911/article/details/91820211
一、工作准备
1、在Ceph集群上创建pool:shell# ceph osd pool create mysql-master-data 128
2、在k8s集群上安装客户端:ceph创建了一个默认的用户client.admin,它有足够的权限去访问ceph集群。测试环境中直接使用了Ceph的admin账号,当然生产环境中还是要根据不同功能客户端分配不同的账号
shll# ceph auth get-or-create client.mysql mon 'allow r' osd 'allow rwx pool=mysql' -o ceph.client.mysql.keyring #创建用户
获取账号秘钥:shell# ceph auth get-key client.admin | base64
3、为controller-manager提供rdb命令
使用StorageClass动态创建PV时,controller-manager会自动在Ceph上创建image,所以我们要为其准备好rbd命令
(1)如果集群是用kubeadm部署的,由于controller-manager官方镜像中没有rbd命令,所以我们要导入外部配置:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbd-provisioner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
- apiGroups: [""]
resources: ["services"]
resourceNames: ["kube-dns","coredns"]
verbs: ["list", "get"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: rbd-provisioner
subjects:
- kind: ServiceAccount
name: rbd-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: rbd-provisioner
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: rbd-provisioner
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rbd-provisioner
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: rbd-provisioner
subjects:
- kind: ServiceAccount
name: rbd-provisioner
namespace: default
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: rbd-provisioner
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: rbd-provisioner
spec:
containers:
- name: rbd-provisioner
image: quay.io/external_storage/rbd-provisioner:latest
env:
- name: PROVISIONER_NAME
value: ceph.com/rbd
serviceAccount: rbd-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: rbd-provisioner
kubectl apply -f rbd-provisioner.yaml rbd-provisioner的镜像要和ceph的版本适配,这里镜像使用最新的,根据官方提示已支持ceph mimic版。
(2) 如果集群是用二进制方式部署的,直接在master节点安装ceph-common即可。
YUM源:
[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
shell# yum clean all
shell# yum makecache
shell# yum -y install ceph-common-13.2.7
将Ceph的ceph.client.admin.keyring文件拷贝到master的/etc/ceph目录下
4、为kubelet提供rdb命令
创建pod时,kubelet需要使用rbd命令去检测和挂载pv对应的ceph image,所以要在所有的worker节点安装ceph客户端ceph-common-13.2.7。
三、使用利用storageclass 使用Ceph
1、创建存储类
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ceph-sc
namespace: default
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: ceph.com/rbd
reclaimPolicy: Retain
parameters:
monitors: 172.16.0.122:6789,172.16.0.123:6789,172.16.0.124:6789 #Ceph集群
adminId: admin
adminSecretName: storage-secret
adminSecretNamespace: default
pool: k8s
fsType: xfs
userId: admin
userSecretName: storage-secret
imageFormat: "2"
imageFeatures: "layering"
shell# kuectl apply -f storage_class.yaml
2、为存储提供secret
apiVersion: v1
kind: Secret
metadata:
name: storage-secret
namespace: default
data:
key: QVFDMmIrWmNEL3JTS2hBQWwwdmR3eGJGMmVYNUM3SjdDUGZZbkE9PQ== #此key 为在步骤二中获取的账号秘钥
type:
kubernetes.io/rbd
shell# kubectl apply -f storage_secret.yaml
3、创建pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-pvc
namespace: default
spec:
storageClassName: ceph-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
shell# kubectl apply -f storage_pvc.yaml
创建完PVC,pv会自动创建,正常情况pvc将处于Bound状态
四、调用pvc
1、pod
apiVersion: v1
kind: Pod
metadata:
name: ceph-pod1
spec:
nodeName: k8s-node02
containers:
- name: nginx
image: nginx:1.14
volumeMounts:
- name: ceph-rdb-vol1
mountPath: /usr/share/nginx/html
readOnly: false
volumes:
- name: ceph-rdb-vol1
persistentVolumeClaim: #指定pvc名称
claimName: ceph-pvc
shell# kubectl apply -f storage_pod.yaml
2、StatefulSet 使用StatefulSet 不需要自己创建pv,pvc。statefulSet使用volumeClaimTemplate,称为卷申请模板,它会为每个Pod生成不同的pvc,并绑定pv, 从而实现各pod有专用存储。如果集群中没有StorageClass的动态供应PVC的机制,也可以提前手动创建多个PV、PVC,手动创建的PVC名称必须符合之后创建的StatefulSet命名规则:(volumeClaimTemplates_name)-(pod_name)
Statefulset名称为web 三个Pod副本: web-0,web-1,web-2,volumeClaimTemplates名称为:www,那么自动创建出来的PVC名称为www-web[0-2],为每个Pod创建一个PVC
以下是有storageClass的动态供应PVC的机制时:使用时不需要手动创建pvc和pv,statefulset会根据模板自行创建pvc,和pv并进行bound。也可以手动创建PVC,pvc名称为{volumeClaimTemplates_name}-{podname}-# #为镜像个数,从0开始,比如mysql-master-data-mysql-master-0
volumeClaimTemplates:
- metadata:
name: mysql-master
annotations: #备注
volume.beta.kubernetes.io/storage-class: "ceph-pvc" #stroage-class名称
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi
总结:
* 匹配Pod name(网络标识)的模式为:$(statefulset名称)-$(序号),比如上面的示例:web-0,web-1,web-2。
*StatefulSet为每个Pod副本创建了一个DNS域名,这个域名的格式为: $(podname).(headless server name),也就意味着服务间是通过Pod域名来通信而非Pod IP,因为当Pod所在Node发生故障时,Pod会被飘移到其它Node上,Pod IP会发生变化,但是Pod域名不会有变化。
* StatefulSet使用Headless服务来控制Pod的域名,这个域名的FQDN为:$(service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群的域名。
* 根据volumeClaimTemplates,为每个Pod创建一个pvc,pvc的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的volumeMounts.name=www, Pod name=web-[0-2],因此创建出来的PVC是www-web-0、www-web-1、www-web-2。
* 删除Pod不会删除其pvc,手动删除pvc将自动释放pv。
===============================================================
# Ceph 静态PV + PVC 建立后端存储 此种方式暂时没看到使用与StatefulSet
#https://blog.csdn.net/ygqygq2/article/details/81982179
通常使用的流程是,首先创建存储,在创建pv,接着创建pvc,pod挂载到相应的pvc,可使用打标签的方式将指定的pvc绑定到指定标签的pv,如果不指定将随机绑定。
通过静态pv,pvc使用ceph:ceph RBD只能进行单节点读写或多节点读,不能进行多节点读写.但是有的业务可能需要多节点读写的功能,可用cephfs解决了这个问题
第一种方式:cephfs方式:
1、跟动态pv一样,安装rdb命令,给所有节点安装ceph客户端。
2、创建Ceph admin secret
apiVersion: v1
kind: Secret
metadata:
name: storage-secret
namespace: default
data:
key: QVFDMmIrWmNEL3JTS2hBQWwwdmR3eGJGMmVYNUM3SjdDUGZZbkE9PQ== #此key 为在步骤二中获取的账号秘钥
type:
kubernetes.io/rbd
shell# kubectl apply -f storage_secret.yaml
3、创建pv vim cephfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: cephfs-pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- 192.168.105.92:6789
- 192.168.105.93:6789
- 192.168.105.94:6789
user: admin
secretRef:
name: ceph-admin-secret
readOnly: false
persistentVolumeReclaimPolicy: Recycle
shell# kubectl apply -f cephfs-pv.yaml
4、创建PVC vim cephfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cephfs-pv-claim1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
shell# kubectl apply -f cephfs-pvc.yaml
5、使用:pod Developent rc..
volumes:
- name: ceph-cephfs-volume
persistentVolumeClaim:
claimName: cephfs-pv-claim1
第二种方式:rdb方式:
1、创建Ceph admin secret
2、创建Ceph pool 和Image
ceph osd pool create kube 128 128 #在ceph集群上
rbd create kube/foo -s 10G --image-feature layering#在k8smaster上 kube/foo 为pool_name/iamge_Name
3、创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: rbd-pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
rbd:
monitors:
- 172.16.0.122:6789
- 172.16.0.123.93:6789
- 172.16.0.124.94:6789
pool: kube
image: foo
user: admin
secretRef:
name: ceph-secret
persistentVolumeReclaimPolicy: Recycle
4、创建pvc vim rdb-pve.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: rbd-pv-claim1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
5、使用
volumes:
- name: ceph-rbd-volume
persistentVolumeClaim:
claimName: rbd-pv-claim1