需求,为什么要部署
使用 Prometheus 抓取数据传给VM 数据库,VM数据库保证数据不丢且好查,用 夜莺 调用VM数据库,保证能看懂且不被告警烦死。这是目前性价比最高、体验最好的开源监控方案。最主要的原因是因为Alertmanager和Grafana对中文太不友好,而且太麻烦。
Kubernetes 监控栈部署指南
架构组成:
- 采集层 : Prometheus Operator (
kube-prometheus-stack) - 存储层: VictoriaMetrics (单节点)
- 展示/告警层: Nightingale (夜莺)
- 依赖组件: MySQL, Redis (夜莺后端依赖)
📋 前置准备
1. 创建命名空间
kubectl create namespace yeyin
2. 准备依赖组件 Helm 包 (可选离线模式)
如果您在离线环境,请先在有网的机器下载 Chart 包并传输到服务器。
# 添加 Bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 下载指定版本 (示例版本,可根据需要调整)
helm pull bitnami/mysql --version 9.5.0 --destination ./charts
helm pull bitnami/redis --version 18.0.0 --destination ./charts
# 传输到服务器后,使用本地文件安装:
# helm install mysql ./charts/mysql-*.tgz -n yeyin ...
# helm install redis ./charts/redis-*.tgz -n yeyin ...

🚀 第一步:部署 VictoriaMetrics (存储层)
使用 Docker 快速部署单节点 VictoriaMetrics,用于接收 Prometheus 推送的数据。
执行脚本:
docker run -d --name vm \
--restart=always \
-p 8428:8428 \
-v /data/vm-data:/vm-data \
victoriametrics/victoria-metrics:latest \
-retentionPeriod=3 \
-storageDataPath=/vm-data \
-httpListenAddr=:8428
注意 :请确保服务器防火墙已放行 8428 端口,以便集群内的 Prometheus 能够访问。

📦 第二步:部署 Prometheus Operator (采集层)
1. 获取 Helm Chart
# 添加 Prometheus 社区仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 下载 Chart 包 (在线模式)
helm pull prometheus-community/kube-prometheus-stack --destination ./charts
# 解压备用 (如果需要修改默认 values)
# tar -zxvf ./charts/kube-prometheus-stack-*.tgz
2. 配置 values.yaml
创建名为 values.yaml 的文件,核心配置是将数据远程写入 (Remote Write) 到 VictoriaMetrics,并关闭不需要的组件以节省资源,不要报警项和granfana。
# ==========================================
# 1. Prometheus 核心配置
# ==========================================
prometheus:
prometheusSpec:
# --- 关键配置:远程写入 VictoriaMetrics ---
remoteWrite:
- url: "http://<YOUR_SERVER_IP>:8428/api/v1/write"
# 如果 VM 和 Prometheus 在同一台机器或内网互通,IP 填宿主机 IP
# 如果在集群内部通过 Service 访问,可改为 http://victoria-metrics.yeyin.svc:8428/api/v1/write
# 优化写入性能配置
queueConfig:
capacity: 10000 # 队列容量
maxShards: 200 # 最大并发分片
maxSamplesPerSend: 5000
batchSendDeadline: 5s
# --- 资源限制 (根据集群实际情况调整) ---
resources:
requests:
memory: 500Mi
cpu: 250m
limits:
memory: 2Gi
cpu: 1000m
# --- 数据保留时间 ---
# 因为数据都推送到 VM 了,本地只需保留少量数据用于缓冲
retention: 2h
# --- 存储配置 ---
# 建议保留少量本地存储以防网络波动,或使用 emptyDir
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
# --- 允许发现所有的 ServiceMonitor/PodMonitor ---
serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false
ruleSelectorNilUsesHelmValues: false
# ==========================================
# 2. 关闭 Alertmanager (由夜莺接管告警)
# ==========================================
alertmanager:
enabled: false
# ==========================================
# 3. 关闭 Grafana (由夜莺接管展示)
# ==========================================
grafana:
enabled: false
# ==========================================
# 4. Node Exporter (采集宿主机指标)
# ==========================================
prometheus-node-exporter:
enabled: true
# ==========================================
# 5. Kube State Metrics (采集 K8s 对象指标)
# ==========================================
kube-state-metrics:
enabled: true
⚠️ 重要提示 :请将 url 中的 <YOUR_SERVER_IP> 替换为运行 VictoriaMetrics 的服务器真实 IP 地址。
3. 安装 Helm Chart
helm install k8s-monitor ./charts/kube-prometheus-stack-*.tgz \
-f values.yaml \
-n yeyin \
--create-namespace

4. 验证数据写入
等待几分钟让 Pod 启动并开始采集,然后检查 VictoriaMetrics 是否收到数据。
# 查询 up 指标的数量,如果大于 0 说明数据写入成功
curl -g 'http://localhost:8428/api/v1/query?query=up' | jq '.data.result | length'

