Kibana —— Elasticsearch 生态的检索、可视化与告警门户

运维监控软件手册 02-可视化与告警呈现 22.5 KB 原文

Kibana —— Elasticsearch 生态的检索、可视化与告警门户

分类:02 可视化与告警呈现 适用:Linux / 容器 / K8s;已部署 Elasticsearch(日志、指标、APM、安全数据)的日志分析与运维观测场景 一句话:面向 ES 索引做全文检索(Discover)、拖拽建模(Lens)、大盘(Dashboard)与规则告警(Alerting) 官方:https://www.elastic.co/kibana GitHub:https://github.com/elastic/kibana 授权:Elastic License 2.0(默认发行版含全套免费功能;部分高级能力需订阅)

1. 它解决什么问题

  • 日志不可检索:原始日志散落在文件/ES 索引里,需要按字段、时间、关键字快速定位;Discover + KQL 提供交互式检索。
  • 分析门槛高:写 ES Query DSL 成本高;Lens 用拖拽选字段与聚合函数即时出图。
  • 视图不可复用:临时查询无法沉淀;Saved Objects(大盘、可视化、Data View、规则)统一保存与导入导出。
  • 多团队抢一套视图:Spaces 做空间隔离,各团队独立的大盘、Data View、告警与权限。
  • 异常靠人盯:Alerting(Rules + Connectors)周期性跑查询并触发邮件/IM/Webhook 动作。
  • 边界:Kibana 不存储业务数据,是 ES 的前端;数据量、查询延迟、保留期取决于 ES 集群与 ILM。

2. 核心概念与架构

术语 说明
Elasticsearch index 实际存储文档的倒排索引,如 logs-nginx-2026.11.05;常配别名 logs-nginx
Index Pattern(旧) 早期用于指定「哪些索引 + 时间字段」;8.x 起被 Data View 取代,旧 API 仍兼容
Data View 指向一个或多个索引/别名(title: logs-*)+ 时间字段 + 字段列表与格式,是查询的入口
Discover 交互式检索页:时间范围 + KQL/Lucene + 字段列 + 直方图
KQL / Lucene 两套查询语法;KQL 为默认,语法更简洁,可切换 Lucene
Lens 拖拽式可视化编辑器,选维度/指标/聚合自动出图
Visualization / Dashboard 可视化对象与大盘,均为 Saved Object,可导出为 ndjson
Saved Object Kibana 自身元数据(大盘、Data View、规则、连接器),存于 .kibana* 系统索引
Space 逻辑空间,隔离 Saved Objects 与权限;URL 前缀 /s/<space-id>/
Rule(Alerting) 规则:查询条件 + 调度间隔 + 动作;8.x+ 统称 Rules,旧称 Alerts and Actions
Connector(Action) 动作执行器:Email / Slack / Webhook / Index / Server log 等
Fleet / Elastic Agent 数据采集与集成管理入口,与 Kibana 同 UI(可选)
 采集端                  Elasticsearch              Kibana                        用户/接收端
 ┌──────────────┐      ┌───────────────────┐      ┌──────────────────────────────────┐
 │ Elastic Agent│ 写入 │ 索引 logs-* /      │ 查询 │ Data View(title=logs-*,@timestamp)│
 │ Beats / Log- │─────►│ metrics-* /       │◄─────│   │                               │
 │ stash / API  │      │ traces-*  (+ILM)  │      │   ├─► Discover(KQL/Lucene 检索)  │
 └──────────────┘      │ .kibana* 系统索引 │      │   ├─► Lens ─► Visualization      │
                       └───────────────────┘      │   ├─► Dashboard(多 Panel)      │
                               ▲ 保存查询/对象     │   └─► Rule ─► Connector ─► 通知 │
                               └───────────────────┴──────────────────────────────────┘

核心链路:ES 索引(数据写入 + ILM 滚动)→ Data View(用索引模式 logs-* 匹配一批索引、指定时间字段)→ Discover(KQL 过滤 + 时间范围)→ Lens/Visualization(聚合出图)→ Dashboard(组合)→ Saved Objects(存入 .kibana*)。告警侧由 Rule 定时对同一 Data View/索引执行查询,命中后调用 Connector 投递。Kibana 本身无状态,所有状态都在 ES。

