第73节 一次大型的 review 现场:Generic event mechanism


❤️💕💕记录sealosopen in new window开源项目的学习过程。k8s,docker和云原生的学习open in new window。Myblog:http://nsddd.topopen in new window


[TOC]

why

最近网易 森哥 花了一个月多的时间终于把 Generic event mechanism 设计出来了,我赶紧去 review 了一下设计方案和代码,希望从中学习到设计精髓。

  • issue:https://github.com/horizoncd/horizon/issues/147
  • Google docs:https://docs.google.com/document/d/1kE_BMVr4sYucQiSOT8LdEObAsoOtkhL5TL0NhvsML4I/edit?usp=sharing
  • PR:https://github.com/horizoncd/horizon/pull/155

设计思路

文档思路:

  • Horizon发布下一批和发布完成时需要发送通知给用户
  • 外部用户也需要更多的事件

需求分析:

  1. 用户使用自动发布功能,自动发布下一批和发布完成或者失败时,需要发送通知给发布的触发者。
  2. 外部需要Horizon提供更多的Webhook,比如上下线,重启等事件

事件分析:

Rollout

当rollouts发布下一批时,发送SetStepIndex事件

4h39mNormalSetStepIndexrollout/bad2good-setweight-onlycheck-newrsSet Step Index to 1
  1. 当rollouts发布完成后,将发送SettingStableRS事件
4h39mNormalSettingStableRSrollout/bad2good-setweight-onlycheck-newrsCompleted all steps

Argo Application

发布成功时,状态由Progressing转变为Healthy

17hNormalResourceUpdatedapplication/horizon-cs-4-regressionUpdated health status: Progressing -> Healthy

发布失败时,状态由Progressing变为Degraded

18hNormalResourceUpdatedapplication/horizon-cs-4-regressionUpdated health status: Progressing -> Degraded

发布下一批时,状态由Suspended转变为Progressing

15hNormalResourceUpdatedapplication/for-argocd-dfldsflsjUpdated health status: Suspended -> Progressing

整体设计:

  1. Horizon中添加监听Event的逻辑,监听配置资源的Event,Horizon应该监听region表中所有启用的集群
  2. 将监听资源产生的Event写入数据库中
  3. Webhook job取出event,发送相应的Webhook
  4. 开发ReleaseAdapter组件,监听webhook,并发送通知给相关用户
EventDescriptionStatus
Generic event mechanismHorizon listens to events on Kubernetes and supports sending related events through WebhooksDesigning

PR 思路:

大致做了三件事:

  • 添加 k8s event package 以 侦听 k8s 事件并将其写入数据库。
  • 使用 informer 列出资源树中的所有 pod,大大减轻了 kube API 服务器的压力。
  • 添加清理作业以定期清理 Webhook 日志和事件。

END 链接