通过夜莺n9e监控Kubernetes集群

需求,为什么要部署

使用 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:

  1. 编辑 docker-compose.yml,注释掉 n9e (夜莺后端) 和 prometheus 相关服务,只保留 mysqlredis
  2. 执行 docker compose up -d
  3. 然后去夜莺官网下载 Linux 二进制包运行 n9e 服务。

3. 配置夜莺数据源

  1. 登录夜莺 Web 界面 (默认端口通常为 17000,账号root,密码root.2020)。
  2. 进入 系统设置 -> 数据源管理
  1. 添加新数据源:
    • 类型 : Prometheus Like
    • 名称 : VictoriaMetrics-K8s
    • URL : http://<YOUR_SERVER_IP>:8428
    • 设为默认: ✅ 勾选
  1. 保存并测试连接。

4. 配置仪表盘

  1. 登录夜莺 Web 界面,选择仪表盘。
  1. 导入一个文件 -> 选择k8s->选择模版。

✅ 验证与使用

  1. 查看 Pod 状态

    kubectl get pods -n yeyin

确保 prometheus-k8s-monitor-prometheus-0, node-exporter-*, kube-state-metrics-* 均为 Running 状态。

  1. 导入仪表盘
    • 在夜莺界面,进入 仪表盘 -> 内置仪表盘
    • 搜索 KubernetesNode Exporter
    • 导入模板,选择刚才配置的 VictoriaMetrics-K8s 数据源。
    • 现在您应该能看到集群的 CPU、内存、Pod 状态等图表了!
  1. 解决"看不到主机列表"问题
    • 由于未部署 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
  • 夜莺连不上 VM?
    • 确认服务器防火墙 (firewalld/ufw/安全组) 已开放 8428 端口。
    • 确认 URL 没有多余的 /api/v1/query 后缀,只需写到端口。
  • 为什么使用夜莺?
    • 第一点肯定是中文,比granfan要操作,但是每个granfan好看,可以玩性低。
    • 国产化,支持国产化。
    • 最重要的一点就是强大的告警系统,这篇文章没有讲解,下期单独出一期。
相关推荐
Mimo_YY2 小时前
SQL-忘记sa密码,如何安全的尝试旧密码,如何修改新密码
安全
EasyGBS2 小时前
EasyGBS适配国密GB35114协议的核心技术对别解析
网络·安全·gb28181
淡泊if2 小时前
K8s 网络排障:从抓包开始,一步步定位诡异“502”
网络·kubernetes·k8s
小李的便利店2 小时前
k8s集群部署Prometheus和Grafana
kubernetes·grafana·prometheus·监控
margu_1683 小时前
【Docker】nscenter命令详解
运维·docker·容器
阿里云云原生3 小时前
Higress 加入 CNCF:保障 Nginx Ingress 迁移,提供企业级 AI 网关
云原生
爱学习的小道长3 小时前
OpenClaw 解决运行一些漏洞
安全·ai·飞书
yy55273 小时前
Nginx 安全防护与 HTTPS 部署实战
nginx·安全·https
道清茗4 小时前
【Kubernetes知识点问答题】Pod 调度
云原生·容器·kubernetes