Index Pattern → Data View 演进:8.x 起 UI 改称 Data Views,API 从 /api/saved_objects/index-pattern/<id> 迁移到 /api/data_views/data_view/<id>;旧 Index Pattern 仍可读取但新配置一律建 Data View。Kibana 与 ES 必须同主版本,否则启动直接报版本不兼容(以官方支持矩阵为准)。

3. 安装与部署

3.1 环境准备

项 要求
前置 已运行且健康的 Elasticsearch 集群(同主版本),Kibana 无独立数据库
OS Linux(deb/rpm 包)、Windows、macOS;容器 x86_64 / ARM64
资源 测试 1C2G;生产 2C4G+,主要消耗在 SSR 与并发查询的 Node.js 进程
端口 默认 5601
安全 8.x+ ES 默认启用安全,需 enrollment token 或 kibana_system 凭据
时钟 与 ES、采集端 NTP 同步,否则 @timestamp 偏差导致 Discover 无数据

3.2 多种安装方式

# A. APT 仓库(Debian/Ubuntu)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor | sudo tee /usr/share/keyrings/elastic-keyring.gpg > /dev/null
sudo apt-get install -y apt-transport-https
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/9.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-9.x.list
sudo apt-get update && sudo apt-get install -y kibana
sudo systemctl enable --now kibana.service
# B. YUM/DNF:/etc/yum.repos.d/elastic.repo 中 baseurl=https://artifacts.elastic.co/packages/9.x/yum,
#    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch,gpgcheck=1;再 dnf install -y kibana
# C. Docker / compose(先起 ES,再起 Kibana,同一网络)
docker network create elastic
docker run -d --name es01 --net elastic -p 9200:9200 \
  -e discovery.type=single-node -e xpack.security.enabled=true -e ELASTIC_PASSWORD='<强密码>' \
  docker.elastic.co/elasticsearch/elasticsearch:<版本>
docker run -d --name kib01 --net elastic -p 5601:5601 \
  -e ELASTICSEARCH_HOSTS='["http://es01:9200"]' -e ELASTICSEARCH_USERNAME=kibana_system \
  -e ELASTICSEARCH_PASSWORD='<kibana_system密码>' docker.elastic.co/kibana/kibana:<版本>
# D. tar.gz + systemd
wget https://artifacts.elastic.co/downloads/kibana/kibana-<版本>-linux-x86_64.tar.gz
tar -xzf kibana-<版本>-linux-x86_64.tar.gz -C /opt/ && sudo ln -s /opt/kibana-<版本> /opt/kibana
# /etc/systemd/system/kibana.service:[Service] ExecStart=/opt/kibana/bin/kibana;
#   Environment=KIBANA_HOME=/opt/kibana;Restart=on-failure;User=kibana
sudo systemctl daemon-reload && sudo systemctl enable --now kibana
# E. K8s:ECK(Elastic Cloud on Kubernetes)
# kubectl apply -f https://download.elastic.co/downloads/eck/<版本>/crds.yaml
# kubectl apply -f https://download.elastic.co/downloads/eck/<版本>/operator.yaml
# 再提交 Elasticsearch 与 Kibana CR:
# apiVersion: kibana.k8s.elastic.co/v1  kind: Kibana
# spec: { version: <版本>, count: 2, elasticsearchRef: { name: es }, config: { server.publicBaseUrl: "https://kibana.<域名>" } }
kubectl get kibana,pod -n <命名空间>

精确版本号、镜像 tag、ECK 资源 URL 以官方最新稳定版为准(当前大版本线 9.x,见官方下载页)。

3.3 首次启动与验证

curl -s http://localhost:5601/api/status | jq '.status.overall.state'   # green
sudo systemctl status kibana.service
sudo journalctl -u kibana.service -n 50 --no-pager                       # 无 ERROR
# 浏览器 http://<主机>:5601;8.x+ 首次需 enrollment token 连接 ES
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
# 用 elastic 用户登录;Kibana → Stack Management → Data Views 建 logs-* 后 Discover 见数据

4. 配置文件详解

主配置:/etc/kibana/kibana.yml(包安装)、/opt/kibana/config/kibana.yml(tar.gz);容器中用 ELASTICSEARCH_HOSTS 等环境变量覆盖。敏感值用 bin/kibana-keystore 保存,勿写明文。

