企鹅物流数据统计 技术基建分享与未来展望

前言

2021 年下旬,为应对由于记录量巨大、越来越重的服务负载,我们决定进行 v3 后端重构。在经历一部分设计、架构打磨与重构后,我们于 2022 年 1 月开始进行 v3 后端重构代码的大批量实现、并于将近一个半月内完成。此后我们注重于一些关键部分的性能调优与日志优化后,于 2022 年 4 月成功上线 v3 后端。

在上线 v3 后端后,技术基建的较严重滞后对开发、监控、排障与事故处理均带来了不小的困难。在对比了多方方案后,我们最终选择了 Kubernetes 作为基础的容器排布、在其上使用多个 CNCF Incubating/Graduated 项目作为新基建的若干基石。Kubernetes (k8s.io) 是 Google 开源的 Container Orchestration 系统。有趣的是,Orchestration 这个词亦意为「将…谱写为管弦乐曲」,因此亦可翻译为「以“容器”为主题的管弦乐作曲家及指挥家」,从某种意义上还是比较有高雅的感觉的。Kubernetes 非常成熟,已由极众多的国内外领先企业长达多年运行最敏感的业务,包括招商银行、中国联通、京东、蚂蚁金服、Spotify 与 Wikimedia 等,当然也包含 Google 几乎所有的业务。这些 Kubernetes 成功故事证明了其稳定性、可靠性与极强的扩展性。

基建搭建

对于 Kubernetes,正确、完整且安全地搭建 Control Plane 与正确部署 Worker Nodes 事实上是需要耗费不少精力和经验的。由于时间紧迫、人员极度紧缺(是的我们只有俩开发x)且资金并不充裕,最终我们在经历了长达一个月的选择后,从 GCP (GKE), AWS (EKS), Azure (AKS), 和并不为熟知的 DigitalOcean Kubernetes 中选择了 DigitalOcean Kubernetes。在可接受的价格下,DigitalOcean Kubernetes 可给我们带来足够的性能、同时提供免费的 Control Plane 且带宽费用非常低廉,使得我们可以以最小成本换取最大收益。

DigitalOcean Kubernetes 的启动十分简单。在 Dashboard 选择 Region、Node Pool 配置后,等待若干分钟集群即可使用。鉴权使用的是 DigitalOcean 的 doctl + 同时支持传统证书方式,使用 doctl 使得运维鉴权凭据得以自动 rotate,方便又安全、而传统证书得以让我们在手机上使用 Kuber 等 Kubernetes 集群直连 App 进行日常的集群状态检点与紧急排障辅助,非常好用。

GitOps 与 CRD Operator

在集群就绪后,直接使用 kubectl 对集群进行日常操作是不现实的。业界通用的做法是 GitOps 方案,而我们当然也采用了这种方案。GitOps 可让运维与开发在使用静态 yaml 文件、Helm Charts、kustomize 或其他资源声明文件生成器对容器内资源进行声明后,使 CRD Operator 自动计算容器当前实际状态与声明的资源状态进行 diff,并在不对称时单向从声明状态同步至集群。同时,得益于 Git 的版本控制功能,在出现问题时也可及时回滚到任意指定时间点。虽然使用 GitOps 还可以结合 GitHub 的 Protected Branch 进行 DevOps 组审计资源变更后再合入等审计功能、及使用 Kubernetes E2E 测试进行资源合法性测试,但考虑到我们开发就俩人,没有这方面的必要,因此这方面的讨论超出本文章的讨论范围,我们也没有使用这部分 GitOps 带来的功能。

在对比多个 CRD Operator 后,最终我们选用了 ArgoCD。原因有如下几点:

  • 自带一个不是*那么*好看但是足够有用的 Dashboard,操作简单且非常直观
  • 可同时非常简单地直接接入 Argo 生态下的 Argo Rollout,使得蓝绿部署与 Canary 部署均非常简单
  • CNCF Incubating
  • 前司在用,个人有一些使用经验并且体验上没什么坑
  • 支持静态 yaml、Helm Chart、kustomize
  • 每个 Application 也是一个 argoproj.io/v1alpha1 API 下的 `Application`,因此可以用 ArgoCD 创建 ArgoCD Application 创建 ArgoCD Application 创建 ArgoCD Application 创建 ArgoCD Application

服务可观察性 (Observability) 与监控 (Monitoring)

可观察性与监控非常重要,他们是自动化运维的基石之一。依我理解,可观察性是指「可以以高维方式观测服务的各个指标」,而监控则「可以自动地通过使用可观察性数据和其他来源数据」


「未完待续」