🌙 第三步:部署 Nightingale (夜莺监控平台)
夜莺需要 MySQL 和 Redis 作为后端存储。您可以选择手动部署 DB,或使用 Docker Compose 一键部署全套(含 DB)。此处推荐使用官方提供的 Docker Compose 方式。
1. 克隆代码
cd /root
git clone https://github.com/ccfos/nightingale.git
cd nightingale/docker/compose-bridge
2. 启动服务
确保当前目录下有 docker-compose.yml 文件(通常包含 n9e, mysql, redis, prometheus 等容器定义,但我们可以只利用它的 DB 部分,或者全量启动后配置数据源)。
方式 A:全量启动 (推荐新手,包含内置的 MySQL/Redis)
version: '3.8'
# 定义一个独立的网络,确保内部服务互通
networks:
n9e-network:
driver: bridge
services:
# 1. MySQL: 存储夜莺的配置、用户、告警规则等元数据
mysql:
image: mysql:8.0
container_name: n9e-mysql
hostname: mysql
restart: always
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: n9e
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
volumes:
- ./mysqldata:/var/lib/mysql
# 确保 ../initsql 目录下有 n9e.sql 初始化脚本
- ../initsql:/docker-entrypoint-initdb.d/
- ./etc-mysql/my.cnf:/etc/my.cnf
networks:
- n9e-network
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
# 2. Redis: 存储缓存、会话、临时数据
redis:
image: redis:6.2-alpine
container_name: n9e-redis
hostname: redis
restart: always
environment:
TZ: Asia/Shanghai
networks:
- n9e-network
ports:
- "6379:6379"
command: redis-server --appendonly yes
# 3. Nightingale: 核心 Web 服务
nightingale:
image: flashcatcloud/nightingale:latest
container_name: n9e-server
hostname: nightingale
restart: always
environment:
GIN_MODE: release
TZ: Asia/Shanghai
# 等待 MySQL 和 Redis 启动后再启动夜莺
WAIT_HOSTS: mysql:3306,redis:6379
WAIT_TIMEOUT: 30
volumes:
- ./etc-nightingale:/app/etc
networks:
- n9e-network
ports:
- "17000:17000" # Web 界面端口
- "20090:20090" # 数据接收端口 (虽然你主要用拉取模式,但保留以防万一)
depends_on:
- mysql
- redis
command:
- /app/n9e
docker compose up -d
注:全量启动后,夜莺自带了一个内置的 Prometheus,您需要进入夜莺界面,将数据源修改为我们刚才部署的 VictoriaMetrics ( http://<IP>:8428*)。*
方式 B:仅启动 DB (如果您想单独部署夜莺后端二进制)
如果您只想用 docker 跑 MySQL 和 Redis:
- 编辑
docker-compose.yml,注释掉n9e(夜莺后端) 和prometheus相关服务,只保留mysql和redis。 - 执行
docker compose up -d。 - 然后去夜莺官网下载 Linux 二进制包运行
n9e服务。

3. 配置夜莺数据源
- 登录夜莺 Web 界面 (默认端口通常为 17000,账号root,密码root.2020)。
- 进入 系统设置 -> 数据源管理。

- 添加新数据源:
-
- 类型 :
Prometheus Like - 名称 :
VictoriaMetrics-K8s - URL :
http://<YOUR_SERVER_IP>:8428 - 设为默认: ✅ 勾选
- 类型 :

- 保存并测试连接。
4. 配置仪表盘
- 登录夜莺 Web 界面,选择仪表盘。

- 导入一个文件 -> 选择k8s->选择模版。

✅ 验证与使用
-
查看 Pod 状态:
kubectl get pods -n yeyin
确保 prometheus-k8s-monitor-prometheus-0, node-exporter-*, kube-state-metrics-* 均为 Running 状态。
- 导入仪表盘:
-
- 在夜莺界面,进入 仪表盘 -> 内置仪表盘。
- 搜索
Kubernetes或Node Exporter。 - 导入模板,选择刚才配置的
VictoriaMetrics-K8s数据源。 - 现在您应该能看到集群的 CPU、内存、Pod 状态等图表了!
- 解决"看不到主机列表"问题:
-
- 由于未部署 Categraf,夜莺无法自动注册主机。
- 解决方法 :在夜莺中创建一个 自建仪表盘 ,使用 Table (表格) 面板,编写 PromQL (如
up{job="kubernetes-nodes"}) 来展示所有节点的状态列表。
🔧 故障排查小贴士
- 数据不显示?
-
- 检查 Prometheus Pod 日志:
kubectl logs -n yeyin -l app.kubernetes.io/name=prometheus --tail=100,查看是否有remote write相关的错误。 - 检查网络连通性:在 Prometheus Pod 内
curl http://<VM_IP>:8428/api/v1/write。
- 检查 Prometheus Pod 日志:
- 夜莺连不上 VM?
-
- 确认服务器防火墙 (
firewalld/ufw/安全组) 已开放 8428 端口。 - 确认 URL 没有多余的
/api/v1/query后缀,只需写到端口。
- 确认服务器防火墙 (
- 为什么使用夜莺?
-
- 第一点肯定是中文,比granfan要操作,但是每个granfan好看,可以玩性低。
- 国产化,支持国产化。
- 最重要的一点就是强大的告警系统,这篇文章没有讲解,下期单独出一期。