Skip to main content

创建和使用 PV

创建挂载配置

在 JuiceFS CSI 驱动中,挂载文件系统所需的认证信息以及挂载参数,均存在 Kubernetes Secret 中。所以为了使用 JuiceFS 文件系统,首先需要创建 Kubernetes Secret。

备注

如果你已经在用 Helm 管理 StorageClass,那么 Kubernetes Secret 其实已经一并创建,此时我们推荐你继续直接用 Helm 管理 StorageClass 与 Secret,而不是用 kubectl 再单独创建和管理 Secret。

社区版

使用 PV 前,请先创建好 JuiceFS 文件系统。例如:

juicefs format \
--storage=s3 \
--bucket=https://<BUCKET>.s3.<REGION>.amazonaws.com \
--access-key=<ACCESS_KEY> --secret-key=<SECRET_KEY> \
<META_URL> \
<NAME>

然后创建 Kubernetes Secret:

apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
type: Opaque
stringData:
name: <JUICEFS_NAME>
metaurl: <META_URL>
storage: s3
bucket: https://<BUCKET>.s3.<REGION>.amazonaws.com
access-key: <ACCESS_KEY>
secret-key: <SECRET_KEY>
# 设置 Mount Pod 时区,默认为 UTC。
# envs: "{TZ: Asia/Shanghai}"
# 如需在 Mount Pod 中创建文件系统,也可以直接填入 format-options。
# format-options: trash-days=1,block-size=4096

字段说明:

如遇重复参数(比如 access-key),既可以在 Kubernetes Secret 中填写,同时也可以在 format-options 下填写,此时 format-options 的参数优先级最高。

云服务

操作之前,请先在 JuiceFS 云服务中创建文件系统

创建 Kubernetes Secret:

apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
type: Opaque
stringData:
name: ${JUICEFS_NAME}
token: ${JUICEFS_TOKEN}
access-key: ${ACCESS_KEY}
secret-key: ${SECRET_KEY}
# 设置 Mount Pod 时区,默认为 UTC。
# envs: "{TZ: Asia/Shanghai}"
# 如需在 Mount Pod 中运行 juicefs auth 命令以调整挂载配置,可以将 auth 命令参数填写至 format-options。
# format-options: bucket2=xxx,access-key2=xxx,secret-key2=xxx

字段说明:

  • name:JuiceFS 文件系统名称
  • token:访问 JuiceFS 文件系统所需的 token。更多信息参考访问令牌
  • access-key/secret-key:对象存储的认证信息
  • envs:Mount Pod 的环境变量
  • format-options:云服务 juicefs auth 命令所使用的的参数,作用是认证,以及生成挂载的配置文件。该选项仅在 v0.13.3 及以上可用。

如遇重复参数(比如 access-key),既可以在 Kubernetes Secret 中填写,同时也可以在 format-options 下填写,此时 format-options 的参数优先级最高。

云服务的 juicefs auth 命令作用类似于社区版的 juicefs format 命令,因此字段名依然叫做 format-options

动态配置

阅读「使用方式」以了解什么是「动态配置」。动态配置方式会自动为你创建 PV,而创建 PV 的基础配置参数在 StorageClass 中定义,因此你需要先行创建 StorageClass

部署

创建 PersistentVolumeClaim(PVC)和示例 pod:

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: juicefs-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Pi
storageClassName: juicefs-sc
---
apiVersion: v1
kind: Pod
metadata:
name: juicefs-app
namespace: default
spec:
containers:
- args:
- -c
- while true; do echo $(date -u) >> /data/out.txt; sleep 5; done
command:
- /bin/sh
image: centos
name: app
volumeMounts:
- mountPath: /data
name: juicefs-pv
volumes:
- name: juicefs-pv
persistentVolumeClaim:
claimName: juicefs-pvc
EOF

确认容器顺利创建运行后,可以钻进容器里确认数据正常写入 JuiceFS:

kubectl exec -ti juicefs-app -- tail -f /data/out.txt

使用通用临时卷

通用临时卷类似于 emptyDir,为 pod 提供临时数据存放目录。当应用容器需要大容量临时存储时,可以考虑这样使用 JuiceFS CSI 驱动。

