生产环境部署建议
本章介绍在生产环境中使用 CSI 驱动的一系列最佳实践,以及注意事项。
Mount Pod 设置
- 启用「挂载点自动恢复」;
- 为了支持平滑升级 Mount Pod,请提前配置好 CSI 控制台或 JuiceFS kubectl 插件;
- 对于动态 PV 场景,建议配置更加易读的 PV 目录名称;
- 不建议使用
--writeback
,容器 场景下,如果配置不当,极易引发丢数据等事故,详见「客户端写缓存(社区版)」或「客户端写缓存(云服务)」; - 如果资源吃紧,参照「资源优化」以调优;
- 考虑为 Mount Pod 设置非抢占式 PriorityClass,避免资源不足时,Mount Pod 将业务容器驱逐。详见文档;
- 缩容节点的最佳实践。详见文档。
Sidecar 模式推荐设置
退出顺序
目前 CSI 驱动支持 Kubernetes 原生的 sidecar 模式,如果你的集群 Kubernetes 版本在 v1.29 及以上,CSI 在 v0.27.0 及以上,无需任何改动即可做到应用容器退出以后,sidecar 才退出。
如果你的集群不满足上述版本要求,我们建议用户通过设置 preStop
来满足延迟退出的需求:
mountPodPatch:
- terminationGracePeriodSeconds: 3600
lifecycle:
preStop:
exec:
command:
- sh
- -c
- |
sleep 30;
上方是最为简单的示范,sidecar(也就是 mount 容器)会等待 30 秒后才退出。如果你的应用监听了网络端口,也可以通过检测其监听端口来建立依赖关系,保证 sidecar 容器晚于业务容器退出。
mountPodPatch:
- terminationGracePeriodSeconds: 3600
lifecycle:
preStop:
exec:
command:
- sh
- -c
- |
set +e
# 根据实际情况修改
url=http://127.0.0.1:8000
while :
do
res=$(curl -s -w '%{exitcode}' $url)
# 仅当服务端口返回 Connection refused,才视为服务退出
if [[ "$res" == 7 ]]
then
exit 0
else
echo "$url is still open, wait..."
sleep 1
fi
done
监控 Mount Pod(社区版)
提示
本节介绍的监控相关实践仅适用于 JuiceFS 社区版,企业版客户端并不通过本地端口来暴露监控数据,而是提供中心化的抓取 API,详见企业版文档。
默认设置下(未使用 hostNetwork
),Mount Pod 通过 9567 端口提供监控 API(也可以通过在 mountOptions
中添加 metrics
选项来自定义端口号),端口名为 metrics
,因此可以按如下方式配置 Prometheus 的监控配置。
Prometheus 收集监控指标
在 prometheus.yml
添加相应的抓取配置,来收集监控指标:
scrape_configs:
- job_name: 'juicefs'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_phase]
separator: ;
regex: (Failed|Succeeded)
replacement: $1
action: drop
- source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name, __meta_kubernetes_pod_labelpresent_app_kubernetes_io_name]
separator: ;
regex: (juicefs-mount);true
replacement: $1
action: keep
- source_labels: [__meta_kubernetes_pod_container_port_name]
separator: ;
regex: metrics # Mount Pod 监控 API 端口名
replacement: $1
action: keep
- separator: ;
regex: (.*)
target_label: endpoint
replacement: metrics
action: replace
- source_labels: [__address__]
separator: ;
regex: (.*)
modulus: 1
target_label: __tmp_hash
replacement: $1
action: hashmod
- source_labels: [__tmp_hash]
separator: ;
regex: "0"
replacement: $1
action: keep