引言
在k8s csi存储的发展过程中,通过手动创建静态卷(PersistentVolume)的方式似乎已经淹没在历史的长河中。现在为什么要再说呢?在一些特殊的场景,这种方式仍然是可选的解决方案
需求
租户下的不同用户只有操作本用户的目录权限,租户管理应用(对应租户管理员)可以操作整个租户的存储目录(租户目录和用户目录为父子级关系),租户管理员通过租户管理应用可以查看并修改租户下用户的工作数据,并可以对不同的用户存储目录设置配额。
-- 注:为了宿主机安全,用户应用,租户应用都应通过挂载存储卷方式使用存储,避免使用宿主机目录挂载。
需求分析
从需求看,是一个典型的文件存储使用案例。租户管理员的存储卷是普通用户存储卷的父目录,那么在创建用户存储卷时,最好可以指定目录(指定为租户存储卷的子目录)
操作流程
-
在分布式存储创建租户的存储根fs(创建pv时要使用该fs名称), 只需要创建一次,可以运维人员手动创建(下面是ceph的dashboad)
-
创建csi对接账号(创建pv时要用到)
或登录到ceph manager节点通过指令创建,最终秘钥文件需要导出生成K8s中的secret
创建客户端账户
ceph auth get-or-create client.slurm mon "allow r" mds "allow rw" osd 'allow rwx pool=cephfs.testfs.data'
#生成密钥对
ceph auth get client.slurm -o ceph.client.slurm.keyring
ceph auth print-key client.slurm > slurm.key
#发送到客户端
scp -r /etc/ceph/ceph.conf ceph.client.slurm.keyring slurm.key 10.1.0.x:/etc/ceph/
- 创建pv、pvc(假设csi、secret已部署完成)
root@sd-k8s-master-1:/home/zetyun/wb/slurm/hpc-cluster-1# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-test
labels:
name: pv-test
spec:
storageClassName: csi-cephfs-sc-a
accessModes:
- ReadWriteMany
capacity:
storage: 10Gi
csi:
controllerExpandSecretRef:
name: csi-cephfs-secret
namespace: cephfs
nodeStageSecretRef:
name: csi-cephfs-secret
namespace: cephfs
driver: cephfs.csi.ceph.com
volumeHandle: pv-test
volumeAttributes:
clusterID: 92ab6c78-7edc-11ee-aec4-5e807f521aec
fsName: testfs
rootPath: /zetyun/wb # 用户使用用户工作目录,slurm worker使用租户工作目录
staticVolume: "true"
mounter: fuse
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
一些存储厂商可以直接指定目录,不区分fs,无需配置secret(csi里面已经完成了配置),如融焱
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-test
labels:
name: pv-test
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 100Gi
csi:
driver: csi-clusterfileplugin
volumeHandle: pv-test
volumeAttributes:
path: /share/small_files ##指定的目录
root@sd-k8s-master-1:/home/zetyun/wb/slurm/hpc-cluster-1# cat pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test
namespace: hpc-cluster-1
spec:
storageClassName: csi-cephfs-sc-a
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
selector:
matchExpressions:
- key: name
operator: In
values: ["pv-test"]
使用pvc卷
kind: Pod
metadata:
name: slurm-client
namespace: hpc-cluster-1
spec:
#nodeName: las1
containers:
- name: slurm-client
image: harbor.zetyun.cn/aidc/slurm-ubuntu-client:22.04_24.05.1-1
imagePullPolicy: IfNotPresent
env:
- name: ClusterName
value: datacanvas
- name: SlurmctldHost
value: slurm-controller.hpc-cluster-1.svc.cluster.local
volumeMounts:
- name: munge-key
mountPath: '/etc/munge'
- name: data
mountPath: '/mnt/home'
- name: user
mountPath: '/mnt/user'
resources:
requests:
cpu: "10m"
memory: "64Mi"
volumes:
- name: munge-key
configMap:
name: munge-key
items:
- key: munge.key
path: munge.key
- name: data
persistentVolumeClaim:
claimName: userpvc
- name: user
persistentVolumeClaim:
claimName: pvc-test
用户配额,只需要创建用户pvc、pv时指定容量就可以