Kibana —— Elasticsearch 生态的检索、可视化与告警门户
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. 参考链接
- Kibana 产品页:https://www.elastic.co/kibana
- 官方下载:https://www.elastic.co/downloads/kibana/
- 官方文档:https://www.elastic.co/guide/en/kibana/current/index.html
- GitHub:https://github.com/elastic/kibana
- Docker 镜像仓库:https://www.docker.elastic.co/r/kibana
- ES Docker 安装(含 Kibana):https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
- Dev Tools Console:https://www.elastic.co/guide/en/kibana/current/console-kibana.html
- KQL 语法:https://www.elastic.co/guide/en/kibana/current/kuery-query.html
- Data Views:https://www.elastic.co/guide/en/kibana/current/data-views.html
- Saved Objects API:https://www.elastic.co/guide/en/kibana/current/saved-objects-api.html
- ECK(K8s Operator):https://www.elastic.co/guide/en/cloud-on-k8s/current/index.html