缓存组 Operator
企业版用户可以使用「缓存组 Operator」来创建和管理分布式缓存集群。相比于其它部署方式,缓存组 Operator 在使用上更为便捷(支持 GUI 和 CLI 两种交互方式),同时还支持异构节点不同配置、平滑加减节点、自动清理缓存等高级功能。
安装缓存组 Operator
安装 Helm,然后加入 JuiceFS 官方仓库。
helm repo add juicefs https://juicedata.github.io/charts/
helm repo update
安装之前,阅读 values.yaml
了解各个配置项,该文件包含了所有的默认配置,如果需要修改配置,请在本地创建另一份 values(以下且称 values-mycuster.yaml
),并把需要修改的部分加入其中。如果需要在多个 Kubernetes 集群部署 Operator,就创建多个 values 文件,来区分不同的集群配置。
# 根据需要修改 values-mycluster.yaml
helm upgrade --install juicefs-cache-group-operator juicefs/juicefs-cache-group-operator -n juicefs-cache-group --create-namespace -f values-mycluster.yaml
可以使用 kubectl wait
等待 Operator 准备就绪:
kubectl wait -n juicefs-cache-group --for=condition=Available=true --timeout=120s deployment/juicefs-cache-group-operator
缓存组 Operator 安装完毕便可以开始创建及管理缓存组,以下章节介绍的操作通过 CSI Dashboard(0.25.3 及以上版本)和 kubectl
均可完成,选择你喜好的使用方式即可。为了简化文档示例,后续仅介绍基于 kubectl
的操作方法。
创建缓存组
参考以下示例将缓存组配置保存为一个 YAML 文件(例如 juicefs-cache-group.yaml
),这个示例会在所有设置了 juicefs.io/cg-worker: "true"
标签的节点中部署分布式缓存(当然你也可以设置任意的标签)。关于更多配置项的说明请参考「缓存组配置项」小节。
apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
namespace: juicefs-cache-group
type: Opaque
stringData:
name: juicefs-xx
token: xx
access-key: xx
secret-key: xx
---
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
secretRef:
name: juicefs-secret
worker:
template:
nodeSelector:
juicefs.io/cg-worker: "true"
image: juicedata/mount:ee-5.1.1-1faf43b
opts:
- cache-size=204800
- free-space-ratio=0.01
- group-weight=100
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1
memory: 1Gi
然后通过 kubectl apply
命令创建缓存组:
kubectl apply -f juicefs-cache-group.yaml
如果 Kubernetes 节点还没有设置 juicefs.io/cg-worker: "true"
标签,需要加上这个标签:
kubectl label node node1 juicefs.io/cg-worker=true
获取缓存组状态
通过以下命令获取缓存组状态,确认缓存组已经处于「Ready」状态:
$ kubectl get cachegroups
NAME CACHE GROUP NAME PHASE READY AGE
cachegroup-sample juicefs-cache-group-cachegroup-sample Ready 1/1 10s
使用缓存组
完成以上步骤以后,便已经在 K8s 中启动了一个 JuiceFS 分布式缓存集群,其缓存组名为 juicefs-cache-group-cachegroup-sample
。为了让应用程序的 JuiceFS 客户端使用该缓存集群,需要让 JuiceFS 客户端加入这个缓存组,并添加 --no-sharing
挂载参数,这样一来,应用程序的 JuiceFS 客户端虽然加入了缓存组,但却不参与缓存数据的构建,避免了客户端频繁创建、销毁所导致的缓存数据不稳定。
以动态配置为例,按照下方示范修改挂载参数即可,有关如何调整挂载配置的介绍详见「挂载参数」。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: juicefs-sc
mountOptions:
- cache-group=juicefs-cache-group-cachegroup-sample
- no-sharing
增删缓存节点
缓存组 Operator 支持平滑增删缓存节点,确保调整过程中不会对缓存命中率造成太大影响。
在「创建缓存组」的示例中,要求 Kubernetes 节点必须有 juicefs.io/cg-worker: "true"
这个标签,因此增删缓存节点所需的操作就是给 Kubernetes 节点增删对应的标签。例如通过 kubectl
命令增加或删除节点:
# 增加节点
kubectl label node node1 juicefs.io/cg-worker=true
kubectl label node node2 juicefs.io/cg-worker=true
# 删除节点
kubectl label node node1 juicefs.io/cg-worker-
当节点发生变更时,缓存组 Operator 会以平滑的形式增删节点,具体逻辑如下:
-
当新增节点时,缓存组 Operator 会自动创建新的 Worker Pod,并添加
group-backup
挂载参数。如果新的 Worker Pod 接收到应用请求,并且发现缓存未命中,这个 Worker Pod 会将请求转发给其它缓存节点,确保缓存可以命中。默认 10 分钟后,group-backup
挂载参数会被移除掉,可以通过spec.backupDuration
来控制默认时间:apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
backupDuration: 10m -
当移除节点时,缓存组 Operator 会先尝试将节点上的缓存数据迁移到其它节点,然后再删除节点。最长等待时间默认为 1 小时,可以通过
spec.waitingDeletedMaxDuration
来控制默认时间:apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
waitingDeletedMaxDuration: 1h
缓存组配置项
缓存组支持的所有配置项可以在这里找到完整示范。
更新策略
更新缓存组的配置时,可以通过 spec.updateStrategy
字段来指定缓存组下面的 worker 节点的更新策略。
目前支持的策略有:
RollingUpdate
(默认):这是默认的更新策略。使用RollingUpdate
更新策略时,在更新缓存组模板后,老的 Worker Pod 将被终止,并且自动创建新的 Worker Pod, 每次更新的数量遵循spec.updateStrategy.rollingUpdate.maxUnavailable
的配置,默认为 1。OnDelete
:使用OnDelete
更新策略时,在更新缓存组模板后,只有当你手动删除旧的 Worker Pod 时,新的 Worker Pod 才会被创建。
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
缓存目录
缓存目录可以通过 spec.worker.template.cacheDirs
字段来设置,支持 的类型有 HostPath
和 PVC
。
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
namespace: default
spec:
worker:
template:
nodeSelector:
juicefs.io/cg-worker: "true"
image: juicedata/mount:ee-5.1.1-1faf43b
cacheDirs:
- type: HostPath
path: /var/jfsCache-0
- type: PVC
name: juicefs-cache-pvc
为不同节点指定不同配置
缓存节点可能存在异构的配置(例如缓存盘的大小不一样),此时可以通过 spec.worker.overwrite
字段来为不同的节点指定不同的配置:
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
worker:
template:
nodeSelector:
juicefs.io/cg-worker: "true"
image: juicedata/mount:ee-5.1.1-1faf43b
hostNetwork: true
cacheDirs:
- path: /var/jfsCache-0
type: HostPath
opts:
- group-weight=100
overwrite:
- nodes:
- k8s-03
# 也可以使用 nodeSelector
# nodeSelector:
# kubernetes.io/hostname: k8s-02
opts:
- group-weight=50
cacheDirs:
- path: /var/jfsCache-1
type: HostPath
- path: /var/jfsCache-2
type: HostPath
挂载参数
挂载参数可以通过 spec.worker.template.opts
字段来设置,参考文档了解所有挂载参数。
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
namespace: default
spec:
worker:
template:
nodeSelector:
juicefs.io/cg-worker: "true"
image: juicedata/mount:ee-5.1.1-1faf43b
opts:
- group-weight=100
缓存组名称
缓存组 Operator 默认生成的缓存组名称格式为 ${NAMESPACE}-${NAME}
,如果你想自定义缓存组名称可以通过 spec.cacheGroup
字段来设置:
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
cacheGroup: jfscachegroup
删除节点时清理缓存
当删除一个节点时,可以通过 spec.cleanCache
字段来指定是否清理缓存:
apiVersion: juicefs.io/v1
kind: CacheGroup
metadata:
name: cachegroup-sample
spec:
cleanCache: true
删除缓存组
使用以下命令删除缓存组,缓存集群下的所有 Worker 节点将被删除:
kubectl delete cachegroup cachegroup-sample