生产环境部署建议
本章介绍在生产环境中使用 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
上方的示范假定 Prometheus 服务运行在 Kubernetes 集群中,如果运行在集群外,除了确保正确设置安全组,允许 Prometheus 访问 Kubernetes 节点,还需要额外添加 api_server
和 tls_config
:
scrape_configs:
- job_name: 'juicefs'
kubernetes_sd_configs:
# 详见 https://github.com/prometheus/prometheus/issues/4633
- api_server: <Kubernetes API Server>
role: pod
tls_config:
ca_file: <...>
cert_file: <...>
key_file: <...>
insecure_skip_verify: false
relabel_configs:
...
Prometheus Operator 收集监控指标
对于 Prometheus Operator,可以新增一个 PodMonitor
来收集监控指标:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: juicefs-mounts-monitor
labels:
name: juicefs-mounts-monitor
spec:
namespaceSelector:
matchNames:
# 设置成 CSI 驱动所在的 namespace,默认为 kube-system
- <namespace>
selector:
matchLabels:
app.kubernetes.io/name: juicefs-mount
podMetricsEndpoints:
- port: metrics # Mount Pod 监控 API 端口名
path: '/metrics'
scheme: 'http'
interval: '5s'
同时在 Prometheus
资源中设置上述的 PodMonitor
:
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
serviceAccountName: prometheus
podMonitorSelector:
matchLabels:
name: juicefs-mounts-monitor
resources:
requests:
memory: 400Mi
enableAdminAPI: false
在 Grafana 中进行数据可视化
按照上方步骤搭建好容器指标收集后,参考下方文档配置 Grafana 仪表盘:
在 EFK 中收集 Mount Pod 日志
CSI 驱动的问题排查,往往涉及到查看 Mount Pod 日志。如果实时查看 Mount Pod 日志无法满足你的需要,考虑搭建 EFK(Elasticsearch + Fluentd + Kibana),或者其他合适的容器日志收集系统,用来留存和检索 Pod 日志。以 EFK 为例:
- Elasticsearch:负责对日志进行索引,并提供了一个完整的全文搜索引擎,可以方便用户从日志中检索需要的数据。安装方法参考官方文档。
- Fluentd:负责获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群。安装方法参考官方文档。
- Kibana:负责对日志进行可视化分析,包括日志搜索、处理以及绚丽的仪表板展示等。安装方法参考官方文档。
Mount Pod 均包含固定的 app.kubernetes.io/name: juicefs-mount
标签。在 Fluentd 的配置文件中可以配置收集对应标签的日志:
<filter kubernetes.**>
@id filter_log
@type grep
<regexp>
key $.kubernetes.labels.app_kubernetes_io/name
pattern ^juicefs-mount$
</regexp>
</filter>