定制容器镜像
本章介绍如何设置 Mount Pod 镜像,以及自行构建 CSI 驱动组件镜像。
覆盖 Mount Pod 镜像
JuiceFS CSI 驱动 0.17.1 及以上版本支持自定义 Mount Pod 镜像。你可以在 Docker Hub 找到 CSI 驱动所使用的 Mount Pod 容器镜像,形如:
# 镜像标签中包含社区版和云服务版客户端的版本号
juicedata/mount:v1.0.3-4.8.3
CSI 驱动有着灵活的设计,有多种修改 Mount Pod 镜像的方式,满足不同的定制需要,请根据实际情况选择合适的手段。
覆盖 Mount Pod 镜像后,注意:
- JuiceFS 客户端将不会随着升级 CSI 驱动而升级。
- 需要重新创建 PVC,方可令新配置生效。
修改 CSI Node,全局覆盖 Mount Pod 镜像
修改 CSI Node 配置以后,所有新启动的 Mount Pod 就一律使用指定的镜像了,如果你希望全局覆盖,则选用此法。
修改 CSI Node Service,为 juicefs-plugin
容器中设置 JUICEFS_MOUNT_IMAGE
环境变量:
kubectl -n kube-system set env daemonset/juicefs-csi-node -c juicefs-plugin JUICEFS_MOUNT_IMAGE=juicedata/mount:v1.0.3-4.8.3
在全局覆盖的情况下,如果还希望为部分应用单独指定 Mount Pod 镜像,还可以参考下方小节的做法,额外地在 StorageClass 中进行覆盖,优先级更高。
修改 StorageClass,指定 Mount Pod 镜像
如果你需要为不同应用配置不同的 Mount Pod 镜像,那就需要创建多个 StorageClass,为每个 StorageClass 单独指定所使用的 Mount Pod 镜像。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: juicefs-sc
provisioner: csi.juicefs.com
parameters:
csi.storage.k8s.io/provisioner-secret-name: juicefs-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-publish-secret-name: juicefs-secret
csi.storage.k8s.io/node-publish-secret-namespace: default
juicefs/mount-image: juicedata/mount:v1.0.3-4.8.3
配置完成后,在不同的 PVC 中,通过 storageClassName
指定不同的 StorageClass,便能为不同的应用设置不同的 Mount Pod 镜像了。
静态配置
对于「静态配置」用法,需要在 PV 定义中配置 Mount Pod 镜像:
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
volumeAttributes:
juicefs/mount-image: juicedata/mount:v1.0.3-4.8.3
构建镜像
构建 Mount Pod 的容器镜像
JuiceFS CSI 驱动采用「分离架构」,Mount Pod 默认使用的容器镜像是 juicedata/mount
,对应的 Dockerfile 是 docker/dev.juicefs.Dockerfile
。
因此,如果要自行构建挂载镜像,可以参考下方命令克隆 JuiceFS 社区版仓库,然后直接用内置的 Dockerfile 执行构建:
# 克隆 JuiceFS 社区版仓库
git clone https://github.com/juicedata/juicefs
cd juicefs
# 切换到你想要编译的分支,或者按需要修改代码
git checkout ...
# 由于 Dockerfile 在 CSI 驱动的仓库,此处需要自行下载
curl -O https://raw.githubusercontent.com/juicedata/juicefs-csi-driver/master/docker/dev.juicefs.Dockerfile
# 构建镜像,并上传至私有镜像仓库
docker build -t registry.example.com/juicefs-csi-mount:latest -f dev.juicefs.Dockerfile .
docker push registry.example.com/juicefs-csi-mount:latest
参照覆盖默认容器镜像来指定刚刚构建好的 Mount Pod 的镜像。
构建 CSI 驱动组件镜像
JuiceFS CSI Controller 及 JuiceFS CSI Node 默认使用的容器镜像是 juicedata/juicefs-csi-driver
,对应的 Dockerfile 是 docker/Dockerfile
。
若希望深入开发 JuiceFS CSI 驱动,可以参考下方命令克隆仓库,然后执行内置的构建脚本:
# 克隆 CSI 驱动仓库
git clone https://github.com/juicedata/juicefs-csi-driver
cd juicefs-csi-driver
# 切换到你想要编译的分支,或者按需要修改代码
git checkout ...
# 用 IMAGE 环境变量指定将要构建的 CSI 驱动镜像名称,并上传至私有镜像仓库
IMAGE=registry.example.com/juicefs-csi-driver make image-dev
docker push registry.example.com/juicefs-csi-driver:dev-xxx