方案:Sentry 集群搭建部署

4,442 阅读5分钟

关联标签: #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 集群部署

项目实践

最终 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 端口就好

Untitled.png

我用的 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
    

效果演示

启动节点数量如下

Untitled 1.png

启动 Pod 如下

Untitled 2.png

Untitled 3.png

Untitled 4.png

Untitled 5.png

Untitled 6.png

总结

个人自己服务器中实践了一下 9.1.2 版本和三方集群版本,两者的部署操作成本都非常低,但是资源占用这块确实差了很多,如果是公司用的话,建议部署最新版本,如果个人或者小团队可以考虑部署老版本或者单机部署。最重要的,一定要拉运维大佬下水,专业人有更多的精力把事情做的更专业。

最新版本的 Sentry 的部署中遇到运维相关软件版本的沟沟坑坑是真的多,想不看说明书直接就撸还是太鲁莽了,后来花了一个周的时间去把 k8s 这块入门,其中使用 vagrant 在虚拟机中部署,老是遇到 vagrant 相关的问题,觉得自己的方向不断跑偏,好在最后直接拿两台线上服务器来搞,花了一天就搞起来了。

最后强烈推荐阳明老师的 Docker 课程 「从 Docker 到 K8s 进阶」,非常偏实战的课程,花了一周时间认真学习之后,把自己的几台服务器全都给上 k8s 了,简直不要太爽,关键是这个课时真的便宜,和其他课程相比,简直跟不要钱似的😂。

参考文档

  1. Architecture | Sentry Developer Documentation
  2. github.com/getsentry/s…
  3. github.com/getsentry/s…
  4. github.com/sentry-kube…
  5. Sentry 9.1.2 的集群部署 - 知乎 (zhihu.com)
  6. Sentry 高可用部署 | 衣舞晨风 (jiankunking.com)
  7. 详解docker-compose安装sentry集群解决方案<二> | 运维随笔</二> (gitee.io)
  8. 优点知识 - 课程介绍页 (youdianzhishi.com)
  9. 从 Docker 到 Kubernetes 进阶
  10. Calabash's Blog
  11. Sentry实时应用错误跟踪系统在Kubernetes中私有化部署 - SegmentFault 思否
  12. helm安装Sentry - 掘金 (juejin.cn)
  13. 错误跟踪系统Sentry到底是何方神圣? - 掘金 (juejin.cn)
  14. helm安装Sentry (icode9.com)