Skip to main content

在 Kubernetes 中使用 JuiceFS 的静态配置方法

本文档展示了如何在 pod 内安装静态配置的 JuiceFS PersistentVolume(PV)。

准备工作

在 Kubernetes 中创建 CSI Driver 的 Secret,社区版和云服务版所需字段有所区别,分别如下:

社区版

以 Amazon S3 为例:

apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
type: Opaque
stringData:
name: <NAME>
metaurl: redis://[:<PASSWORD>]@<HOST>:6379[/<DB>]
storage: s3
bucket: https://<BUCKET>.s3.<REGION>.amazonaws.com
access-key: <ACCESS_KEY>
secret-key: <SECRET_KEY>
# 如果需要设置 JuiceFS Mount Pod 的时区请将下一行的注释符号删除,默认为 UTC 时间。
# envs: "{TZ: Asia/Shanghai}"

其中:

  • name:JuiceFS 文件系统名称
  • metaurl:元数据服务的访问 URL (比如 Redis)。更多信息参考这篇文档
  • storage:对象存储类型,比如 s3gsoss。更多信息参考这篇文档
  • bucket:Bucket URL。更多信息参考这篇文档
  • access-key:对象存储的 access key。
  • secret-key:对象存储的 secret key。

用您自己的环境变量替换由 <> 括起来的字段。 [] 中的字段是可选的,它与您的部署环境相关。

您应该确保:

  1. access-keysecret-key 对需要有对象存储 bucket 的 GetObjectPutObjectDeleteObject 权限。
  2. Redis DB 是干净的,并且 password(如果有的话)是正确的

您可以执行 juicefs format 命令确保 Secret 是正确的:

juicefs format --storage=s3 --bucket=https://<BUCKET>.s3.<REGION>.amazonaws.com \
--access-key=<ACCESS_KEY> --secret-key=<SECRET_KEY> \
redis://[:<PASSWORD>]@<HOST>:6379[/<DB>] <NAME>

云服务版

apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
type: Opaque
stringData:
name: ${JUICEFS_NAME}
token: ${JUICEFS_TOKEN}
access-key: ${JUICEFS_ACCESSKEY}
secret-key: ${JUICEFS_SECRETKEY}
# 如果需要设置 JuiceFS Mount Pod 的时区请将下一行的注释符号删除,默认为 UTC 时间。
# envs: "{TZ: Asia/Shanghai}"

其中:

  • name:JuiceFS 文件系统名称
  • token:JuiceFS 管理 token。更多信息参考这篇文档
  • access-key:对象存储的 access key。
  • secret-key:对象存储的 secret key。

您应该确保 access-keysecret-key 对需要有对象存储 bucket 的 GetObjectPutObjectDeleteObject 权限。

部署

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

注意

PV 的 volumeHandle 需要保证集群内唯一,用 PV name 即可。

说明

由于 JuiceFS 是一个弹性文件系统,它不需要强制分配容量。你在 PersistentVolumePersistentVolumeClaim 中指定的容量并不是实际存储容量。但是,由于存储容量是 Kubernetes 的必填字段,因此您可以使用任何有效值,例如 10Pi 表示容量。

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

检查使用的 JuiceFS 文件系统

当所有的资源创建好之后,确认 10 Pi PV 创建好:

kubectl get pv

确认 pod 状态是 running:

kubectl get pods

确认数据被正确地写入 JuiceFS 文件系统中:

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

也可以通过将 JuiceFS 挂载到主机来验证在 JuiceFS 文件系统中创建了 PV 的目录:

juicefs mount -d redis://[:<PASSWORD>]@<HOST>:6379[/<DB>] /jfs