fluxcd/flagger 源码初探
flagger 主要围绕着资源 Canary 执行各种操作。
以pkg/controller/controller.go 为核心逻辑入口。
其中包含了一个缓存,用于缓存集群中存在的 canary 资源。
运行时启动两部分:
- 用于监听 canary 资源变化的 controller syncHandler负责 finalizer 和 cannery cache 维护。
- 用于定时检查 canary 缓存并执行操作的 scheduleCanaries
scheduleCanaries 会为每个缓存的 canary 运行一个 job,并对不存在 canary 的 job 进行清理。
job 中会定时执行advanceCanary
advanceCanary
advanceCanary 控制着 canary 资源的主要生命周期。
当一个 Canary 被创建时:
-
初始化
- KubernetesRouter,分为初始化,执行以及清理三个阶段。其实现以KubernetesDefaultRouter为主。
- Finalize: 恢复 main service 至之前的配置。
- Controller,用于控制 canary 各个阶段时需要进行的操作。有三个实现,depliyment,statefulset,service。
- MeshRouter,用于控制 canary 中流量路由。
- KubernetesRouter,分为初始化,执行以及清理三个阶段。其实现以KubernetesDefaultRouter为主。
- kubeRouter.Initialize(): 创建两个 service,%s-primary,%s-canary。
- canaryController.Initialize():创建 %s-primary deployment,如果 canary 正在初始化则副本数设置为 0.否则设置为目标副本数。
- 等待 %s-primary ready
- 调整 %s 副本数为 0
- 如果 canary 设置了 hpa,则更新现有 hpa 的 target 为 deployment %s-primary 或者创建新的 hpa。
- kubeRouter.Reconcile: 更新 main service %s 的 canary service Apex 的 labels。(一般不设置则跳过此步骤)
- c.shouldAdvance: 检查是否需要进行灰度更新。
- 根据 webhook 配置确认是否开始灰度。若否,则 return
- GetRoutes:istio controller 从名称为 %s 的 virtualservice 获取两个服务 %s-primary and %s-canary 的权重
- canaryController.IsCanaryReady(cd):等待 %s deoloyment 为运行状态。
- runPromotionTrafficShift: 将流量全部设置至服务 %s-primary。
- canaryController.ScaleToZero:将 deployment 副本数调整为 0
- c.nextStepWeight: 计算下一次的副本权重
- c.runCanary:进行灰度权重调整
- meshRouter.SetRoutes: 调整 virtualservice 服务 %s-primary and %s-canary 的权重
-
若调整完成
- canaryController.Promote:更新 deployment %s-primary 为 deployment %s,将 %s-primary labels 设置为 %s deployment 的 label
- canaryController.ScaleToZero:将 deployment %s 副本调整为 0
- 若删除 canary
- 恢复 deployment %s 的副本数为原副本数