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
   

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容