1. 在Ceph上为Kubernetes创建一个文件系统

  1. ceph osd pool create cephfs_data 96
  2. ceph osd pool create cephfs_metadata 32
  3. ceph fs new cephfs cephfs_metadata cephfs_data

2. CephFS配置Quotas
CephFS的mount方式分为内核态mount和用户态mount,内核态使用mount命令挂载,用户态使用ceph-fuse。内核态只有在kernel 4.17 + Ceph mimic以上的版本才支持Quotas,用户态则没有限制。
内核态mount:

  1. mount -t ceph 10.32.3.70:/k8s_test /mnt/cephfs/ -o name=admin,secret=AQCs2Q9bqAjCHRAAlQUF+hAiXhbErk4NdtvORQ==

用户态mount:

  1. ceph-fuse -r /k8s_test /mnt/cephfs/ --name client.admin

配置quota:
1) 首先在CephFS创建一个要限额的目录

  1. mkdir /mnt/cephfs
  2. ceph-fuse /mnt/cephfs
  3. mkdir /mnt/cephfs/k8s_test

2) 然后在目录上使用setfattr设置限额属性

  1. setfattr -n ceph.quota.max_bytes -v 100000000 /mnt/cephfs/k8s_test

比如上面这条命令限制/k8s_test目录只能使用100MB大小的空间。
3) 挂载限额目录并测试

  1. mkdir /mnt/k8s_test
  2. ceph-fuse -r /k8s_test /mnt/k8s_test/ --name client.admin --client-quota

由于使用的内核和Ceph版本比较低,只能在用户态测试。在Jewel及之前版本的ceph-fuse,挂载时要指定—client-quota参数,限额才会生效。而在Luminous之后的版本,则不支持这个参数了,会自动识别quota。

  1. $ cd /mnt/k8s_test
  2. $ dd if=/dev/zero of=test1.bin bs=1M count=200
  3. dd: error writing test1.bin’: Disk quota exceeded
  4. 129+0 records in
  5. 128+0 records out
  6. 134348800 bytes (134 MB) copied, 0.428233 s, 314 MB/s
  7. $ df -h
  8. Filesystem Size Used Avail Use% Mounted on
  9. ceph-fuse 92M -64Y -36M 100% /mnt/cephfs

可以看到中途提示超出配额,但是写入了134MB数据,超过了指定的配额100MB。这是因为CephFS的Quotas不是严格的,按官方说法判断检测周期是10s。

再次写入数据,可以发现完全写不进去了:

  1. $ dd if=/dev/zero of=test2.bin bs=1M count=200
  2. dd: error writing test2.bin’: Disk quota exceeded
  3. 1+0 records in
  4. 0+0 records out
  5. 0 bytes (0 B) copied, 0.00162182 s, 0.0 kB/s

3. 更新k8s用户权限

  1. ceph auth caps client.k8s mon 'allow rwx' osd 'allow rwx pool=k8s, allow rw pool=cephfs_data' mds 'allow rwp'

如果还没有创建k8s用户,则使用下面的命令创建:

  1. 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类型,使用方法:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx-test-cephfs
  5. spec:
  6. containers:
  7. - name: nginx-test-cephfs
  8. image: nginx
  9. volumeMounts:
  10. - name: cephfs
  11. mountPath: "/data/"
  12. volumes:
  13. - name: cephfs
  14. cephfs:
  15. monitors:
  16. - 192.168.1.121:6789
  17. - 192.168.1.122:6789
  18. - 192.168.1.123:6789
  19. path: /k8s_test
  20. user: k8s
  21. secretRef:
  22. name: ceph-k8s-secret
  23. readOnly: false

进入容器查看:

  1. $ kubectl exec nginx-test-cephfs -it -- /bin/bash
  2. [root@nginx-test-cephfs ~]# df -h

5. Kubernetes Persistent Volume使用CephFS
Kubernetes Persistent Volume原生支持CephFS类型,使用方法:

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: nginx-test-cephfs-pv-01
  5. spec:
  6. capacity:
  7. storage: 100Mi
  8. accessModes:
  9. - ReadWriteMany
  10. cephfs:
  11. monitors:
  12. - 192.168.1.121:6789
  13. - 192.168.1.122:6789
  14. - 192.168.1.123:6789
  15. path: /k8s_test
  16. user: k8s
  17. secretRef:
  18. name: ceph-k8s-secret
  19. readOnly: false
  20. ---
  21. kind: PersistentVolumeClaim
  22. apiVersion: v1
  23. metadata:
  24. name: nginx-test-cephfs-pvc-01
  25. spec:
  26. accessModes:
  27. - ReadWriteMany
  28. resources:
  29. requests:
  30. storage: 50Mi
  31. ---
  32. apiVersion: v1
  33. kind: Pod
  34. metadata:
  35. name: nginx-test-cephfs-01
  36. spec:
  37. containers:
  38. - name: nginx-test-cephfs
  39. image: nginx
  40. volumeMounts:
  41. - name: cephfs-vol1
  42. mountPath: "/data/"
  43. volumes:
  44. - name: cephfs-vol1
  45. persistentVolumeClaim:
  46. claimName: nginx-test-cephfs-pvc-01

进入容器查看:

  1. $ kubectl exec nginx-test-cephfs -it -- /bin/bash
  2. [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