Ceph使用

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
   

你可能感兴趣的:(Ceph使用)