kubernetes版本:1.13.2
接上一节:kubernetes垃圾回收器GarbageCollector Controller源码分析(一)
主要步骤
GarbageCollector Controller源码主要分为以下几部分:
monitors
作为生产者将变化的资源放入graphChanges
队列;同时restMapper
定期检测集群内资源类型,刷新monitors
runProcessGraphChanges
从graphChanges
队列中取出变化的item
,根据情况放入attemptToDelete
队列;runProcessGraphChanges
从graphChanges
队列中取出变化的item
,根据情况放入attemptToOrphan
队列;runAttemptToDeleteWorker
从attemptToDelete
队列取出,尝试删除垃圾资源;runAttemptToOrphanWorker
从attemptToDelete
队列取出,处理该孤立的资源;
代码较复杂,便于讲的更清楚,调整了下讲解顺序。上一节分析了第1部分,本节分析第2、3部分。
runProcessGraphChanges处理主流程
来到源码k8s.io\kubernetes\pkg\controller\garbagecollector\graph_builder.go中,runProcessGraphChanges中一直死循环处理变化的资源对象:
func (gb *GraphBuilder) runProcessGraphChanges() {
for gb.processGraphChanges() {
}
}
一个协程一直循环从graphChanges队列中获取变化的资源对象,更新图形,填充dirty_queue。(graphChanges队列里数据来源于各个资源的monitors监听资源变化回调addFunc、updateFunc、deleteFunc)
// Dequeueing an event from graphChanges, updating graph, populating dirty_queue.
//从graphChanges中获取事件,更新图形,填充dirty_queue。(graphChanges队列里数据来源于各个资源的monitors监听资源变化回调addFunc、updateFunc、deleteFunc)
func (gb *GraphBuilder) processGraphChanges() bool {
item, quit := gb.graphChanges.Get()
if quit {
return false
}
defer gb.graphChanges.Done(item)
event, ok := item.(*event)
if !ok {
utilruntime.HandleError(fmt.Errorf("expect a *event, got %v", item))
return true
}
obj := event.obj
//获取该变化资源obj的accessor
accessor, err := meta.Accessor(obj)
if err != nil {
utilruntime.HandleError(fmt.Errorf("cannot access obj: %v", err))
return true
}
klog.V(5).Infof("GraphBuilder process object: %s/%s, namespace %s, name %s, uid %s, event type %v", event.gvk.GroupVersion().String(), event.gvk.Kind, accessor.GetNamespace(), accessor.GetName(), string(accessor.GetUID()), event.eventType)
// Check if the node already exists
// 检查节点是否已存在
//根据该变化资源obj的UID
//uidToNode维护着资源对象依赖关系图表结构
existingNode, found := gb.uidToNode.Read(accessor.GetUID())
if found {
// this marks the node as having been observed via an informer event
// 1. this depends on graphChanges only containing add/update events from the actual informer
// 2. this allows things tracking virtual nodes' existence to stop polling and rely on informer events
//这标志着节点已经通过informer事件
// 1.进行了观察。这取决于仅包含来自实际informer的添加/更新事件的graphCha