1. 在Ceph上为Kubernetes创建一个文件系统
ceph osd pool create cephfs_data 96ceph osd pool create cephfs_metadata 32ceph fs new cephfs cephfs_metadata cephfs_data
2. CephFS配置Quotas
CephFS的mount方式分为内核态mount和用户态mount,内核态使用mount命令挂载,用户态使用ceph-fuse。内核态只有在kernel 4.17 + Ceph mimic以上的版本才支持Quotas,用户态则没有限制。
内核态mount:
mount -t ceph 10.32.3.70:/k8s_test /mnt/cephfs/ -o name=admin,secret=AQCs2Q9bqAjCHRAAlQUF+hAiXhbErk4NdtvORQ==
用户态mount:
ceph-fuse -r /k8s_test /mnt/cephfs/ --name client.admin
配置quota:
1) 首先在CephFS创建一个要限额的目录
mkdir /mnt/cephfsceph-fuse /mnt/cephfsmkdir /mnt/cephfs/k8s_test
2) 然后在目录上使用setfattr设置限额属性
setfattr -n ceph.quota.max_bytes -v 100000000 /mnt/cephfs/k8s_test
比如上面这条命令限制/k8s_test目录只能使用100MB大小的空间。
3) 挂载限额目录并测试
mkdir /mnt/k8s_testceph-fuse -r /k8s_test /mnt/k8s_test/ --name client.admin --client-quota
由于使用的内核和Ceph版本比较低,只能在用户态测试。在Jewel及之前版本的ceph-fuse,挂载时要指定—client-quota参数,限额才会生效。而在Luminous之后的版本,则不支持这个参数了,会自动识别quota。
$ cd /mnt/k8s_test$ dd if=/dev/zero of=test1.bin bs=1M count=200dd: error writing ‘test1.bin’: Disk quota exceeded129+0 records in128+0 records out134348800 bytes (134 MB) copied, 0.428233 s, 314 MB/s$ df -hFilesystem Size Used Avail Use% Mounted onceph-fuse 92M -64Y -36M 100% /mnt/cephfs
可以看到中途提示超出配额,但是写入了134MB数据,超过了指定的配额100MB。这是因为CephFS的Quotas不是严格的,按官方说法判断检测周期是10s。
再次写入数据,可以发现完全写不进去了:
$ dd if=/dev/zero of=test2.bin bs=1M count=200dd: error writing ‘test2.bin’: Disk quota exceeded1+0 records in0+0 records out0 bytes (0 B) copied, 0.00162182 s, 0.0 kB/s
3. 更新k8s用户权限
ceph auth caps client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s, allow rw pool=cephfs_data' mds 'allow rwp'
如果还没有创建k8s用户,则使用下面的命令创建:
ceph auth get-or-create client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s, allow rw pool=cephfs_data' mds 'allow rwp' -o ceph.client.k8s.keyring
在Kubernets中创建访问Ceph的Secret:
4. Kubernetes Volume使用CephFS
Kubernetes Volume原生支持CephFS类型,使用方法:
apiVersion: v1kind: Podmetadata:name: nginx-test-cephfsspec:containers:- name: nginx-test-cephfsimage: nginxvolumeMounts:- name: cephfsmountPath: "/data/"volumes:- name: cephfscephfs:monitors:- 192.168.1.121:6789- 192.168.1.122:6789- 192.168.1.123:6789path: /k8s_testuser: k8ssecretRef:name: ceph-k8s-secretreadOnly: false
进入容器查看:
$ kubectl exec nginx-test-cephfs -it -- /bin/bash[root@nginx-test-cephfs ~]# df -h
5. Kubernetes Persistent Volume使用CephFS
Kubernetes Persistent Volume原生支持CephFS类型,使用方法:
apiVersion: v1kind: PersistentVolumemetadata:name: nginx-test-cephfs-pv-01spec:capacity:storage: 100MiaccessModes:- ReadWriteManycephfs:monitors:- 192.168.1.121:6789- 192.168.1.122:6789- 192.168.1.123:6789path: /k8s_testuser: k8ssecretRef:name: ceph-k8s-secretreadOnly: false---kind: PersistentVolumeClaimapiVersion: v1metadata:name: nginx-test-cephfs-pvc-01spec:accessModes:- ReadWriteManyresources:requests:storage: 50Mi---apiVersion: v1kind: Podmetadata:name: nginx-test-cephfs-01spec:containers:- name: nginx-test-cephfsimage: nginxvolumeMounts:- name: cephfs-vol1mountPath: "/data/"volumes:- name: cephfs-vol1persistentVolumeClaim:claimName: nginx-test-cephfs-pvc-01
进入容器查看:
$ kubectl exec nginx-test-cephfs -it -- /bin/bash[root@nginx-test-cephfs ~]# df -h
6. Kubernetes StorageClass使用CephFS
Kubernetes StorageClass原生不支持CephFS,但是在社区的孵化项目External Storage中添加了CephFS类型的StorageClass。External Storage是对核心的Kubernetes controller manager的扩展,其中包含的每个external provisioner可以独立部署以支持扩展的StorageClass类型。
进一步配置,请参考 https://www.cnblogs.com/ltxdzh/p/9173706.html
参考
语雀:K8s配置CephFS StorageClass
https://www.yuque.com/junetalk/cloudnative/sts4wp
语雀:持久卷CEPH安装
https://www.yuque.com/bzxr/sfdmic/an96tx
