创建和使用 PV
文件系统认证信息
在 JuiceFS CSI 驱动中,挂载文件系统所需的认证信息,均存在 Kubernetes Secret 中。所谓「认证信息」,在 JuiceFS 社区版和云服务有着不同的含义:
- 对于社区版而言,「认证信息」包含元数据引擎 URL、对象存储密钥,以及
juicefs format
命令所支持的其他参数。 - 对于云服务而言,「认证信息」包含文件系统名称、Token、对象存储密钥,以及
juicefs auth
命令所支持的其他参数。
虽然下方的示范中,Secret 都命名为了 juicefs-secret
,但事实上命名是自定义的,你可以创建出多个 Secret,存储不同的文件系统认证信息,这样便可以在同一个 Kubernetes 集群中使用多个不同的文件系统。详见「使用多个文件系统」。
- 如果你已经在用 Helm 管理 StorageClass,那么 Kubernetes Secret 其实已经一并创建,不需要再用 kubectl 单独创建和管理 Secret。
- 修改了文件系统认证信息后,还需要滚动升级或重启应用 Pod,CSI 驱动重新创建 Mount Pod,配置变更方能生效。
- Secret 中只存储文件系统认证信息(也就是社区版
juicefs format
和云服务juicefs auth
命令所需的参数),并不支持填写挂载参数,如果你希望修改挂载参数,参考「挂载参数」。
社区版
创建 Kubernetes Secret:
apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
namespace: default
labels:
# 增加该标签以启用认证信息校验
juicefs.com/validate-secret: "true"
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 中创建文件系统,也可以将更多 juicefs format 参数填入 format-options。
# format-options: trash-days=1,block-size=4096
字段说明:
name
:JuiceFS 文件系统名称metaurl
:元数据服务的访问 URL。更多信息参考「如何设置元数据引擎」 。storage
:对象存储类型,比如s3
,gs
,oss
。更多信息参考「如何设置对象存储」 。bucket
:对象存储 Bucket URL。更多信息参考「如何设置对象存储」 。access-key
/secret-key
:对象存储的认证信息envs
:Mount Pod 的环境变量format-options
:创建文件系统的选项,详见juicefs format
如遇重复参数,比如 access-key
,既可以在 stringData.access-key
中填写,同时也可以在 format-options
下填写,此时 format-options
的参数优先级最高。
云服务
操作之前,请先在 JuiceFS 云服务中创建文件系统。
创建 Kubernetes Secret:
apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
namespace: default
labels:
# 增加该标签以启用认证信息校验
juicefs.com/validate-secret: "true"
type: Opaque
stringData:
name: ${JUICEFS_NAME}
token: ${JUICEFS_TOKEN}
access-key: ${ACCESS_KEY}
secret-key: ${SECRET_KEY}
# 设置 Mount Pod 时区,默认为 UTC。
# envs: "{TZ: Asia/Shanghai}"
# 如需指定更多认证参数,可以将 juicefs 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
命令所使用的的参数,作用是认证,以及生成挂载的配置文件
如遇重复参数,比如 access-key
,既可以在 stringData.access-key
中填写,同时也可以在 format-options
下填写,此时 format-options
的参数优先级最高。
云服务的 juicefs auth
命令作用类似于社区版的 juicefs format
命令,因此字段名依然叫做 format-options
,关于这点请继续阅读格式化参数/认证参数。
企业版(私有部署)
JuiceFS Web 控制台负责着客户端的挂载认证、配置文件下发等工作。而在私有部署环境中,控制台的地址不再是 https://juicefs.com/console,因此需要在文件系统认证信息中通过 envs
字段额外指定控制台地址。
apiVersion: v1
metadata:
name: juicefs-secret
namespace: default
labels:
# 增加该标签以启用认证信息校验
juicefs.com/validate-secret: "true"
kind: Secret
type: Opaque
stringData:
name: ${JUICEFS_NAME}
token: ${JUICEFS_TOKEN}
access-key: ${ACCESS_KEY}
secret-key: ${SECRET_KEY}
# 将下方 URL 替换为实际私有部署控制台访问地址
envs: '{"BASE_URL": "http://console.example.com/static"}'
# 如需指定更多认证参数,可以将 juicefs 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 的环境变量,在私有部署中需要额外填写BASE_URL
指向实际控制台地址,如果你不清楚如何填写,可以打开 JuiceFS 私有控制台,点击右上角「设置」按钮,然后直接使用页面中展示的「控制台访问地址」: -
format-options
:云服务juicefs auth
命令所使用的的参数,作用是认证,以及生成挂载的配置文件。该选项仅在 v0.13.3 及以上可用
使用多个文件系统
Secret 是可以自由命名的,你可以自由创建多个 Secret,每一个都采用不同的命名,甚至放在不同的命名空间,来使用多个 JuiceFS 文件系统,或者在不同命名空间下使用同一个文件系统。
---
apiVersion: v1
metadata:
name: vol-secret-1
namespace: default
kind: Secret
...
---
apiVersion: v1
metadata:
name: vol-secret-2
namespace: kube-system
kind: Secret
...
创建好这些认证信息以后,取决于你是静态还是动态配置,还需要在 PV 或者 StorageClass 中正确引用这些认证信息,才能正确挂载。以上方创建好的认证信息为例,静态和动态配置示范如下。
静态配置(如果你尚不清楚什么是静态配置,先阅读「静态配置」):
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: vol-1
spec:
...
csi:
driver: csi.juicefs.com
# 该字段必须全局唯一,建议直接设置为 PV 名称
volumeHandle: vol-1
fsType: juicefs
nodePublishSecretRef:
name: vol-secret-1
namespace: default
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: vol-2
spec:
...
csi:
driver: csi.juicefs.com
volumeHandle: vol-2
fsType: juicefs
nodePublishSecretRef:
name: vol-secret-2
namespace: kube-system
动态配置(如果你尚不清楚什么是动 态配置,先阅读「动态配置」):
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: vol-1
provisioner: csi.juicefs.com
parameters:
csi.storage.k8s.io/provisioner-secret-name: vol-1
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-publish-secret-name: vol-1
csi.storage.k8s.io/node-publish-secret-namespace: default
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: vol-2
provisioner: csi.juicefs.com
parameters:
csi.storage.k8s.io/provisioner-secret-name: vol-2
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/node-publish-secret-name: vol-2
csi.storage.k8s.io/node-publish-secret-namespace: kube-system
为 Mount Pod 额外添加文件、环境变量
部分对象存储服务(比如 Google 云存储)在访问时需要提供额外的认证文件,这就需要你用创建单独的 Secret 保存这些文件,然后在认证信息(下方示范中的 juicefs-secret
)中引用。这样一来,CSI 驱动便会将这些文件挂载进 Mount Pod,然后在 Mount Pod 中添加对应的环境变量,令 JuiceFS 挂载时使用该文件进行对象存储的认证。
除此外,如果希望单独为 Mount Pod 添加环境变量,也可以在认证信息的 envs
中声明。比方说使用 MinIO 时,可能需要为客户端设定 MINIO_REGION
环境变量。
下方以 Google 云存储为例,演示如何为 Mount Pod 额外添加文件、环境变量。
获取 Google 云存储所需要的服务帐号密钥文件,需要先了解如何进行身份验证和授权。假设你已经获取到了密钥文件 application_default_credentials.json
,用下方命令将该配置文件创建成 Kubernetes Secret:
kubectl create secret generic gc-secret \
--from-file=application_default_credentials.json=application_default_credentials.json
运行上方命令,密钥文件就被保存在 gc-secret
中了,接下来需要在 juicefs-secret
中加以引用,让 CSI 驱动将该文件挂载到 Mount Pod 中,并添加相应的环境变量:
apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
type: Opaque
stringData:
...
# 在 configs 中填写 Secret 名称和挂载目录,将该 Secret 整体挂载进指定的目录
configs: "{gc-secret: /root/.config/gcloud}"
# 定义挂载认证所需的环境变量
envs: "{GOOGLE_APPLICATION_CREDENTIALS: /root/.config/gcloud/application_default_credentials.json}"
添加完毕以后,新创建的 PV 便会使用此配置了,你可以进入 Mount Pod 里,确认配置文件挂载正确,然后用 env
命令确认环境变量也设置成功。