JuiceFS CSI 驱动的通用临时卷用法与「动态配置」类似,因此也需要先行创建 StorageClass。不过与「动态配置」不同,临时卷使用 volumeClaimTemplate,能直接为你自动创建 PVC。

在 Pod 定义中声明使用通用临时卷:

apiVersion: v1
kind: Pod
metadata:
name: juicefs-app
namespace: default
spec:
containers:
- args:
- -c
- while true; do echo $(date -u) >> /data/out.txt; sleep 5; done
command:
- /bin/sh
image: centos
name: app
volumeMounts:
- mountPath: /data
name: juicefs-pv
volumes:
- name: juicefs-pv
ephemeral:
volumeClaimTemplate:
metadata:
labels:
type: juicefs-ephemeral-volume
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "juicefs-sc"
resources:
requests:
storage: 1Gi
备注

在回收策略方面,临时卷与动态配置一致,因此如果将默认 PV 回收策略设置为 Retain,那么临时存储将不再是临时存储,PV 需要手动释放。

静态配置

阅读「使用方式」以了解什么是「静态配置」。

所谓「静态配置」,指的是自行创建 PV 和 PVC,流程类似「配置 Pod 以使用 PersistentVolume 作为存储」

动态配置免除了手动创建和管理 PV 的麻烦,但如果你在 JuiceFS 中已经有了大量数据,希望能在 Kubernetes 中直接挂载到容器中使用,则需要选用静态配置的方式来使用。

部署

创建 PersistentVolume(PV)、PersistentVolumeClaim(PVC)和示例 pod:

注意

PV 的 volumeHandle 需要保证集群内唯一,因此一般直接用 PV name 即可。

apiVersion: v1
kind: PersistentVolume
metadata:
name: juicefs-pv
labels:
juicefs-name: ten-pb-fs
spec:
capacity:
storage: 10Pi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: csi.juicefs.com
volumeHandle: juicefs-pv
fsType: juicefs
nodePublishSecretRef:
name: juicefs-secret
namespace: default
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: juicefs-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
storageClassName: ""
resources:
requests:
storage: 10Pi
selector:
matchLabels:
juicefs-name: ten-pb-fs
---
apiVersion: v1
kind: Pod
metadata:
name: juicefs-app
namespace: default
spec:
containers:
- args:
- -c
- while true; do echo $(date -u) >> /data/out.txt; sleep 5; done
command:
- /bin/sh
image: centos
name: app
volumeMounts:
- mountPath: /data
name: data
resources:
requests:
cpu: 10m
volumes:
- name: data
persistentVolumeClaim:
claimName: juicefs-pvc

当所有的资源创建好之后,可以用以下命令确认一切符合预期:

# 确认 PV 正常创建
kubectl get pv juicefs-pv

# 确认 pod 正常运行
kubectl get pods juicefs-app

# 确认数据被正确地写入 JuiceFS 文件系统中(也可以直接在宿主机挂载 JuiceFS,确认 PV 对应的子目录已经在文件系统中创建)
kubectl exec -ti juicefs-app -- tail -f /data/out.txt

如果需要调整挂载参数,可以在上方的 PV 定义中追加 mountOptions 配置:

apiVersion: v1
kind: PersistentVolume
metadata:
name: juicefs-pv
labels:
juicefs-name: ten-pb-fs
spec:
mountOptions:
- enable-xattr
- max-uploads=50
- cache-size=2048
- cache-dir=/var/foo
- allow_other
...

JuiceFS 社区版与云服务的挂载参数有所区别,请参考文档:

常用 PV 设置

PV 容量分配

目前而言,JuiceFS CSI 驱动不支持设置存储容量。在 PersistentVolume 和 PersistentVolumeClaim 中指定的容量会被忽略,填写任意有效值即可,例如 100Gi

resources:
requests:
storage: 100Gi

访问模式

JuiceFS PV 支持 ReadWriteManyReadOnlyMany 两种访问方式。根据使用 CSI 驱动的方式不同,在上方 PV/PVC,(或 volumeClaimTemplate)定义中,填写需要的 accessModes 即可。