linux cpu占用率如何看
354
2022-10-26
k8s集群对接cephfs
cephfs简介
CephFS是个与POSIX标准兼容的文件系统,坐于基于对象的 Ceph 存储集群之上,其内的文件被映射到 Ceph 存储集群内的对象。客户端可以把此文件系统挂载在内核对象或用户空间文件系统( FUSE )上。文件目录和其他元数据存储在ceph的RADOS中,而MDS缓存元信息和文件目录信息。主要特点如下:
可以支持内核空间mount -t ceph方式挂载,也支持用户空间的ceph-fuse方式挂载 多个clients可以同时读写,属于共享文件系统 由于底层是ceph,并且MDS支持主备,能够实现高可用 配额管理:1)用户空间的ceph-fuse方式挂载支持空间的配额管理2)内核空间的挂载支持配额管理需要ceph mimic+以上版本的集群和挂载cephfs的客户端kernel版本为>=4.17
在k8s环境下使用ceph rbd和cephfs的对比
多client挂载 ceph rbd支持同一个node下多pod的挂载; cephfs支持跨node的多pod的挂载,实现共享; 性能 ceph rbd读取写入延迟低,I/O带宽表现良好; cephfs读取延迟低,写入延迟差一点,I/O带宽表现良好,尤其是block size较大一些的文件;存储空间使用过大可能出现性能瓶颈; 配额管理 ceph rbd支持; cephfs有条件支持; 挂载权限管理 在k8s 1.18环境,ceph rbd有内置provisioner,且受securityContext管理; 在k8s 1.18环境,cephfs使用第三方的provisioner(v0.1.2),且不受securityContext管理,挂载到目录之后,挂载点默认权限为root:root,如果容器中服务用非root用户运行要向挂载目录写入数据可能导致权限不足;
环境准备
需要提前部署好ceph集群,见:Metadata Server)服务用来存放cepfs服务依赖元数据信息,有条件的可以创建2个会自动成为主备。在ceph1上创建mds服务:
# ceph-deploy mds create ceph1 ceph2
一个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手动挂载测试 在ceph1上创建一个能访问cephfs的用户 # ceph auth get-or-create client.cephfs mon "allow r" mds "allow rw" osd "allow rw pool=cephfs-data, allow rw pool=cephfs-metadata" [client.cephfs] key = AQD1LfVffTlMHBAAove2EgMyJ8flMNYZG9VbTA== # ceph auth get client.cephfs exported keyring for client.cephfs [client.cephfs] key = AQD1LfVffTlMHBAAove2EgMyJ8flMNYZG9VbTA== caps mds = "allow rw" caps mon = "allow r" caps osd = "allow rw pool=cephfs-data, allow rw pool=cephfs-metadata"
把cephfs用户对应的key访问如文件,并使用mount命令来挂载。卸载的话,通过umount命令直接卸载即可:
# echo "AQD1LfVffTlMHBAAove2EgMyJ8flMNYZG9VbTA==" >> /tmp/lee.secret # mount -t ceph 172.18.2.172:6789,172.18.2.178:6789,172.18.2.189:6789:/ /mnt -o name=admin,secretfile=/tmp/lee.secret # df -h|grep mnt 172.18.2.172:6789,172.18.2.178:6789,172.18.2.189:6789:/ 586G 98G 488G 17% /mnt
通过storageclass动态创建基于cephfs的pv
现在cephfs已经部署完成,现在需要考虑k8s对接cephfs使用的问题了。k8s使用cephfs进行数据持久化时,主要有三种方式:
使用k8s支持的cephfs类型volume直接挂载。 使用k8s支持的PV&PVC方式进行数据卷的挂载。 使用社区提供的一个cephfs provisioner来支持以storageClass的方式动态的分配PV,来进行挂载。目前使用的k8s1.18内置provisioner暂时还没有提供这个功能。
我们接下来介绍通过storageclass资源来动态分配pv的方法。
storageclass资源介绍
storageclass一般由管理员创建,它作为存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节操作,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理PV的工作,由系统根据spec自动完成PV的创建和绑定,实现了动态的资源供应。并且,storageclass是不受namespace限制的。storageclass的关键组成:
provisioner每个storageclass都有一个provisioner,用来决定使用哪个卷插件创建PV,该字段必须指定。不同的存储有对应的provisioner,但是k8s内置了一些存储的provisioner,另外有一些存储没有内置到k8s中。没有内置的,可以使用外部第三方的provisioner,第三方的provisioner要符合k8s定义的规范proposals/volume-provisioning.md parameters后端存储资源提供者的参数设置,不同的provisioner包括不同的参数设置。某些参数可以不显示设定,provisioner将使用其默认值。例如ceph存储的参数可以由ceph集群的monitor地址,存储池,默认文件系统等参数构成。 reclaimPolicy由storageclass动态创建的pv会在类的reclaimPolicy字段中指定回收策略,可以是Delete或者 Retain。如果storageclass对象被创建时没有指定reclaimPolicy,它将默认为Delete。通过storageclass手动创建并管理的pv会使用它们被创建时指定的回收政策。
安装cephfs-provisioner
cephfs-provisioner.go是cephfs-provisioner(cephfs的storageclass)的核心,主要是 watch kubernetes中 PVC 资源的CURD事件,然后以命令行方式调用 cephfs_provisor.py脚本创建PV。 cephfs_provisioner.pypython 脚本实现的与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
过几分钟检查是否安装成功
# 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: 172.18.2.172:6789,172.18.2.178:6789,172.18.2.189: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
跨不同node的pod之间存储共享
创建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 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE claim-local Bound pvc-d30fda86-acfd-48e2-b7bc-568f6148332f 1Gi RWX cephfs 25s
创建一个绑定此pvc的pod,名字为cephfs-pv-pod1:
# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: cephfs-pv-pod1
spec:
containers:
- name: cephfs-pv-busybox1
image: busybox
command: ["sleep", "60000"]
volumeMounts:
- mountPath: "/mnt/cephfs"
name: cephfs-vol1
readOnly: false
volumes:
- name: cephfs-vol1
persistentVolumeClaim:
claimName: claim-local
# kubectl apply -f pod.yaml
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cephfs-pv-pod1 1/1 Running 0 33s 10.101.26.40 work4
我们发现cephfs-pv-pod1被调度到了work4,故我们给work1添加一个label,然后创建一个cephfs-pv-pod2并设置label把此pod调度到work1:
# kubectl label nodes work1 type=test
# kubectl get nodes --show-labels|grep work1
work1 Ready
我们看到两个被调度到不同node的pod已经运行正常了,现在我们在cephfs-pv-pod1的存储写入数据,然后查看cephfs-pv-pod2的存储是否正常同步:
# kubectl exec -it cephfs-pv-pod1 sh / # echo "test" >> /mnt/cephfs/1.txt # kubectl exec -it cephfs-pv-pod2 sh / # cat /mnt/cephfs/1.txt test
我们发现cephfs存储已经正常挂载和使用了,至此k8s对接cephfs完成。
参考资料
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~