本文永久链接: https://www.xtplayer.cn/prometheus/rancher-prometheus-error-opening-query-log-file-permission-denied/

在 rancher dashboard 启用集群监控时,可能会遇到 prometheus 无法正常运行,报如下的错误。

level=info ts=2020-10-31T12:40:33.171Z caller=main.go:353 msg="Starting Prometheus" version="(version=2.22.0, branch=HEAD, revision=0a7fdd3b76960808c3a91d92267c3d815c1bc354)"
level=info ts=2020-10-31T12:40:33.171Z caller=main.go:358 build_context="(go=go1.15.3, user=root@6321101b2c50, date=20201015-12:29:59)"
level=info ts=2020-10-31T12:40:33.171Z caller=main.go:359 host_details="(Linux 4.14.35-1902.3.2.el7uek.x86_64 #2 SMP Tue Jul 30 03:59:02 GMT 2019 x86_64 prometheus-prometheus-0 (none))"
level=info ts=2020-10-31T12:40:33.171Z caller=main.go:360 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2020-10-31T12:40:33.171Z caller=main.go:361 vm_limits="(soft=unlimited, hard=unlimited)"
level=error ts=2020-10-31T12:40:33.173Z caller=query_logger.go:87 component=activeQueryTracker msg="Error opening query log file" file=/prometheus/queries.active err="open /prometheus/queries.active: permission denied"
panic: Unable to create mmap-ed active query log
goroutine 1 [running]:
github.com/prometheus/prometheus/promql.NewActiveQueryTracker(0x7fff711299c3, 0xb, 0x14, 0x30867c0, 0xc000e6f050, 0x30867c0)
/app/promql/query_logger.go:117 +0x4cf
main.main()
/app/cmd/prometheus/main.go:388 +0x536c

这个是因为 prometheus 挂载 pvc 卷之后,pvc 卷的读写权限与 prometheus pod 运行用户不一致,导致 prometheus pod 中没有权限去读写 pvc 存储。

处理方法

  1. 在集群工具中,编辑 Monitoring App。点击下一步,接着点击 编辑 YAML。在 prometheus.prometheusSpec.securityContext 中,按如下配置,注意修改之前对原始值做好备份。保存后看是否正常读写。

    fsGroup: 0
    runAsGroup: 0
    runAsNonRoot: false
    runAsUser: 0
  2. 如果以上配置还是没有权限读写 pvc 存储,那么可以利用 initContainers 去初始化 pvc 卷的权限。在 prometheus.prometheusSpec.initContainers 中,按如下配置:

    initContainers:
    - command: ["/bin/chmod","-R","777","/prometheus"]
    image: busybox
    name: prometheus-data-permission-fix
    securityContext:
    runAsGroup: 0
    runAsNonRoot: false
    runAsUser: 0
    volumeMounts:
    - mountPath: /prometheus
    name: prometheus-rancher-monitoring-prometheus-db
    subPath: ''

    注意:

    1. 如果在 prometheus.prometheusSpec.storageSpec 中没有添加 disableMountSubPath: true,那么以上配置的 subPath 需要设置为 subPath: prometheus-db。如果有添加 disableMountSubPath: true,则将 subPath 设置为空。
    2. 如果你认为 command: [“/bin/chmod”,”-R”,”777”,”/prometheus”] 中 777 权限太大,那么根据 prometheus.prometheusSpec.securityContext 中的原生值进行配置,这个原始值是 prometheus 运行的用户和用户组,那么 pvc 存储这边也需要设置为相应的权限。