通过夜莺n9e监控Kubernetes集群

通过夜莺n9e监控Kubernetes集群 需求为什么要部署使用 Prometheus 抓取数据传给VM 数据库VM数据库保证数据不丢且好查用 夜莺 调用VM数据库保证能看懂且不被告警烦死。这是目前性价比最高、体验最好的开源监控方案。最主要的原因是因为Alertmanager和Grafana对中文太不友好而且太麻烦。Kubernetes 监控栈部署指南架构组成采集层: Prometheus Operator (kube-prometheus-stack)存储层: VictoriaMetrics (单节点)展示/告警层: Nightingale (夜莺)依赖组件: MySQL, Redis (夜莺后端依赖) 前置准备1. 创建命名空间kubectl create namespace yeyin2. 准备依赖组件 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 \ --restartalways \ -p 8428:8428 \ -v /data/vm-data:/vm-data \ victoriametrics/victoria-metrics:latest \ -retentionPeriod3 \ -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-*.tgz2. 配置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 Charthelm install k8s-monitor ./charts/kube-prometheus-stack-*.tgz \ -f values.yaml \ -n yeyin \ --create-namespace4. 验证数据写入等待几分钟让 Pod 启动并开始采集然后检查 VictoriaMetrics 是否收到数据。# 查询 up 指标的数量如果大于 0 说明数据写入成功 curl -g http://localhost:8428/api/v1/query?queryup | 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-bridge2. 启动服务确保当前目录下有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-pluginmysql_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/n9edocker 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-K8sURL: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{jobkubernetes-nodes}) 来展示所有节点的状态列表。 故障排查小贴士数据不显示检查 Prometheus Pod 日志kubectl logs -n yeyin -l app.kubernetes.io/nameprometheus --tail100查看是否有remote write相关的错误。检查网络连通性在 Prometheus Pod 内curl http://VM_IP:8428/api/v1/write。夜莺连不上 VM确认服务器防火墙 (firewalld/ufw/安全组) 已开放 8428 端口。确认 URL 没有多余的/api/v1/query后缀只需写到端口。为什么使用夜莺第一点肯定是中文比granfan要操作但是每个granfan好看可以玩性低。国产化支持国产化。最重要的一点就是强大的告警系统这篇文章没有讲解下期单独出一期。