一、背景
在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)
三、使用情况