1. 在Ceph上为Kubernetes创建一个文件系统
ceph osd pool create cephfs_data 96
ceph osd pool create cephfs_metadata 32
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:
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/cephfs
ceph-fuse /mnt/cephfs
mkdir /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_test
ceph-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=200
dd: error writing ‘test1.bin’: Disk quota exceeded
129+0 records in
128+0 records out
134348800 bytes (134 MB) copied, 0.428233 s, 314 MB/s
$ df -h
Filesystem Size Used Avail Use% Mounted on
ceph-fuse 92M -64Y -36M 100% /mnt/cephfs
可以看到中途提示超出配额,但是写入了134MB数据,超过了指定的配额100MB。这是因为CephFS的Quotas不是严格的,按官方说法判断检测周期是10s。
再次写入数据,可以发现完全写不进去了:
$ dd if=/dev/zero of=test2.bin bs=1M count=200
dd: error writing ‘test2.bin’: Disk quota exceeded
1+0 records in
0+0 records out
0 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: v1
kind: Pod
metadata:
name: nginx-test-cephfs
spec:
containers:
- name: nginx-test-cephfs
image: nginx
volumeMounts:
- name: cephfs
mountPath: "/data/"
volumes:
- name: cephfs
cephfs:
monitors:
- 192.168.1.121:6789
- 192.168.1.122:6789
- 192.168.1.123:6789
path: /k8s_test
user: k8s
secretRef:
name: ceph-k8s-secret
readOnly: 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: v1
kind: PersistentVolume
metadata:
name: nginx-test-cephfs-pv-01
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- 192.168.1.121:6789
- 192.168.1.122:6789
- 192.168.1.123:6789
path: /k8s_test
user: k8s
secretRef:
name: ceph-k8s-secret
readOnly: false
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-test-cephfs-pvc-01
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Mi
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-test-cephfs-01
spec:
containers:
- name: nginx-test-cephfs
image: nginx
volumeMounts:
- name: cephfs-vol1
mountPath: "/data/"
volumes:
- name: cephfs-vol1
persistentVolumeClaim:
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