控制器除了 list watch 自身 CRD 相关资源外,还 list watch 了 Pod 资源,而大规模场景下,全量 Pod 缓存占用内存较大,因为在 Pod 入缓存前,只保留本控制器关注的字段,其他字段不缓存,这样可大大降低内存占用。当要更新 Pod 时(比如注解和finalizer),就不直接拿缓存里的 Pod 进行 Update(因为缓存字段不全,无法直接 Update),而是先从 API Server 获取 Pod,再更新。
很多CLB的写接口都有实例锁,且是异步的,并发调用或间隔太短都容易导致实例锁冲突,最终导致接口调用失败。在实现时,我们将异步的接口调用包装成同步的函数(内部通过轮询查询异步任务的状态直到任务结束来实现将异步转为同步),再通过加锁的方式,保证每个CLB实例的写操作的原子性,即避免并发冲突,又做到了尽可能快的对账操作(避免CLB的写操作延迟导致流量异常)。