配置项 默认 说明
server.port / server.host 5601 / localhost 对外服务需 server.host: "0.0.0.0"(或反代)
server.publicBaseUrl 空 反代后必设完整 URL,否则告警链接、Reporting、Spaces 跳转 404
server.ssl.enabled / certificate / key false 直连 HTTPS
elasticsearch.hosts ["http://localhost:9200"] ES 地址列表,建议写多个节点
elasticsearch.username / password — kibana_system 内置用户;或用 service account token
elasticsearch.serviceAccountToken — 8.x+ 推荐,替代明文密码
elasticsearch.ssl.certificateAuthorities — ES 开启 TLS 时必配 CA
elasticsearch.requestTimeout 30000 查询超时(毫秒),大查询可调大
xpack.security.authc.providers 依版本 SAML / OIDC / basic 等登录方式
xpack.encryptedSavedObjects.encryptionKey 无 Alerting/Connector 必需,32 字节随机串
xpack.reporting.encryptionKey / xpack.security.encryptionKey 无 报告与会话加密,建议一并生成
xpack.actions.allowedHosts 依版本 Webhook Connector 目标域名白名单
i18n.locale en 设 zh-CN 切中文界面
csp.strict false 建议 true,收紧 CSP
monitoring.ui.container.elasticsearch.enabled false 容器化监控展示

最小可运行示例 /etc/kibana/kibana.yml:

