searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

CCSE支持CephFS存储实现方案

2023-12-22 01:59:14
15
0

一、背景
        在IT上云CCSE组件的使用过程中,部分应用容器,组件容器化场景需要使用共享存储进行持久化,为此对cephfs及存储类、持久卷及持久卷声明类型等进行了一些研究,最终在CCSE中实现了对cephfs存储的支持,总结如下:
二、cephfs 部署
1、ceph 认证key创建
# 使用 cephfs-secret
# 不过要提一下的是,k8s secret 认证 key 需要使用 base64 编码。
# 获取 Ceph ceph.client.admin.keyring 并生成 secret key
$ ceph auth get-key client.admin |base64
QVFEMDFWVmFWdnp6TFJBQWFUVVJ5VVp3STlBZDN1WVlGUkwrVkE9PQ==

#修改 ceph-secret.yaml 文件中,key 字段替换成上边生成的字符串。
$ cat ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: QVFEMDFWVmFWdnp6TFJBQWFUVVJ5VVp3STlBZDN1WVlGUkwrVkE9PQ==

#创建名称为 ceph-secret 的 Secret。
$ kubectl create -f ceph-secret.yaml
secret "ceph-secret" created
$ kubectl get secret
NAME                  TYPE                                  DATA      AGE
ceph-secret           Opaque                                1         11s
default-token-jg3f8   kubernetes.io/service-account-token   3         28m
2、ceph文件挂载
ceph-deploy mds create h020112 h020113 h020114    # ceph部署主机名
ceph osd pool create yks_cephfs_data
ceph osd pool create yks_cephfs_metadata

### 准备在客户端挂载ceph ###

# 首先客户端必须先安装ceph-common
$ yum -y install ceph-common
# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
 key = AQDtII9dbHLPDBAAMWpxENTLLjSDGLm7CrCd4w==
# 将key写入文件/etc/ceph/admin.secret中
$ echo "AQDtII9dbHLPDBAAMWpxENTLLjSDGLm7CrCd4w==" > /etc/ceph/admin.secret
# 挂载ceph
$ mkdir /mnt/cephfs
$ mount -t ceph 192.168.20.114:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/admin.secret
$ echo "192.168.20.114:6789:/ /mnt/cephfs    ceph    name=admin,secretfile=/etc/ceph/admin.secret,noatime   0   2" >> /etc/fstab
# 挂载成功后,即可使用cephfs文件系统
3、创建cephfs
一个cephfs需要至少两个RADOS存储池,一个用于数据、一个用于元数据。配置这些存储池时需考虑:
• 为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效;
• 为元数据存储池分配低延时存储器(例如SSD),因为它会直接影响到客户端的操作延时;
  我们在ceph1上来创建存储池和和cephfs:
ceph osd pool create cephfs-data 128 128
ceph osd pool create cephfs-metadata 128 128
ceph fs new cephfs cephfs-metadata cephfs-data
创建完成之后,查看mds和fs的状态:
# ceph mds stat
e6: 1/1/1 up {0=ceph2=up:active}, 1 up:standby
# ceph fs ls
name: cephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
----cephfs手动挂载测试
cephfs-provisioner
主要有两部分:
• cephfs-provisioner.go
是cephfs-provisioner(cephfs的storageclass)的核心,主要是 watch kubernetes中 PVC 资源的CURD事件,然后以命令行方式调用 cephfs_provisor.py脚本创建PV。
• cephfs_provisioner.py
python 脚本实现的与cephfs交互的命令行工具。cephfs-provisioner 对cephfs端volume的创建都是通过该脚本实现。里面封装了volume的增删改查等功能。
安装
# git clone https://github.com/kubernetes-retired/external-storage.git
# cd external-storage/ceph/cephfs/deploy/
# NAMESPACE=kube-system
# sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/*.yaml
# sed -i "/PROVISIONER_SECRET_NAMESPACE/{n;s/value:.*/value: $NAMESPACE/;}" rbac/deployment.yaml
# kubectl -n $NAMESPACE apply -f ./rbac

#这里注意cephfs-provisioner需提前下载,并上传至本地harbor仓库,然后手动修改deployment为本地路径
过几分钟检查是否安装成功
# kubectl get pods -n kube-system|grep 'cephfs-provisioner'
cephfs-provisioner-6c4dc5f646-swncq        1/1     Running   0          1h
----为cephfs创建stoageclass资源
我们复用ceph rdb存储的secret作为cephfs的secret:
# vim sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: cephfs
provisioner: ceph.com/cephfs
parameters:
    monitors: 137.32.104.156:6789,137.32.104.152:6789,137.32.104.154:6789
    adminId: admin
    adminSecretNamespace: "kube-system"
    adminSecretName: ceph-secret

# kubectl apply -f sc.yaml
# kubectl get storageclass
NAME                 PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
ceph-rbd (default)   ceph.com/rbd                 Delete          Immediate           false                  216d
cephfs               ceph.com/cephfs              Delete          Immediate           false                  2h
----pvc创建测试
创建pvc并配置对应的storageclass,并确保pvc的status为Bound,代表storageclass创建和绑定pv成功:
# vim pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: claim-local
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: "cephfs"

# kubectl apply -f pvc.yaml
# kubectl get pvc|grep claim-local
[docker@ccse-102 ~]$ kubectl get pvc
NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
claim1   Bound    pvc-0a999733-a8b2-4813-a575-c12e6e9ae1db   1Gi        RWX            cephfs         5d19h
claim2   Bound    pvc-71d1fa2c-d2be-4a04-83dc-60ef7d169636   1Gi        RWX            cephfs         5d2h

----ccse 存储类修改
#ccse存储类更新
mysql> select * from sys_dict where dict_code like 'cs_provi%';
mysql> select * from sys_dict_item where dict_code like 'CS_PROVISIONER';
#以下记录为我们手动插入的内容
mysql> select * from sys_dict_item where item_id=500\G
*************************** 1. row ***************************
      item_id: 500
    dict_code: CS_PROVISIONER
    item_code: ccse.io/cephfs     #和CS_PROVISIONER部署名称保持一致,这里我手动修改过
   item_value: ceph文件系统
    item_desc: ceph fs
   is_default: 0
   list_order: 4
       status: 1
   created_by: 1
 created_time: 2021-04-02 15:27:44
  modified_by: NULL
modified_time: 2021-04-02 15:30:32
1 row in set (0.00 sec)

三、使用情况

0条评论
0 / 1000