最近一周一直在研究在公司的 rancher k8s 环境下搭建前端错误监控平台 sentry。首先介绍一下 sentry,这是一个非常强大的错误收集框架,可以收集众多语言的运行错误日志,其在前端错误的监控上应用的比较多。配合上传 sourceMap可以快速准确定位到源代码错误位置。
为什么它来监控前端错误呢?我们的测试无法覆盖到应用的方方面面,很多线上错误,往往是用户反馈到了客服人员,然后技术人员才能知晓,同时由于前端运行环境复杂,问题可能很难复现,技术人员定位错误需要不少的时间,这段时间就可能造成不小的损失了,如果解决问题花费的时间很久,用户对于这家公司的技术力也会产生质疑。应用前端错误监控之后,当线上有高频错误发生时,可以立即通过钉钉或者邮件的方式通知到开发人员,开发人员通过错误日志信息可以快速定位到错误点,这带来的好处是不言而喻的。
sentry 提供 saas 的服务,同时也提供开源的私有化部署版本,提供相同的服务体验。官方维护的是 docker-compose 的一键式部署方式,但是公司的云服务器都在 k8s 的集群,因此我考虑采用的是基于 k8s 的安装方式。然而公司并没有专业的运维人员,想折腾,只能自己动手了。最为一个一周前对 k8s 还是一窍不通的小白,踩坑是避免不了的,写这篇文章就是记录下踩的那些坑。
错误方式 rancher ui 商店方式安装
一开始知道可以在 rancher 上安装 sentry,是在 v 站看到的一个回复,说是起个部署 sentry 会方便很多。然后知道了 rancher 的商店里可以找到 sentry,然后一键安装。这里需要开启 rancher 商店的 helm 官方仓库,结果商店死活刷不出来应用列表,后来才知道国内的云主机是无法访问 google 的 helm 仓库的,需要使用国内加速的仓库 http://mirror.azure.cn/kubernetes/charts。
换了加速地址后,可以顺利使用 rancher 商店启动应用了,工作负载一堆爆红,web,db和redis都没起来,这是因为没有设置默认存储类,导致 pvc 没有 绑定到 pv。刚一开始我可不知道 pv 和 pvc 的概念,更不用说默认存储类,总之是又百度又google又看官方文档的,算是稍稍搞明白了这块。这个在安装要求里已经说明了,k8s集群应该有一个默认存储类,用来动态分配pv。rancher ui 里像下图一样。
配置好了这个,按理说通过 rancher ui 的商店应该可以正常安装了吧,然而答案是并不能。这时候所有组件都能正常创建,除了一个 pending 的 loadbalance Service,这个我一开始没管它,自己又创建了一个 Ingress 配置,总算是可以访问 sentry 的 web 页面了。但是我按照文档的方法,输入用户名和密码,一直提示登录失败。我重装了几次,一直如此,折腾了几个小时,才发现了原因。
rancher ui 也是通过 helm 工具安装 chart 的,helm 默认的等待事件是 5分钟,超过了就认为安装失败了。而 sentry 的安装是包含了两个 job 的,db_init 和 user_create。db_init 用时很长,已经超过了5分钟,helm 认为安装失败了,就不继续调用 user_create 的 job了,导致初始用户根本没有被初始化进去。
正确方式 helm 方式安装
rancher ui中并没有方式去设置 helm 的等待时间,因此只能采用 helm 的方式进行安装了。这里感谢这位仁兄的文章 Sentry实时应用错误跟踪系统在Kubernetes中私有化部署,给予了我很大的帮助。
先简单介绍一下 helm,helm 是一个 k8s 的应用管理工具。helm 的 chart 我理解和 docker-compose 的 compose.yaml 类似,但是比后者更强大,通过预先配置的一组文件,来一键式部署k8s应用。helm现在有helm2和helm3两个版本,其中helm2需要在k8s中安装 helm2 服务端 Tiller,麻烦不说,还有潜在的后门隐患。helm3取消了这一步,因此这里使用的是helm3。
这里还踩了一个坑,一开始 helm 方式,连 db_init 的 job 都不运行。检查了以下各个组件,只有名为 sentry 的 service 处于 pending状态。它的 serviceType 是 loadbalance。尝试删掉它,helm 直接返回错误,我感觉是helm要等待所有组件就绪,才会调度job。我看了下文档,service 主要是负责外网连接功能的,它有两种类型 loadbalance 和 nodeport,loadbalance 只有使用 gce(谷歌的云服务) 的服务才能正常工作。后来把他改成 nodeport 果然正常了。db_init 后,user_create 也正常调度了。
最后摸索出来的命令是这样的。
1 | helm --kubeconfig D:\bins\kubeconfig install sentry stable/sentry -n sentry --set persistenc |
稍微等待个10分钟作用, sentry服务就部署完成了,确实是很简单。。。
明天研究一下将 sentry 引入项目,然后在下篇博客再总结一下 sentry 的前端监控应用。