server.port: 5601
server.host: "0.0.0.0"
server.publicBaseUrl: "https://kibana.example.com"
server.ssl.enabled: false
elasticsearch.hosts: ["https://es01:9200", "https://es02:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "<kibana_system密码>"
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/http_ca.crt"]
elasticsearch.ssl.verificationMode: certificate
elasticsearch.requestTimeout: 90000
xpack.encryptedSavedObjects.encryptionKey: "<32字节随机串>"
xpack.reporting.encryptionKey: "<32字节随机串>"
xpack.security.encryptionKey: "<32字节随机串>"
xpack.actions.allowedHosts: ["*"]        # 生产改为具体域名白名单
i18n.locale: "zh-CN"
# 三项加密密钥用官方工具一次生成,勿手工编造
/opt/kibana/bin/kibana-encryption-keys generate
# 敏感项入 keystore,避免明文落在 yml
/opt/kibana/bin/kibana-keystore create
/opt/kibana/bin/kibana-keystore add elasticsearch.password
/opt/kibana/bin/kibana-keystore list
# 插件管理(离线环境用 zip/URL 安装,安装后需重启)
/opt/kibana/bin/kibana-plugin list
/opt/kibana/bin/kibana-plugin install <插件名或URL>
/opt/kibana/bin/kibana-plugin remove <插件名>

5. 核心使用方法

KQL 语法(Discover / 规则默认):

写法 含义
status:200 字段等值匹配
status:(400 or 500)、status >= 400 逻辑或 / 范围比较
response:200 and not host.name:web* and / or / not + 通配符
message:"connection refused" 短语匹配(引号)
error:* 字段存在
user.name:"alice" and @timestamp >= now-1h 嵌套字段 + 时间表达式
tags:(a and b)、bytes > 1000 and bytes < 5000 括号分组、组合区间

Lucene 语法(可在查询栏切换):+status:500 -env:test、title:(quick OR brown)、name:web?、host:web*、~ 模糊、/regex/、范围 bytes:[100 TO 1000]、短语 msg:"oom killed"~2、转义 \:。注意 KQL 不支持 +/-/~/正则,两套语法勿混用。

Dev Tools → Console 请求示例:

GET /_cat/health?v                                  // 集群健康
GET /_cat/indices/logs-*?v&s=index                 // 索引列表
GET /_cat/nodes?v                                   // 节点
GET /logs-nginx/_mapping                            // 查看字段类型
GET /logs-nginx/_search                             // 空条件检索
{ "query": { "match": { "message": "timeout" } }, "size": 10 }
GET /logs-*/_search                                 // 按时间范围 + 条件
{ "query": { "bool": { "filter": [ { "range": { "@timestamp": { "gte": "now-15m" } } }, { "term": { "status": 500 } } ] } }, "sort": [ { "@timestamp": "desc" } ] }
GET /logs-*/_search                                 // 聚合:每分钟错误数
{ "size": 0, "query": { "match": { "log.level": "error" } }, "aggs": { "per_min": { "date_histogram": { "field": "@timestamp", "fixed_interval": "1m" } } } }
PUT /logs-demo/_doc/1                               // 写入测试文档
{ "@timestamp": "2026-11-05T08:00:00Z", "status": 500, "message": "demo error" }
POST /logs-demo/_refresh                            // 刷新后 Discover 可见

HTTP API(头 kbn-xsrf: true,认证用 elastic 或具备权限的账号;KIBANA_URL=http://localhost:5601):

U="elastic:<密码>"; HDR="-u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json'"
curl -s -u $U $KIBANA_URL/api/status | jq .                                        # 1 状态
curl -s -u $U "$KIBANA_URL/api/features" | jq .                                   # 2 功能开关
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST $KIBANA_URL/api/data_views/data_view \
  -d '{"data_view":{"title":"logs-*","timeFieldName":"@timestamp","name":"全部日志"}}'   # 3 建 Data View
curl -s -u $U "$KIBANA_URL/api/data_views" | jq .                                  # 4 Data View 列表
curl -s -u $U "$KIBANA_URL/api/data_views/data_view/<id>" | jq .                   # 5 读取
curl -s -u $U -H 'kbn-xsrf: true' -X DELETE "$KIBANA_URL/api/data_views/data_view/<id>"  # 6 删除 ⚠️
curl -s -u $U "$KIBANA_URL/api/saved_objects/_find?type=dashboard&per_page=50" | jq .     # 7 大盘列表
curl -s -u $U "$KIBANA_URL/api/saved_objects/dashboard/<id>" | jq .                # 8 读取大盘
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/saved_objects/dashboard" -d @dashboard.json             # 9 建大盘
curl -s -u $U -H 'kbn-xsrf: true' -X POST "$KIBANA_URL/api/saved_objects/_export" \
  -d '{"objects":[{"type":"dashboard","id":"<id>"}],"includeReferencesDeep":true}' > backup.ndjson  # 10 导出
curl -s -u $U -H 'kbn-xsrf: true' -F file=@backup.ndjson "$KIBANA_URL/api/saved_objects/_import"  # 11 导入
curl -s -u $U "$KIBANA_URL/api/spaces/space" | jq .                                # 12 Space 列表
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/spaces/space" -d '{"id":"ops","name":"运维空间"}'         # 13 建 Space
curl -s -u $U "$KIBANA_URL/api/alerting/rules/_find" | jq .                         # 14 规则列表
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/alerting/rule" -d @rule.json                             # 15 建规则
curl -s -u $U "$KIBANA_URL/api/actions/connectors" | jq .                           # 16 Connector 列表
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/actions/connector" -d @connector.json                    # 17 建 Connector
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/actions/connector/<id>/_execute" -d '{"params":{"message":"test"}}'  # 18 测试动作
curl -s -u $U "$KIBANA_URL/api/task_manager/_health" | jq .                         # 19 任务调度健康
curl -s -u $U "$KIBANA_URL/api/saved_objects/_find?type=index-pattern" | jq .       # 20 旧 Index Pattern 排查
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/console/proxy?path=_cat/indices%3Fv&method=GET"          # 21 经 Console 代理查 ES
curl -s -u $U "$KIBANA_URL/api/saved_objects/_find?type=visualization" | jq .        # 22 可视化对象
# Space 内操作:URL 前缀 /s/<space-id>/api/...,如 /s/ops/api/saved_objects/_find

Web UI 路径:Discover(选 Data View、写 KQL、加字段列);Visualize Library → Create visualization → Lens;Dashboard → Create dashboard;Stack Management → Data Views / Saved Objects / Spaces / Rules and Connectors / Index Lifecycle Policies;Dev Tools → Console;Fleet 管采集。Big picture:先建 Data View,再 Discover 验证有数据,再 Lens 出图并 Save,最后 Add to dashboard。

6. 告警与通知

规则(Rule)构成:规则类型(Elasticsearch query / Threshold / Log threshold / Metric threshold 等)+ Data View 或索引 + KQL/Lucene 条件 + 阈值与时间窗口 + 检查间隔 + Actions(绑定 Connector)。UI:Stack Management → Rules → Create rule。创建 Connector 前必须配好 xpack.encryptedSavedObjects.encryptionKey(第 4 章)。

方式 Connector 类型 配置要点
邮件 .email SMTP host/port/secure/from/收件人;凭据建议入 keystore
企业微信 .webhook + 群机器人 URL 自定义 body 输出企微 markdown/text JSON
钉钉 .webhook + 加签/关键字 payload 含 msgtype 与 text.content
Slack .slack Webhook URL + channel
Webhook .webhook URL + headers + body 模板;目标域名需 xpack.actions.allowedHosts 放行
# Webhook Connector body(mustache 模板变量语法以官方 Connector 文档为准)
# 企微:{"msgtype":"markdown","markdown":{"content":"**告警**\n> {{context.message}}"}}
# 钉钉:{"msgtype":"text","text":{"content":"[{{rule.name}}] {{context.message}}"}}
# 自定义 Webhook 可把同一 payload POST 到任意 IM 网关;Index/Server log 类型用于留痕与自监控

静默 / 升级 / 去重:规则级 Snooze(按时间段静默,不停止求值);Maintenance Windows(如当前版本提供,以官方文档为准)批量抑制维护期通知;Action frequency / notifyWhen(仅在状态变化时发、或按固定频率重复)控制去重与重复提醒;同一规则配多个 Action 并按 action group 分派不同 Connector 实现升级(如警告发群、严重发电话值班);规则 throttle 设最小通知间隔避免刷屏。

7. 实战场景

场景一:Nginx 5xx 突增告警到企业微信

# 目标:logs-nginx-* 中最近 5 分钟 status>=500 超过 20 条即告警
# 步骤1:建 Data View(第 5 章命令 3,title=logs-nginx-*,timeFieldName=@timestamp)
# 步骤2:Dev Tools 验证条件
# GET /logs-nginx-*/_count {"query":{"bool":{"filter":[{"range":{"@timestamp":{"gte":"now-5m"}}},{"range":{"status":{"gte":500}}}]}}}
# 步骤3:建 Webhook Connector(命令 17,connector.json 指向企微机器人)→ Create rule(命令 15)
#   rule.json 关键:rule_type_id: "es_query"、params.searchType: "searchSource"、
#   params.query: "status >= 500"、params.timeWindowSize: 5、params.timeWindowUnit: "m"、
#   params.threshold: [20]、params.thresholdComparator: ">"、schedule.interval: "1m"、actions 绑定 connector
# 验证:POST /api/actions/connector/<id>/_execute 收到测试消息;Rules 页看 Last run / Active alerts
# 回滚:DELETE /api/alerting/rule/<id>;再删 connector,保留 Data View

场景二:多团队用 Spaces 隔离大盘与 Data View

# 目标:运维/安全两套互不可见的大盘
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/spaces/space" -d '{"id":"ops","name":"运维空间"}'
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/spaces/space" -d '{"id":"sec","name":"安全空间"}'
# 在 /s/ops/app/dashboards 建盘;导出用 /s/ops/api/saved_objects/_export
# 验证:切 Space 后 /s/ops/api/saved_objects/_find?type=dashboard 只返回本空间对象
# 回滚:DELETE /api/spaces/space/sec(⚠️ 先导出其中 Saved Objects,删除会一并清理空间内对象)

场景三:Kibana 迁移与 Saved Objects 灾备恢复

# 目标:新集群恢复大盘、Data View、规则
curl -s -u $U -H 'kbn-xsrf: true' -H 'Content-Type: application/json' \
  -X POST "$KIBANA_URL/api/saved_objects/_export" \
  -d '{"objects":[],"includeReferencesDeep":true,"excludeExportDetails":false}' > full_backup.ndjson  # 全量
# ES 侧快照兜底 .kibana* 系统索引(SLM 或手动 snapshot),以官方快照文档为准
# 新集群:同版本 Kibana + 同版本 ES → 导入
curl -s -u $U -H 'kbn-xsrf: true' -F file=@full_backup.ndjson \
  "$KIBANA_URL/api/saved_objects/_import?overwrite=true"
# 验证:/_find 数量对齐、随机开 3 张大盘有数据、Rules 页 Last run 正常
# 回滚:停新集群,DNS 切回旧 Kibana;⚠️ 导入前先备份目标空间,overwrite 会覆盖同名对象

8. 日常运维与故障排查

sudo systemctl {start|stop|restart|status} kibana.service      # 服务管理
sudo journalctl -u kibana.service -f                            # 包安装日志
tail -f /var/log/kibana/kibana.log                              # 配置日志目录时
docker logs -f kib01                                            # 容器日志
curl -s -u $U localhost:5601/api/status | jq '.status.overall.state'   # 健康检查
curl -s -u $U "localhost:9200/_cat/indices/.kibana*?v"          # 系统索引
curl -s -u $U localhost:5601/api/task_manager/_health | jq .     # 告警调度健康
现象 原因 处置
启动报 version incompatible Kibana 与 ES 主版本不一致 升级/降级到同主版本,查官方支持矩阵
启动报 Unable to retrieve version information ES 地址、凭据或 CA 证书错 核对 elasticsearch.hosts、kibana_system 密码、certificateAuthorities
Discover 无数据 Data View 索引模式不匹配、时间字段选错、时间范围过窄 GET /_cat/indices 确认索引名;重建 Data View 选 @timestamp;调宽时间
页面 404 / 跳转异常 反代后未设 server.publicBaseUrl 设完整外链 URL 并重启,反代透传 Host
规则不执行 / 创建失败 缺 encryptionKey、task_manager 过载 生成三项密钥;看 /api/task_manager/_health
Webhook 动作报错 目标域名未在 xpack.actions.allowedHosts 放行 加白名单或用内置类型,重启生效
大盘加载慢 面板过多、聚合范围过大、ES 压力大 缩减时间范围/面板数,查 ES 慢日志与 _tasks
KQL 语法报错 混用了 Lucene 的 +/-/~ 改用 KQL 写法或在查询栏切换 Lucene

9. 性能、容量与高可用

  • 大盘/查询:减少单盘 Panel 数(建议 ≤20),统一时间范围;优先 Lens 聚合下推 ES;避免 *、exists 全字段扫描与 field caps 爆炸的宽索引;用 _source 过滤与 docvalue_fields。
  • Discover:默认只选必要字段列;大时间范围用 auto-fit 直方图粒度;保存常用查询为 Saved Query 复用。
  • ES 侧优化:按天/按量 rollover + ILM(hot→warm→cold→delete)、合理副本与分片数、force merge 只读索引、开 shard request cache;日志保留期直接决定查询成本。
  • 缓存与并发:Kibana 无独立查询缓存层,性能取决于 ES;elasticsearch.requestTimeout、server.maxPayload、Node.js 堆(必要时 NODE_OPTIONS=--max-old-space-size)按并发调。
  • HA:Kibana 无状态,起 2+ 实例前置 LB(会话/认证一致),共享同一 ES 集群与 .kibana* 索引;各项 encryptionKey 在所有节点必须一致,否则告警/报告解密失败。
  • 自监控:Stack Monitoring 或 Elastic Agent 采集 ES/Kibana 指标,关注 Kibana os.load、event loop delay、HTTP 5xx、task_manager overdue 与 ES heap/search latency。

10. 安全加固、备份与升级

  • 认证鉴权:8.x+ ES 默认启用安全;Kibana 用 kibana_system 或 service account token 连接,勿用 elastic 超管做服务连接;按角色(Roles)+ Spaces 做最小权限;关闭匿名访问。
  • SSO:xpack.security.authc.providers 配 SAML / OpenID Connect / Kerberos / PKI;server.publicBaseUrl 与 IdP 回调一致;LDAP 通常在 ES realm 侧配置。
  • TLS:ES 与 Kibana 之间启用 HTTPS + certificateAuthorities;浏览器侧由反代终结 TLS 或 server.ssl.*;csp.strict: true、xpack.security.secureCookies(如适用)。
  • 密钥管理:kibana-encryption-keys generate 生成三项密钥,多节点一致;所有密码入 kibana-keystore;xpack.actions.allowedHosts 收窄为具体域名。
  • 备份与恢复:Saved Objects 用 /api/saved_objects/_export 导 ndjson(含 Space 前缀);ES 侧对 .kibana* 系统索引做 snapshot 兜底;配置备份 kibana.yml + keystore + 证书。⚠️ 导入用 overwrite=true 会覆盖同名对象,先导出目标空间。
  • 升级与回滚:ES 与 Kibana 必须同版本,顺序为「先升 ES 集群(滚动)→ 再升 Kibana」;升级前对 .kibana* 做快照;升级会执行 Saved Objects 迁移,⚠️ 迁移后的索引不能被旧版本 Kibana 打开,回滚靠「恢复快照 + 装回旧版本包」,不能只降 Kibana。

11. 常见坑

现象 原因 解决
启动失败 version mismatch Kibana/ES 版本不一致 严格同主版本,查支持矩阵
无法创建 Connector / Rule 缺 xpack.encryptedSavedObjects.encryptionKey 生成三项密钥并重启,多节点保持一致
Discover 空白 Data View 模式/时间字段/时间范围错 核对索引名与 @timestamp,重建 Data View
告警链接 404 未设 server.publicBaseUrl 配完整外链 URL,反代透传 Host
Webhook 不通 allowedHosts 未放行或机器人安全校验 加白名单;payload 带关键字/补签
KQL 报语法错 混用 Lucene 符号 KQL 用 and/or/not,或切换 Lucene
导入大盘后引用丢失 导出未含 includeReferencesDeep 导出时带引用,或先导入 Data View
多节点告警偶发失效 各节点 encryptionKey 不同 统一密钥,重启全部 Kibana 节点
时间差 8 小时 @timestamp 为 UTC,浏览器按本地渲染 明确按 UTC 存储,界面统一时区展示
⚠️ 直接改 .kibana 系统索引 破坏 Saved Objects 结构 一律走 UI / Saved Objects API
⚠️ 只降 Kibana 不恢复快照 升级后的系统索引旧版打不开 回滚必须恢复 ES 快照 + 旧版本包

12. 速查表

项 值
默认端口 5601
主配置 /etc/kibana/kibana.yml(tar.gz:config/kibana.yml)
默认账号 elastic(密码/ enrollment token 由 ES 生成)
服务账号 kibana_system;推荐 elasticsearch.serviceAccountToken
服务 systemctl {start|stop|restart|status} kibana.service
日志 journalctl -u kibana.service、/var/log/kibana/、容器 docker logs
数据位置 ES 的 .kibana* 系统索引(Kibana 无本地库)
CLI bin/kibana、bin/kibana-keystore、bin/kibana-plugin、bin/kibana-encryption-keys
健康检查 GET /api/status、GET /api/task_manager/_health
Data View POST /api/data_views/data_view、GET /api/data_views
Saved Objects /api/saved_objects/_find、/_export、/_import、/<type>/<id>
Spaces /api/spaces/space;Space 内前缀 /s/<space-id>/api/...
规则 GET /api/alerting/rules/_find、POST /api/alerting/rule
连接器 GET /api/actions/connectors、POST /api/actions/connector/<id>/_execute
Dev Tools GET /_cat/indices?v、GET /_cluster/health、POST /<index>/_search
密钥 bin/kibana-encryption-keys generate
快捷键 Ctrl+/ 快捷键面板;Discover 中 / 聚焦查询栏
中文界面 i18n.locale: "zh-CN"
镜像仓库 https://www.docker.elastic.co/r/kibana

13. 选型建议与同类对比

维度 Kibana Grafana OpenSearch Dashboards Splunk
数据源 主要 Elasticsearch 极广(Prom/Loki/ES/SQL/云) OpenSearch(ES 分支) 自有索引与 SPL
日志检索 原生最强(KQL/Discover) 依赖 Loki/ES 插件 与 Kibana 同源能力 强,SPL 灵活
可视化 Lens 拖拽、面板丰富 Panel/变量/插件丰富 类似 Kibana 强,偏报表
告警 Rules + Connectors(需密钥) Unified Alerting 路由树 Alerting 插件 内置,成熟
授权 Elastic License 2.0 AGPLv3 / 商业 Apache 2.0 商业按量授权
运维成本 中高(依赖 ES 集群) 中 中高(依赖 OpenSearch) 低(托管)/高(自建)

何时选:数据已落在 Elasticsearch(日志/APM/安全/指标),核心诉求是全文检索、字段探索、Lens 快速建模与 Spaces 多租户,或已用 Elastic Agent/Fleet 采集。 何时不选:数据源以 Prometheus 指标为主、需要跨多后端统一大盘(Grafana 更合适);不希望维护 ES 集群、只想看指标曲线;预算敏感且要完全 Apache 2.0 授权(可看 OpenSearch Dashboards);已有 Splunk 许可与 SPL 资产。

14. 参考链接