美文网首页
基于centos7的ceph安装,并做为kubernetes后端

基于centos7的ceph安装,并做为kubernetes后端

作者: 我只爱钱 | 来源:发表于2020-05-08 17:17 被阅读0次

    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后端

          本文链接:https://www.haomeiwen.com/subject/htgwghtx.html