基于centos7的ceph安装,并做为kubernetes后端storageClass存储来源

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的应用部署和实践,希望能对大家有所帮助。

你可能感兴趣的:(基于centos7的ceph安装,并做为kubernetes后端storageClass存储来源)