资源优化
Kubernetes 的一大好处就是促进资源充分利用,在 JuiceFS CSI 驱动中,也有不少方面可以做资源占用优化,甚至带来一定的性能提升。在这里集中罗列介绍。
配置资源请求和约束
每一个使用着 JuiceFS PV 的容器,都对应着一个 Mount Pod(会智能匹配和复用),因此为 Mount Pod 配置合理的资源声明,将是最有效的优化资源占用的手段。关于配置资源请求(request)和约束(limit),可以详读 Kubernetes 官方文档,此处不赘述。
JuiceFS Mount Pod 的 requests 默认为 1 CPU 和 1GiB Memory,limits 默认为 2 CPU 和 5GiB Memory。考虑到 JuiceFS 的使用场景多种多样,1C1G 的资源请求可能不一定适合你的集群,比方说:
- 实际场景下用量极低,比如 Mount Pod 只使用了 0.1 CPU、100MiB Memory,那么你应该尊重实际监控数据,将资源请求调整为 0.1 CPU,100MiB Memory,避免过大的
requests造成资源闲置,甚至导致容器拒绝启动,或者抢占其他应用容器(Preemption)。对于limits,你也可以根据实际监控数据,调整为一个大于requests的数值,允许突发瞬时的资源占用上升; - 实际场景下用量更高,比方说 2 CPU、2GiB 内存,此时虽然 1C1G 的默认
requests允许容器调度到节点上,但实际资源占用高于requests,这便是「资源超售」(Overcommitment),严重的超售会影响集群稳定性,让节点出现各种资源挤占的问题,比如 CPU Throttle、OOM。因此这种情况下,你也应该根据实际用量,调整requests和limits; - 如果实际场景中需要很高的性能,但是
limits设置得太小,会对性能产生很大的负面影响。
如果你安装了 Kubernetes Metrics Server,可以方便地用类似下方命令查看 CSI 驱动组件的实际资源占用:
# 查看 Mount Pod 实际资源占用
kubectl top pod -n kube-system -l app.kubernetes.io/name=juicefs-mount
# 查看 CSI Controller,CSI Node 实际资源占用,依同样的原理调整其资源声明
kubectl top pod -n kube-system -l app.kubernetes.io/name=juicefs-csi-driver
在 ConfigMap 中配置资源声明
从 v0.24 开始,CSI 驱动支持在 ConfigMap 中定制 Mount Pod 和 sidecar 容器,修改资源定义非常简便:
values-mycluster.yaml
globalConfig:
mountPodPatch:
- resources:
requests:
cpu: 100m
memory: 512Mi
修改完毕以后,滚动升级应用或者删除重建 Mount Pod,便会按照新的资源定义重建。
在 PVC 配置资源声明
提示
从 v0.24 开始,CSI 驱动支持在 ConfigMap 中定制 Mount Pod 和 sidecar 容器,本小节所介绍的方式已经不再推荐使用。
自 0.23.4 开始,在 PVC 的 annotations 中可以自由配置资源声明,由于 annotations 可以随时更改,因此这种方式也能灵活地调整资源定义。但也要注意:
- 修改以后,已有的 Mount Pod 并不会自动按照新的配置重建。需要删除 Mount Pod,才能以新的资源配置触发创建新的 Mount Pod。
- 必须配置好挂载点自动恢复,重建后 Mount Pod 的挂载点才能传播回应用 Pod。
- 就算配置好了挂载点自动恢复,重启过程也会造成服务闪断,注意在应用空间做好错误处理。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
annotations:
juicefs/mount-cpu-request: 100m
juicefs/mount-cpu-limit: "1" # 数字必须以引号封闭,作为字符串传入
juicefs/mount-memory-request: 500Mi
juicefs/mount-memory-limit: 1Gi
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi