1. Blog
  2. Golang
  3. kubernetes
  4. Rust
  5. 关于作者

fluxcd/flagger 源码初探

flagger 主要围绕着资源 Canary 执行各种操作。

pkg/controller/controller.go 为核心逻辑入口。

其中包含了一个缓存,用于缓存集群中存在的 canary 资源。

运行时启动两部分:

  1. 用于监听 canary 资源变化的 controller syncHandler负责 finalizer 和 cannery cache 维护。
  2. 用于定时检查 canary 缓存并执行操作的 scheduleCanaries

scheduleCanaries 会为每个缓存的 canary 运行一个 job,并对不存在 canary 的 job 进行清理。

job 中会定时执行advanceCanary

advanceCanary

advanceCanary 控制着 canary 资源的主要生命周期。

当一个 Canary 被创建时:

  1. 初始化

    1. KubernetesRouter,分为初始化,执行以及清理三个阶段。其实现以KubernetesDefaultRouter为主。
      1. Finalize: 恢复 main service 至之前的配置。
    2. Controller,用于控制 canary 各个阶段时需要进行的操作。有三个实现,depliyment,statefulset,service。
    3. MeshRouter,用于控制 canary 中流量路由。
  2. kubeRouter.Initialize(): 创建两个 service,%s-primary,%s-canary。
  3. canaryController.Initialize():创建 %s-primary deployment,如果 canary 正在初始化则副本数设置为 0.否则设置为目标副本数。
    1. 等待 %s-primary ready
    2. 调整 %s 副本数为 0
  4. 如果 canary 设置了 hpa,则更新现有 hpa 的 target 为 deployment %s-primary 或者创建新的 hpa。
  5. kubeRouter.Reconcile: 更新 main service %s 的 canary service Apex 的 labels。(一般不设置则跳过此步骤)
  6. c.shouldAdvance: 检查是否需要进行灰度更新。
  7. 根据 webhook 配置确认是否开始灰度。若否,则 return
  8. GetRoutes:istio controller 从名称为 %s 的 virtualservice 获取两个服务 %s-primary and %s-canary 的权重
  9. canaryController.IsCanaryReady(cd):等待 %s deoloyment 为运行状态。
  10. runPromotionTrafficShift: 将流量全部设置至服务 %s-primary。
  11. canaryController.ScaleToZero:将 deployment 副本数调整为 0
  12. c.nextStepWeight: 计算下一次的副本权重
  13. c.runCanary:进行灰度权重调整
    1. meshRouter.SetRoutes: 调整 virtualservice 服务 %s-primary and %s-canary 的权重
  14. 若调整完成

    1. canaryController.Promote:更新 deployment %s-primary 为 deployment %s,将 %s-primary labels 设置为 %s deployment 的 label
    2. canaryController.ScaleToZero:将 deployment %s 副本调整为 0
  15. 若删除 canary
    1. 恢复 deployment %s 的副本数为原副本数