夜莺监控( Nightingale )是一款国产、开源云原生监控分析系统,采用 All-In-One 的设计,集数据采集、可视化、监控告警、数据分析于一体。于 2020 年 3 月 20 日,在 github 上发布 v1 版本,已累计迭代 60 多个版本。从 v5 版本开始与 Prometheus、VictoriaMetrics、Grafana、Telegraf、Datadog 等生态紧密协同集成,提供开箱即用的企业级监控分析和告警能力,已有众多企业选择将 Prometheus + AlertManager + Grafana 的组合方案升级为使用夜莺监控。夜莺监控,由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。夜莺监控的核心开发团队,也是Open-Falcon项目原核心研发人员。
前文讲了关于Prometheus的种种用法,我们不难看出 Prometheus + AlertManager + Grafana 这种组合式用用法,确实为底层各种监控提供了多种灵活配置+可观测性+及时告警。但是上升到企业运维层面,想快速接入一套成熟监控体系,没几月功夫想搞透是很难的,并且运维成本很高,感觉这就是Nightingale的切入点,他的价值在于搭建完毕就是一套最佳实践,话不多说我们下面开搞。
拉取最新代码
git clone git@github.com:flashcatcloud/n9e-helm.git
安装应用(以 n9e 为 namespace )
helm install nightingale ./n9e-helm -n n9e --create-namespace
NAME: nightingale
LAST DEPLOYED: Mon Jun 27 22:06:38 2022
NAMESPACE: n9e
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for nightingale deployment to complete.
Then you should be able to visit the nightingale web at http://hello.n9e.info
For more details, please visit https://github.com/flashcat/n9e-helm
静等数分钟后我们查看状态
查看无状态列表
$ /usr/local/bin/kubectl get deployment -n n9e
NAME READY UP-TO-DATE AVAILABLE AGE
nightingale-nserver 0/1 1 0 8m28s
nightingale-nwebapi 0/1 1 0 8m28s
查看有状态列表
/usr/local/bin/kubectl get StatefulSet -n n9e
NAME READY AGE
nightingale-database 1/1 7m20s
nightingale-prometheus 0/1 7m20s
nightingale-redis 0/1 7m20s
查看服务列表
$ /usr/local/bin/kubectl get service -n n9e
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nightingale-database ClusterIP 10.233.1.220 <none> 3306/TCP 5m11s
nightingale-nserver ClusterIP 10.233.29.143 <none> 80/TCP 5m11s
nightingale-nwebapi ClusterIP 10.233.22.121 <none> 80/TCP 5m11s
nightingale-prometheus ClusterIP 10.233.38.255 <none> 9090/TCP 5m11s
nightingale-redis ClusterIP 10.233.31.119 <none> 6379/TCP 5m11s
上面部署状态来说整个服务是由3个存储服务,2个后端服务构成。官方给到的架构图如下:
核心是 server 和 webapi 两个模块,webapi 无状态,放到中心端,承接前端请求,将用户配置写入数据库;server 是告警引擎和数据转发模块,一般随着时序库走,一个时序库就对应一套 server,每套 server 可以只用一个实例,也可以多个实例组成集群,server 可以接收 Categraf、Telegraf、Grafana-Agent、Datadog-Agent、Falcon-Plugins 上报的数据,写入后端时序库,周期性从数据库同步告警规则,然后查询时序库做告警判断。每套 server 依赖一个 redis。
官方默认开放的访问方式是域名
$ /usr/local/bin/kubectl get ingress -n n9e
NAME CLASS HOSTS ADDRESS PORTS AGE
nightingale-ingress <none> hello.n9e.info 10.86.68.66 80 19m
由于我本机master的80端口无法使用,我这里以service 的NodePort方式访问了,设置方法如下。
vim n9e-helm/templates/nwebapi/service.yaml
#在selector:上面增加一行 type: NodePort
....
type: NodePort
selector:
....
更新服务
/usr/local/bin/helm upgrade nightingale ./n9e-helm -n n9e
重新查看服务
$ /usr/local/bin/kubectl get service -n n9e
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nightingale-database ClusterIP 10.233.1.220 <none> 3306/TCP 95m
nightingale-nserver ClusterIP 10.233.29.143 <none> 80/TCP 95m
nightingale-nwebapi NodePort 10.233.22.121 <none> 80:31644/TCP 95m
nightingale-prometheus ClusterIP 10.233.38.255 <none> 9090/TCP 95m
nightingale-redis ClusterIP 10.233.31.119 <none> 6379/TCP 95m
下面用 http://127.0.0.1:31644/ 访问测试即可。
账号:root
密码:root.2020
默认Node数据都已经采集好了。
我们试一把基于prometheus的PromQL查询
#获取当前运行POD内存占用从高到低
sort_desc(avg(kubernetes_pod_container_memory_usage_bytes/1024/1024/1024) by (pod_name))
更多其他内置服务,大家可以去试试。
方法很简单,把所有image替换成自己私有仓库的镜像即可。
vim n9e-helm/values.yaml
修改完毕后拷贝n9e-helm文件夹到指定机器运行即可
helm install nightingale ./n9e-helm -n n9e --create-namespace