关联标签: #Sentry #集群 #监控 #前端 #运维
背景
在前端团队的项目达到一定规模之后,对前端运行时的监控必不可少,目前团队使用开源的监控平台 Sentry 进行报错信息收集,已经达到实时报错通知、及时跟进的目的。
由于 Sentry 官方给出的部署方案中,只给出了单机的部署方案,为防止后续业务规模激增带来的流量爆发,导致 Sentry 单机节点挂掉,因此需要和运维团队给出集群化部署方案。
技术调研
目前世面上关于 Sentry 集群化部署有两个版本,一个是 Sentry 9.1.2 版本,一个是当前最新的 Sentry 21.10.0。
绝大部分文章都是团队先前部署后落地的,基于 9.1.2 进行的部署,相对这个版本,Sentry 的依赖其实很少,通过简单的 docker-compose 就能将集群部署起来。
而 21.10.0 的版本中,相对之前版本,多引入了 snuba、kafka、zk、clickhouse、ng、relay 等工具,虽然官方提供了单节点部署的 docker-compose.yml 文件,但整体集群部署的复杂度提升了几倍。大家可以点击查看 9.1.2 的文件 和 21.10.0 文件的差异。
官方单机版本
- 部署方案:docker-compose
- Github:github.com/getsentry/s…
- 优点:
- 官方维护
- 单机部署简单
- 缺点:
- 无法直接多节点集群化部署
三方集群版本
- 部署方案:k8s
- Github:github.com/sentry-kube…
- 优点:
- 开源
- 可直接通过 helm 部署
- 配置项丰富
- 缺点:
- 非官方版本,需要自己 review 一下开源代码
社区 9.1.2 集群部署
- 部署方案:docker-compose
- 社区文章:
项目实践
最终 9.1.2 和 21.10.0 都湿了一下,主要讲一下 21.10.0 的部署。
部署前提
- 部署文档:github.com/sentry-kube…
- 两台安装好 k8s 环境的机器,并且设置好主从节点,配置在 4h8g 及以上
- k8s 存储支持动态 pvc,如果不明白,可以学习底部阳明老师课程中的「StorageClass」相关章节
- 可访问子域名,并将域名 dns 解析到服务器节点上
安装依赖
安装 helm
wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz
tar zxvf helm-v3.7.1-linux-amd64.tar.gz
mv linux-amd64 helm
cp helm/helm /usr/bin/
安装 sentry 源
# 添加Helm仓库
helm repo add sentry https://sentry-kubernetes.github.io/charts
helm repo update
helm search repo sentry
# 下载Chart包,便于查看修改Chart
helm pull sentry/sentry
创建 sentry 配置文件 sentry.yml,完整配置参考。可根据自己机器的情况,酌情调整对应资源的配置和节点数。mail 为邮箱信息,user 为 sentry 初始化的管理员信息。
mail:
backend: smtp
from: "xxxx@ik47.com"
host: "smtp.exmail.qq.com"
port: 465
useTls: false
useSsl: true
username: "xxx@ik47.com"
password: "xxxxx"
user:
create: true
email: "sentry@ik47.com"
password: "xxxxxx"
安装 sentry,首次启动时间较长,可能部分安装超时,需要再次运行这个命令,继续安装
# 安装 sentry
helm install sentry -n sentry -f sentry.yml sentry/sentry --debug --wait
# 查看 pods 安装情况
kubectl get pods -n sentry
创建好之后,sentry 就算部署完成了,默认启动了 ng 服务,我们只需要将域名转发到这个 ng 服务的 80 端口就好
我用的 traefik 做的网关,管理域名和证书非常方便,创建 route.yml,内容如下
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: sentry-forward
spec:
entryPoints:
- websecure
routes:
- match: Host(`sentry.ik47.com`)
kind: Rule
services:
- name: sentry-nginx
namespace: sentry
port: 80
执行 kubectl apply -f route.yml
将路由生效,然后请求 [https://sentry.ik47.com](https://sentry.ik47.com)
来查看。
注意事项
本身的部署并不难,麻烦的是过程中会遇到各种各样奇怪的场景需要一一解决,只要耐心通过查看日志,和谷歌搜索日志关键词,都能解决。
-
常见命令
# 查看 pods 状态 kubectl get pods -n sentry # 查看日志 kubectl logs pods/xxx -n sentry # 删除容器 kubectl delete pods xxx -n sentry # 查看 pvc kubectl describe pvc xxx -n sentry # 进入容器中 kubectl exec -it -n sentry xxxx /bin/sh # 编辑 sentry 配置 kubectl edit cm sentry-sentry -n sentry # 启动 busybox,测试网络 kubectl run --rm busy --image=busybox --namespace=sentry -it /bin/sh
-
卸载 sentry
# 卸载 sentry helm uninstall sentry -n sentry kubectl delete deployments -n sentry --all kubectl delete pods -n sentry --all kubectl delete job -n sentry --all # 删除 pvc kubectl delete pvc --all -n sentry
-
如果数据库初始化失败,就通过下面的命令自行初始化和创建用户
kubectl exec -it -n sentry $(kubectl get pods -n sentry |grep sentry-web |awk '{print $1}') bash sentry upgrade # 如果没有管理员,则创建 sentry createuser
效果演示
启动节点数量如下
启动 Pod 如下
总结
个人自己服务器中实践了一下 9.1.2 版本和三方集群版本,两者的部署操作成本都非常低,但是资源占用这块确实差了很多,如果是公司用的话,建议部署最新版本,如果个人或者小团队可以考虑部署老版本或者单机部署。最重要的,一定要拉运维大佬下水,专业人有更多的精力把事情做的更专业。
最新版本的 Sentry 的部署中遇到运维相关软件版本的沟沟坑坑是真的多,想不看说明书直接就撸还是太鲁莽了,后来花了一个周的时间去把 k8s 这块入门,其中使用 vagrant 在虚拟机中部署,老是遇到 vagrant 相关的问题,觉得自己的方向不断跑偏,好在最后直接拿两台线上服务器来搞,花了一天就搞起来了。
最后强烈推荐阳明老师的 Docker 课程 「从 Docker 到 K8s 进阶」,非常偏实战的课程,花了一周时间认真学习之后,把自己的几台服务器全都给上 k8s 了,简直不要太爽,关键是这个课时真的便宜,和其他课程相比,简直跟不要钱似的😂。
参考文档
- Architecture | Sentry Developer Documentation
- github.com/getsentry/s…
- github.com/getsentry/s…
- github.com/sentry-kube…
- Sentry 9.1.2 的集群部署 - 知乎 (zhihu.com)
- Sentry 高可用部署 | 衣舞晨风 (jiankunking.com)
- 详解docker-compose安装sentry集群解决方案<二> | 运维随笔</二> (gitee.io)
- 优点知识 - 课程介绍页 (youdianzhishi.com)
- 从 Docker 到 Kubernetes 进阶
- Calabash's Blog
- Sentry实时应用错误跟踪系统在Kubernetes中私有化部署 - SegmentFault 思否
- helm安装Sentry - 掘金 (juejin.cn)
- 错误跟踪系统Sentry到底是何方神圣? - 掘金 (juejin.cn)
- helm安装Sentry (icode9.com)