client-go v0.36.1 系统级架构分析(下篇)
模块调用关系、数据传递、主流程深度解析
第三章 模块调用关系深度解析
3.1 全局模块依赖关系图
#mermaid-svg-U08GRP2y2Iibtw4p{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-U08GRP2y2Iibtw4p .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-U08GRP2y2Iibtw4p .error-icon{fill:#552222;}#mermaid-svg-U08GRP2y2Iibtw4p .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-U08GRP2y2Iibtw4p .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-U08GRP2y2Iibtw4p .marker{fill:#333333;stroke:#333333;}#mermaid-svg-U08GRP2y2Iibtw4p .marker.cross{stroke:#333333;}#mermaid-svg-U08GRP2y2Iibtw4p svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-U08GRP2y2Iibtw4p p{margin:0;}#mermaid-svg-U08GRP2y2Iibtw4p .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-U08GRP2y2Iibtw4p .cluster-label text{fill:#333;}#mermaid-svg-U08GRP2y2Iibtw4p .cluster-label span{color:#333;}#mermaid-svg-U08GRP2y2Iibtw4p .cluster-label span p{background-color:transparent;}#mermaid-svg-U08GRP2y2Iibtw4p .label text,#mermaid-svg-U08GRP2y2Iibtw4p span{fill:#333;color:#333;}#mermaid-svg-U08GRP2y2Iibtw4p .node rect,#mermaid-svg-U08GRP2y2Iibtw4p .node circle,#mermaid-svg-U08GRP2y2Iibtw4p .node ellipse,#mermaid-svg-U08GRP2y2Iibtw4p .node polygon,#mermaid-svg-U08GRP2y2Iibtw4p .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U08GRP2y2Iibtw4p .rough-node .label text,#mermaid-svg-U08GRP2y2Iibtw4p .node .label text,#mermaid-svg-U08GRP2y2Iibtw4p .image-shape .label,#mermaid-svg-U08GRP2y2Iibtw4p .icon-shape .label{text-anchor:middle;}#mermaid-svg-U08GRP2y2Iibtw4p .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-U08GRP2y2Iibtw4p .rough-node .label,#mermaid-svg-U08GRP2y2Iibtw4p .node .label,#mermaid-svg-U08GRP2y2Iibtw4p .image-shape .label,#mermaid-svg-U08GRP2y2Iibtw4p .icon-shape .label{text-align:center;}#mermaid-svg-U08GRP2y2Iibtw4p .node.clickable{cursor:pointer;}#mermaid-svg-U08GRP2y2Iibtw4p .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-U08GRP2y2Iibtw4p .arrowheadPath{fill:#333333;}#mermaid-svg-U08GRP2y2Iibtw4p .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-U08GRP2y2Iibtw4p .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-U08GRP2y2Iibtw4p .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U08GRP2y2Iibtw4p .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-U08GRP2y2Iibtw4p .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U08GRP2y2Iibtw4p .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-U08GRP2y2Iibtw4p .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-U08GRP2y2Iibtw4p .cluster text{fill:#333;}#mermaid-svg-U08GRP2y2Iibtw4p .cluster span{color:#333;}#mermaid-svg-U08GRP2y2Iibtw4p div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-U08GRP2y2Iibtw4p .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-U08GRP2y2Iibtw4p rect.text{fill:none;stroke-width:0;}#mermaid-svg-U08GRP2y2Iibtw4p .icon-shape,#mermaid-svg-U08GRP2y2Iibtw4p .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U08GRP2y2Iibtw4p .icon-shape p,#mermaid-svg-U08GRP2y2Iibtw4p .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-U08GRP2y2Iibtw4p .icon-shape .label rect,#mermaid-svg-U08GRP2y2Iibtw4p .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U08GRP2y2Iibtw4p .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-U08GRP2y2Iibtw4p .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-U08GRP2y2Iibtw4p :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础设施
传输层 (L1)
REST 基础层 (L2)
抽象客户端层 (L3)
框架层 (L4)
应用层 (L5)
kubernetes/
informers/
listers/
applyconfigurations/
tools/cache/
util/workqueue/
tools/leaderelection/
tools/record/
tools/events/
dynamic/
dynamic/dynamicinformer/
dynamic/dynamiclister/
metadata/
metadata/metadatainformer/
metadata/metadatalister/
scale/
rest/
discovery/
discovery/cached/
discovery/fake/
restmapper/
tools/clientcmd/
tools/auth/
tools/pager/
tools/reference/
transport/
transport/spdy/
transport/websocket/
features/
testing/
util/
pkg/
plugin/
gentype/
3.2 核心调用链详解
3.2.1 Informer 启动全链路
processorListener sharedProcessor cache(Indexer) DeltaFIFO/RealFIFO Reflector Controller sharedIndexInformer GenericInformer SharedInformerFactory 用户代码 processorListener sharedProcessor cache(Indexer) DeltaFIFO/RealFIFO Reflector Controller sharedIndexInformer GenericInformer SharedInformerFactory 用户代码 #mermaid-svg-pVRffwESU1ezjpi0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pVRffwESU1ezjpi0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pVRffwESU1ezjpi0 .error-icon{fill:#552222;}#mermaid-svg-pVRffwESU1ezjpi0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pVRffwESU1ezjpi0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pVRffwESU1ezjpi0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pVRffwESU1ezjpi0 .marker.cross{stroke:#333333;}#mermaid-svg-pVRffwESU1ezjpi0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pVRffwESU1ezjpi0 p{margin:0;}#mermaid-svg-pVRffwESU1ezjpi0 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-pVRffwESU1ezjpi0 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-pVRffwESU1ezjpi0 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-pVRffwESU1ezjpi0 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-pVRffwESU1ezjpi0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-pVRffwESU1ezjpi0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-pVRffwESU1ezjpi0 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-pVRffwESU1ezjpi0 .sequenceNumber{fill:white;}#mermaid-svg-pVRffwESU1ezjpi0 #sequencenumber{fill:#333;}#mermaid-svg-pVRffwESU1ezjpi0 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-pVRffwESU1ezjpi0 .messageText{fill:#333;stroke:none;}#mermaid-svg-pVRffwESU1ezjpi0 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-pVRffwESU1ezjpi0 .labelText,#mermaid-svg-pVRffwESU1ezjpi0 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-pVRffwESU1ezjpi0 .loopText,#mermaid-svg-pVRffwESU1ezjpi0 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-pVRffwESU1ezjpi0 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-pVRffwESU1ezjpi0 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-pVRffwESU1ezjpi0 .noteText,#mermaid-svg-pVRffwESU1ezjpi0 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-pVRffwESU1ezjpi0 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-pVRffwESU1ezjpi0 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-pVRffwESU1ezjpi0 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-pVRffwESU1ezjpi0 .actorPopupMenu{position:absolute;}#mermaid-svg-pVRffwESU1ezjpi0 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-pVRffwESU1ezjpi0 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-pVRffwESU1ezjpi0 .actor-man circle,#mermaid-svg-pVRffwESU1ezjpi0 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-pVRffwESU1ezjpi0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Phase 1: 构建 Phase 2: 启动 loop每个 informer Phase 3: 初始 List + Watch Phase 4: 消费循环 loopprocessLoop Phase 5: 等待同步 NewSharedInformerFactory(client, resync)保存 client + defaultResyncfactory.CoreV1().Pods()&podInformer{factory}Informer() (lazy 触发)NewSharedIndexInformer(lw, &v1.Pod{}, resync, indexers)newQueueFIFO() → DeltaFIFO / RealFIFONewIndexer(keyFunc, indexers)New(&Config{Queue, Process, ListerWatcher, ...})newSharedProcessor()informersgvr = SIfactory.Start(ctx)RunWithContext(ctx)Controller.RunWithContext(ctx)NewReflectorWithOptions(lw, objType, queue, opts)go r.RunWithContext(ctx) --- 启动 Reflector 协程sharedProcessor.run(ctx) --- 启动所有 listenerListAndWatch(ctx)Queue.Replace(initialList, rv)Queue.Pop()DeltasConfig.Process(obj) → handleDeltasStore.Add/Update/Deletedistribute(notification)add(notification)factory.WaitForCacheSync(ctx)HasSynced()HasSynced()Queue.HasSynced()
3.2.2 REST 请求全链路
kube-apiserver HTTP Connection RoundTripper Chain Transport RateLimiter withRetry Request Builder RESTClient gentype.Client Typed Client (PodInterface) 用户代码 kube-apiserver HTTP Connection RoundTripper Chain Transport RateLimiter withRetry Request Builder RESTClient gentype.Client Typed Client (PodInterface) 用户代码 #mermaid-svg-bRGxZKOKxBkpGuit{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bRGxZKOKxBkpGuit .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bRGxZKOKxBkpGuit .error-icon{fill:#552222;}#mermaid-svg-bRGxZKOKxBkpGuit .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bRGxZKOKxBkpGuit .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bRGxZKOKxBkpGuit .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bRGxZKOKxBkpGuit .marker.cross{stroke:#333333;}#mermaid-svg-bRGxZKOKxBkpGuit svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bRGxZKOKxBkpGuit p{margin:0;}#mermaid-svg-bRGxZKOKxBkpGuit .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bRGxZKOKxBkpGuit text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-bRGxZKOKxBkpGuit .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bRGxZKOKxBkpGuit .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-bRGxZKOKxBkpGuit .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-bRGxZKOKxBkpGuit .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-bRGxZKOKxBkpGuit #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-bRGxZKOKxBkpGuit .sequenceNumber{fill:white;}#mermaid-svg-bRGxZKOKxBkpGuit #sequencenumber{fill:#333;}#mermaid-svg-bRGxZKOKxBkpGuit #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-bRGxZKOKxBkpGuit .messageText{fill:#333;stroke:none;}#mermaid-svg-bRGxZKOKxBkpGuit .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bRGxZKOKxBkpGuit .labelText,#mermaid-svg-bRGxZKOKxBkpGuit .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-bRGxZKOKxBkpGuit .loopText,#mermaid-svg-bRGxZKOKxBkpGuit .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-bRGxZKOKxBkpGuit .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bRGxZKOKxBkpGuit .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-bRGxZKOKxBkpGuit .noteText,#mermaid-svg-bRGxZKOKxBkpGuit .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-bRGxZKOKxBkpGuit .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bRGxZKOKxBkpGuit .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bRGxZKOKxBkpGuit .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bRGxZKOKxBkpGuit .actorPopupMenu{position:absolute;}#mermaid-svg-bRGxZKOKxBkpGuit .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-bRGxZKOKxBkpGuit .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bRGxZKOKxBkpGuit .actor-man circle,#mermaid-svg-bRGxZKOKxBkpGuit line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-bRGxZKOKxBkpGuit :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} cs.CoreV1().Pods("default").Create(ctx, pod, opts)Client.Create(ctx, pod, opts)restClient.Post()Verb("POST").Resource("pods").Namespace("default").Body(pod)构建 URL: /api/v1/namespaces/default/pods序列化 Body: runtime.Encode(pod) → JSON/CBOR设置 Content-Type: application/jsonwithRetry.Run()RateLimiter.Accept() --- 等待令牌通过Transport.RoundTrip(httpRequest)认证 RoundTripper → 注入 Authorization: Bearer <token>UserAgent RoundTripper → 注入 User-AgentTLS 握手 + HTTP POSTPOST /api/v1/namespaces/default/pods201 Created + JSON Bodyhttp.Responsehttp.Responsehttp.Response检查是否需要重试 (5xx, 429, 连接错误)http.Responseruntime.Decode(response.Body) → *v1.Pod(*v1.Pod, error)(*v1.Pod, error)
3.2.3 Discovery + RESTMapper 全链路
kube-apiserver RESTClient DiscoveryClient CachedDiscoveryInterface DeferredDiscoveryRESTMapper 用户代码 kube-apiserver RESTClient DiscoveryClient CachedDiscoveryInterface DeferredDiscoveryRESTMapper 用户代码 #mermaid-svg-ng6CXlc9ifVMuvuo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ng6CXlc9ifVMuvuo .error-icon{fill:#552222;}#mermaid-svg-ng6CXlc9ifVMuvuo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ng6CXlc9ifVMuvuo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ng6CXlc9ifVMuvuo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ng6CXlc9ifVMuvuo .marker.cross{stroke:#333333;}#mermaid-svg-ng6CXlc9ifVMuvuo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ng6CXlc9ifVMuvuo p{margin:0;}#mermaid-svg-ng6CXlc9ifVMuvuo .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ng6CXlc9ifVMuvuo text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ng6CXlc9ifVMuvuo .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-ng6CXlc9ifVMuvuo .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-ng6CXlc9ifVMuvuo #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-ng6CXlc9ifVMuvuo .sequenceNumber{fill:white;}#mermaid-svg-ng6CXlc9ifVMuvuo #sequencenumber{fill:#333;}#mermaid-svg-ng6CXlc9ifVMuvuo #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-ng6CXlc9ifVMuvuo .messageText{fill:#333;stroke:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ng6CXlc9ifVMuvuo .labelText,#mermaid-svg-ng6CXlc9ifVMuvuo .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .loopText,#mermaid-svg-ng6CXlc9ifVMuvuo .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ng6CXlc9ifVMuvuo .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ng6CXlc9ifVMuvuo .noteText,#mermaid-svg-ng6CXlc9ifVMuvuo .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-ng6CXlc9ifVMuvuo .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ng6CXlc9ifVMuvuo .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ng6CXlc9ifVMuvuo .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ng6CXlc9ifVMuvuo .actorPopupMenu{position:absolute;}#mermaid-svg-ng6CXlc9ifVMuvuo .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-ng6CXlc9ifVMuvuo .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ng6CXlc9ifVMuvuo .actor-man circle,#mermaid-svg-ng6CXlc9ifVMuvuo line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-ng6CXlc9ifVMuvuo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} alt缓存未过期缓存过期/为空 RESTMapping(gvk)ServerGroups()检查缓存缓存的 APIGroupListServerGroups()GET /api + GET /apisHTTP GETAPIGroupList JSONAPIGroupList缓存结果APIGroupListAPIGroupListServerResourcesForGroupVersion(gv)GET /apis/apps/v1GET /apis/apps/v1HTTP GETAPIResourceListAPIResourceListAPIResourceList根据 GroupVersion + ResourceKind构建 RESTMappingRESTMapping{Resource, GroupVersionResource, Scope}
3.2.4 Leader Election 全链路
kube-apiserver RESTClient LeaderLock (Lease/ConfigMap/Endpoint) LeaderElector 用户代码 kube-apiserver RESTClient LeaderLock (Lease/ConfigMap/Endpoint) LeaderElector 用户代码 #mermaid-svg-egdM5lLBldwV3RFQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-egdM5lLBldwV3RFQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-egdM5lLBldwV3RFQ .error-icon{fill:#552222;}#mermaid-svg-egdM5lLBldwV3RFQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-egdM5lLBldwV3RFQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-egdM5lLBldwV3RFQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-egdM5lLBldwV3RFQ .marker.cross{stroke:#333333;}#mermaid-svg-egdM5lLBldwV3RFQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-egdM5lLBldwV3RFQ p{margin:0;}#mermaid-svg-egdM5lLBldwV3RFQ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-egdM5lLBldwV3RFQ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-egdM5lLBldwV3RFQ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-egdM5lLBldwV3RFQ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-egdM5lLBldwV3RFQ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-egdM5lLBldwV3RFQ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-egdM5lLBldwV3RFQ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-egdM5lLBldwV3RFQ .sequenceNumber{fill:white;}#mermaid-svg-egdM5lLBldwV3RFQ #sequencenumber{fill:#333;}#mermaid-svg-egdM5lLBldwV3RFQ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-egdM5lLBldwV3RFQ .messageText{fill:#333;stroke:none;}#mermaid-svg-egdM5lLBldwV3RFQ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-egdM5lLBldwV3RFQ .labelText,#mermaid-svg-egdM5lLBldwV3RFQ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-egdM5lLBldwV3RFQ .loopText,#mermaid-svg-egdM5lLBldwV3RFQ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-egdM5lLBldwV3RFQ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-egdM5lLBldwV3RFQ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-egdM5lLBldwV3RFQ .noteText,#mermaid-svg-egdM5lLBldwV3RFQ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-egdM5lLBldwV3RFQ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-egdM5lLBldwV3RFQ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-egdM5lLBldwV3RFQ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-egdM5lLBldwV3RFQ .actorPopupMenu{position:absolute;}#mermaid-svg-egdM5lLBldwV3RFQ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-egdM5lLBldwV3RFQ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-egdM5lLBldwV3RFQ .actor-man circle,#mermaid-svg-egdM5lLBldwV3RFQ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-egdM5lLBldwV3RFQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} alt锁不存在 或 当前 identity 是 leader其他 identity 持有锁 loop尝试获取锁 alt成功失败 loop持续续约 ctx 取消 → 释放锁 → 退出 Run(ctx, onStartedLeading, onStoppedLeading)acquire(ctx)Get(lease)GET /apis/coordination.k8s.io/v1/namespaces/ns/leases/my-lockHTTP GETLease 对象 (或 404)Create/Update(lease with new renewTime)PUT /apis/.../leases/my-lockHTTP PUT200 OK成功获取锁等待 RetryPeriodonStartedLeading(ctx)renew(ctx)Update(lease with new renewTime)PUTHTTP PUTOK等待 RenewDeadline尝试重新获取onStoppedLeading()
3.2.5 Event Record 全链路
SINK CORR kube-apiserver RESTClient CORR correlator SINK EventSink EventRecorder Controller 调谐逻辑 SINK CORR kube-apiserver RESTClient CORR correlator SINK EventSink EventRecorder Controller 调谐逻辑 #mermaid-svg-DRX9xjXNrvEgy6Nz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DRX9xjXNrvEgy6Nz .error-icon{fill:#552222;}#mermaid-svg-DRX9xjXNrvEgy6Nz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DRX9xjXNrvEgy6Nz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DRX9xjXNrvEgy6Nz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DRX9xjXNrvEgy6Nz .marker.cross{stroke:#333333;}#mermaid-svg-DRX9xjXNrvEgy6Nz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DRX9xjXNrvEgy6Nz p{margin:0;}#mermaid-svg-DRX9xjXNrvEgy6Nz .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DRX9xjXNrvEgy6Nz text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-DRX9xjXNrvEgy6Nz .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-DRX9xjXNrvEgy6Nz .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-DRX9xjXNrvEgy6Nz #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-DRX9xjXNrvEgy6Nz .sequenceNumber{fill:white;}#mermaid-svg-DRX9xjXNrvEgy6Nz #sequencenumber{fill:#333;}#mermaid-svg-DRX9xjXNrvEgy6Nz #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-DRX9xjXNrvEgy6Nz .messageText{fill:#333;stroke:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DRX9xjXNrvEgy6Nz .labelText,#mermaid-svg-DRX9xjXNrvEgy6Nz .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .loopText,#mermaid-svg-DRX9xjXNrvEgy6Nz .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-DRX9xjXNrvEgy6Nz .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-DRX9xjXNrvEgy6Nz .noteText,#mermaid-svg-DRX9xjXNrvEgy6Nz .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-DRX9xjXNrvEgy6Nz .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DRX9xjXNrvEgy6Nz .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DRX9xjXNrvEgy6Nz .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-DRX9xjXNrvEgy6Nz .actorPopupMenu{position:absolute;}#mermaid-svg-DRX9xjXNrvEgy6Nz .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-DRX9xjXNrvEgy6Nz .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-DRX9xjXNrvEgy6Nz .actor-man circle,#mermaid-svg-DRX9xjXNrvEgy6Nz line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-DRX9xjXNrvEgy6Nz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} alt409 Conflict (事件已存在) alt相同事件已在聚合窗口内新事件或窗口过期 Eventf(obj, EventTypeNormal, "Created", "Pod %s created", name)correlate(event)增加计数,不发新事件Create(event)POST /api/v1/namespaces/ns/eventsHTTP POSTEvent 对象PUT /api/v1/namespaces/ns/events/event-nameHTTP PUT (更新 Count)更新后的 Event
3.3 模块间数据传递矩阵
3.3.1 数据类型传递
#mermaid-svg-qA5yg4Rk71AO6ozz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qA5yg4Rk71AO6ozz .error-icon{fill:#552222;}#mermaid-svg-qA5yg4Rk71AO6ozz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qA5yg4Rk71AO6ozz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qA5yg4Rk71AO6ozz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qA5yg4Rk71AO6ozz .marker.cross{stroke:#333333;}#mermaid-svg-qA5yg4Rk71AO6ozz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qA5yg4Rk71AO6ozz p{margin:0;}#mermaid-svg-qA5yg4Rk71AO6ozz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz .cluster-label text{fill:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz .cluster-label span{color:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz .cluster-label span p{background-color:transparent;}#mermaid-svg-qA5yg4Rk71AO6ozz .label text,#mermaid-svg-qA5yg4Rk71AO6ozz span{fill:#333;color:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz .node rect,#mermaid-svg-qA5yg4Rk71AO6ozz .node circle,#mermaid-svg-qA5yg4Rk71AO6ozz .node ellipse,#mermaid-svg-qA5yg4Rk71AO6ozz .node polygon,#mermaid-svg-qA5yg4Rk71AO6ozz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qA5yg4Rk71AO6ozz .rough-node .label text,#mermaid-svg-qA5yg4Rk71AO6ozz .node .label text,#mermaid-svg-qA5yg4Rk71AO6ozz .image-shape .label,#mermaid-svg-qA5yg4Rk71AO6ozz .icon-shape .label{text-anchor:middle;}#mermaid-svg-qA5yg4Rk71AO6ozz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qA5yg4Rk71AO6ozz .rough-node .label,#mermaid-svg-qA5yg4Rk71AO6ozz .node .label,#mermaid-svg-qA5yg4Rk71AO6ozz .image-shape .label,#mermaid-svg-qA5yg4Rk71AO6ozz .icon-shape .label{text-align:center;}#mermaid-svg-qA5yg4Rk71AO6ozz .node.clickable{cursor:pointer;}#mermaid-svg-qA5yg4Rk71AO6ozz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qA5yg4Rk71AO6ozz .arrowheadPath{fill:#333333;}#mermaid-svg-qA5yg4Rk71AO6ozz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qA5yg4Rk71AO6ozz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qA5yg4Rk71AO6ozz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qA5yg4Rk71AO6ozz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qA5yg4Rk71AO6ozz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qA5yg4Rk71AO6ozz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qA5yg4Rk71AO6ozz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qA5yg4Rk71AO6ozz .cluster text{fill:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz .cluster span{color:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qA5yg4Rk71AO6ozz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qA5yg4Rk71AO6ozz rect.text{fill:none;stroke-width:0;}#mermaid-svg-qA5yg4Rk71AO6ozz .icon-shape,#mermaid-svg-qA5yg4Rk71AO6ozz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qA5yg4Rk71AO6ozz .icon-shape p,#mermaid-svg-qA5yg4Rk71AO6ozz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qA5yg4Rk71AO6ozz .icon-shape .label rect,#mermaid-svg-qA5yg4Rk71AO6ozz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qA5yg4Rk71AO6ozz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qA5yg4Rk71AO6ozz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qA5yg4Rk71AO6ozz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} WorkQueue 层
Informer 层
REST 层
HTTP 层
Decode
Decode Watch
Store.Add
Reflector
handleDeltas
Handler
Queue.Add
HTTP Request/Response
JSON / CBOR / Protobuf
runtime.Object
(类型化对象)
watch.Event
(Added/Modified/Deleted/Bookmark)
Deltas
(Delta 列表)
notification
(add/update/delete)
string Key
(namespace/name)
3.3.2 数据传递详细表
| 源模块 | 目标模块 | 数据类型 | 传递方式 | 说明 |
|---|---|---|---|---|
| kube-apiserver | rest | HTTP Response | HTTP GET/POST/PUT/DELETE/PATCH | JSON/CBOR/Protobuf |
| rest | dynamic | *unstructured.Unstructured |
函数返回值 | Dynamic Client |
| rest | kubernetes/typed | *corev1.Pod 等 |
函数返回值 | 强类型 Client |
| rest | tools/cache (ListWatch) | runtime.Object + watch.Interface |
ListerWatcher 接口 |
ListAndWatch |
| tools/cache (Reflector) | DeltaFIFO | Delta{Type, Object} |
Queue.Add/Update/Delete |
增量事件 |
| DeltaFIFO | Controller | Deltas (Delta 列表) |
Queue.Pop |
批量弹出 |
| Controller | Store | interface{} (对象) |
Store.Add/Update/Delete |
缓存更新 |
| Controller | sharedProcessor | notification{type, obj} |
distribute() |
事件分发 |
| sharedProcessor | processorListener | notification |
add() → RingGrowing |
异步通知 |
| processorListener | ResourceEventHandler | interface{} |
OnAdd/OnUpdate/OnDelete |
用户回调 |
| ResourceEventHandler | WorkQueue | string (key) |
queue.Add(key) |
入队 |
| WorkQueue | 用户 Controller | string (key) |
queue.Get() |
出队调谐 |
| discovery | restmapper | APIGroupResources[] |
函数参数 | API 发现结果 |
| discovery | scale | GroupVersionResource |
接口调用 | 资源发现 |
3.4 主流程深度解析
3.4.1 主流程一:Informer-Controller-WorkQueue 调谐循环
这是 Kubernetes Controller 的标准编程模式,也是 client-go 最核心的使用模式:
#mermaid-svg-4VillWgx6UJPOxna{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4VillWgx6UJPOxna .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4VillWgx6UJPOxna .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4VillWgx6UJPOxna .error-icon{fill:#552222;}#mermaid-svg-4VillWgx6UJPOxna .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4VillWgx6UJPOxna .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4VillWgx6UJPOxna .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4VillWgx6UJPOxna .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4VillWgx6UJPOxna .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4VillWgx6UJPOxna .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4VillWgx6UJPOxna .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4VillWgx6UJPOxna .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4VillWgx6UJPOxna .marker.cross{stroke:#333333;}#mermaid-svg-4VillWgx6UJPOxna svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4VillWgx6UJPOxna p{margin:0;}#mermaid-svg-4VillWgx6UJPOxna .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4VillWgx6UJPOxna .cluster-label text{fill:#333;}#mermaid-svg-4VillWgx6UJPOxna .cluster-label span{color:#333;}#mermaid-svg-4VillWgx6UJPOxna .cluster-label span p{background-color:transparent;}#mermaid-svg-4VillWgx6UJPOxna .label text,#mermaid-svg-4VillWgx6UJPOxna span{fill:#333;color:#333;}#mermaid-svg-4VillWgx6UJPOxna .node rect,#mermaid-svg-4VillWgx6UJPOxna .node circle,#mermaid-svg-4VillWgx6UJPOxna .node ellipse,#mermaid-svg-4VillWgx6UJPOxna .node polygon,#mermaid-svg-4VillWgx6UJPOxna .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4VillWgx6UJPOxna .rough-node .label text,#mermaid-svg-4VillWgx6UJPOxna .node .label text,#mermaid-svg-4VillWgx6UJPOxna .image-shape .label,#mermaid-svg-4VillWgx6UJPOxna .icon-shape .label{text-anchor:middle;}#mermaid-svg-4VillWgx6UJPOxna .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4VillWgx6UJPOxna .rough-node .label,#mermaid-svg-4VillWgx6UJPOxna .node .label,#mermaid-svg-4VillWgx6UJPOxna .image-shape .label,#mermaid-svg-4VillWgx6UJPOxna .icon-shape .label{text-align:center;}#mermaid-svg-4VillWgx6UJPOxna .node.clickable{cursor:pointer;}#mermaid-svg-4VillWgx6UJPOxna .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4VillWgx6UJPOxna .arrowheadPath{fill:#333333;}#mermaid-svg-4VillWgx6UJPOxna .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4VillWgx6UJPOxna .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4VillWgx6UJPOxna .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4VillWgx6UJPOxna .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4VillWgx6UJPOxna .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4VillWgx6UJPOxna .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4VillWgx6UJPOxna .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4VillWgx6UJPOxna .cluster text{fill:#333;}#mermaid-svg-4VillWgx6UJPOxna .cluster span{color:#333;}#mermaid-svg-4VillWgx6UJPOxna div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4VillWgx6UJPOxna .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4VillWgx6UJPOxna rect.text{fill:none;stroke-width:0;}#mermaid-svg-4VillWgx6UJPOxna .icon-shape,#mermaid-svg-4VillWgx6UJPOxna .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4VillWgx6UJPOxna .icon-shape p,#mermaid-svg-4VillWgx6UJPOxna .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4VillWgx6UJPOxna .icon-shape .label rect,#mermaid-svg-4VillWgx6UJPOxna .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4VillWgx6UJPOxna .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4VillWgx6UJPOxna .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4VillWgx6UJPOxna :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Phase 3: 用户调谐
Phase 2: 运行时循环
Phase 1: 初始化
触发 Watch 事件
NewSharedInformerFactory(client, resync)
factory.CoreV1().Pods().Informer()
AddEventHandler(handler)
factory.Start(stopCh)
factory.WaitForCacheSync(stopCh)
Reflector: ListAndWatch
DeltaFIFO: Enqueue Deltas
processLoop: Pop + handleDeltas
Store: Update Cache
sharedProcessor: distribute
processorListener: pop + run
EventHandler: OnAdd/OnUpdate/OnDelete
WorkQueue: Add(key)
WorkQueue: Get(key)
Indexer: GetByKey(key) → obj
调谐逻辑: 计算期望状态
Typed Client: Create/Update/Delete
输入 :kube-apiserver 的资源变化事件流(Watch Event Stream)
输出:用户 Controller 的调谐动作(REST 请求回 API Server)
3.4.2 主流程二:Dynamic Client + DynamicInformer + CRD
当操作自定义资源(CRD)时,使用 Dynamic 客户端:
#mermaid-svg-dnPXUSKzHCAc08TL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dnPXUSKzHCAc08TL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dnPXUSKzHCAc08TL .error-icon{fill:#552222;}#mermaid-svg-dnPXUSKzHCAc08TL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dnPXUSKzHCAc08TL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dnPXUSKzHCAc08TL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dnPXUSKzHCAc08TL .marker.cross{stroke:#333333;}#mermaid-svg-dnPXUSKzHCAc08TL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dnPXUSKzHCAc08TL p{margin:0;}#mermaid-svg-dnPXUSKzHCAc08TL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dnPXUSKzHCAc08TL .cluster-label text{fill:#333;}#mermaid-svg-dnPXUSKzHCAc08TL .cluster-label span{color:#333;}#mermaid-svg-dnPXUSKzHCAc08TL .cluster-label span p{background-color:transparent;}#mermaid-svg-dnPXUSKzHCAc08TL .label text,#mermaid-svg-dnPXUSKzHCAc08TL span{fill:#333;color:#333;}#mermaid-svg-dnPXUSKzHCAc08TL .node rect,#mermaid-svg-dnPXUSKzHCAc08TL .node circle,#mermaid-svg-dnPXUSKzHCAc08TL .node ellipse,#mermaid-svg-dnPXUSKzHCAc08TL .node polygon,#mermaid-svg-dnPXUSKzHCAc08TL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dnPXUSKzHCAc08TL .rough-node .label text,#mermaid-svg-dnPXUSKzHCAc08TL .node .label text,#mermaid-svg-dnPXUSKzHCAc08TL .image-shape .label,#mermaid-svg-dnPXUSKzHCAc08TL .icon-shape .label{text-anchor:middle;}#mermaid-svg-dnPXUSKzHCAc08TL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dnPXUSKzHCAc08TL .rough-node .label,#mermaid-svg-dnPXUSKzHCAc08TL .node .label,#mermaid-svg-dnPXUSKzHCAc08TL .image-shape .label,#mermaid-svg-dnPXUSKzHCAc08TL .icon-shape .label{text-align:center;}#mermaid-svg-dnPXUSKzHCAc08TL .node.clickable{cursor:pointer;}#mermaid-svg-dnPXUSKzHCAc08TL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dnPXUSKzHCAc08TL .arrowheadPath{fill:#333333;}#mermaid-svg-dnPXUSKzHCAc08TL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dnPXUSKzHCAc08TL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dnPXUSKzHCAc08TL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dnPXUSKzHCAc08TL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dnPXUSKzHCAc08TL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dnPXUSKzHCAc08TL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dnPXUSKzHCAc08TL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dnPXUSKzHCAc08TL .cluster text{fill:#333;}#mermaid-svg-dnPXUSKzHCAc08TL .cluster span{color:#333;}#mermaid-svg-dnPXUSKzHCAc08TL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dnPXUSKzHCAc08TL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dnPXUSKzHCAc08TL rect.text{fill:none;stroke-width:0;}#mermaid-svg-dnPXUSKzHCAc08TL .icon-shape,#mermaid-svg-dnPXUSKzHCAc08TL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dnPXUSKzHCAc08TL .icon-shape p,#mermaid-svg-dnPXUSKzHCAc08TL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dnPXUSKzHCAc08TL .icon-shape .label rect,#mermaid-svg-dnPXUSKzHCAc08TL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dnPXUSKzHCAc08TL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dnPXUSKzHCAc08TL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dnPXUSKzHCAc08TL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调谐
运行
初始化
dynamic.NewForConfig(cfg)
dynamicinformer.NewDynamicSharedInformerFactory(client, resync)
factory.ForResource(gvr).Informer()
AddEventHandler(handler)
factory.Start(ctx)
Watch → DeltaFIFO → handleDeltas
unstructured.Unstructured → OnAdd/OnUpdate/OnDelete
dynamicClient.Resource(gvr).Namespace(ns).Update(ctx, obj, opts)
输入 :CRD 的 GVR(GroupVersionResource)和 unstructured.Unstructured 对象
输出:Dynamic Client 的 Create/Update/Delete/Patch/Apply 操作
3.4.3 主流程三:Discovery + RESTMapper 自动发现
当需要运行时发现 API 资源或进行 GVR↔GVK 转换时:
#mermaid-svg-pMpy78pLhfBZ2MwH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pMpy78pLhfBZ2MwH .error-icon{fill:#552222;}#mermaid-svg-pMpy78pLhfBZ2MwH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pMpy78pLhfBZ2MwH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pMpy78pLhfBZ2MwH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pMpy78pLhfBZ2MwH .marker.cross{stroke:#333333;}#mermaid-svg-pMpy78pLhfBZ2MwH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pMpy78pLhfBZ2MwH p{margin:0;}#mermaid-svg-pMpy78pLhfBZ2MwH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH .cluster-label text{fill:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH .cluster-label span{color:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH .cluster-label span p{background-color:transparent;}#mermaid-svg-pMpy78pLhfBZ2MwH .label text,#mermaid-svg-pMpy78pLhfBZ2MwH span{fill:#333;color:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH .node rect,#mermaid-svg-pMpy78pLhfBZ2MwH .node circle,#mermaid-svg-pMpy78pLhfBZ2MwH .node ellipse,#mermaid-svg-pMpy78pLhfBZ2MwH .node polygon,#mermaid-svg-pMpy78pLhfBZ2MwH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pMpy78pLhfBZ2MwH .rough-node .label text,#mermaid-svg-pMpy78pLhfBZ2MwH .node .label text,#mermaid-svg-pMpy78pLhfBZ2MwH .image-shape .label,#mermaid-svg-pMpy78pLhfBZ2MwH .icon-shape .label{text-anchor:middle;}#mermaid-svg-pMpy78pLhfBZ2MwH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pMpy78pLhfBZ2MwH .rough-node .label,#mermaid-svg-pMpy78pLhfBZ2MwH .node .label,#mermaid-svg-pMpy78pLhfBZ2MwH .image-shape .label,#mermaid-svg-pMpy78pLhfBZ2MwH .icon-shape .label{text-align:center;}#mermaid-svg-pMpy78pLhfBZ2MwH .node.clickable{cursor:pointer;}#mermaid-svg-pMpy78pLhfBZ2MwH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pMpy78pLhfBZ2MwH .arrowheadPath{fill:#333333;}#mermaid-svg-pMpy78pLhfBZ2MwH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pMpy78pLhfBZ2MwH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pMpy78pLhfBZ2MwH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pMpy78pLhfBZ2MwH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pMpy78pLhfBZ2MwH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pMpy78pLhfBZ2MwH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pMpy78pLhfBZ2MwH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pMpy78pLhfBZ2MwH .cluster text{fill:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH .cluster span{color:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pMpy78pLhfBZ2MwH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pMpy78pLhfBZ2MwH rect.text{fill:none;stroke-width:0;}#mermaid-svg-pMpy78pLhfBZ2MwH .icon-shape,#mermaid-svg-pMpy78pLhfBZ2MwH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pMpy78pLhfBZ2MwH .icon-shape p,#mermaid-svg-pMpy78pLhfBZ2MwH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pMpy78pLhfBZ2MwH .icon-shape .label rect,#mermaid-svg-pMpy78pLhfBZ2MwH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pMpy78pLhfBZ2MwH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pMpy78pLhfBZ2MwH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pMpy78pLhfBZ2MwH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RESTMapper 映射
Discovery 发现
discovery.NewDiscoveryClientForConfig(cfg)
discovery.ServerGroups()
discovery.ServerResourcesForGroupVersion(gv)
缓存结果 (CachedDiscovery)
restmapper.NewDeferredDiscoveryRESTMapper(cached)
RESTMapping(gvk) → RESTMapping
KindFor(gvr) → GVK
ResourceFor(gvk) → GVR
输入 :kube-apiserver 的 API 发现端点(/api, /apis, /openapi/v2)
输出:GVK↔GVR 映射关系,REST 路径信息
第四章 基础设施与辅助模块
4.1 features/ --- 特性门控
核心作用
client-go 自身的特性门控系统,控制新功能的启用/禁用,不依赖 Kubernetes 组件级别的 feature-gate。
关键特性门控
| Feature | 默认值 | 阶段 | 影响 |
|---|---|---|---|
InOrderInformers |
false | Alpha | 启用 RealFIFO(替代 DeltaFIFO),支持批量处理 |
InOrderInformersBatchProcess |
false | Alpha | 启用 ProcessBatch 批量事务处理 |
AtomicFIFO |
false | Alpha | RealFIFO 原子事件模式 |
UnlockWhileProcessingFIFO |
false | Alpha | RealFIFO 处理时释放锁 |
WatchListClient |
false | Alpha | 使用 WatchList 替代初始 List |
ClientsAllowCBOR |
false | Alpha | 客户端支持 CBOR 编码 |
ClientsPreferCBOR |
false | Alpha | 客户端优先使用 CBOR |
特性门控影响链
#mermaid-svg-XamKTKbzEYgdVjgi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XamKTKbzEYgdVjgi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XamKTKbzEYgdVjgi .error-icon{fill:#552222;}#mermaid-svg-XamKTKbzEYgdVjgi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XamKTKbzEYgdVjgi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XamKTKbzEYgdVjgi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XamKTKbzEYgdVjgi .marker.cross{stroke:#333333;}#mermaid-svg-XamKTKbzEYgdVjgi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XamKTKbzEYgdVjgi p{margin:0;}#mermaid-svg-XamKTKbzEYgdVjgi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XamKTKbzEYgdVjgi .cluster-label text{fill:#333;}#mermaid-svg-XamKTKbzEYgdVjgi .cluster-label span{color:#333;}#mermaid-svg-XamKTKbzEYgdVjgi .cluster-label span p{background-color:transparent;}#mermaid-svg-XamKTKbzEYgdVjgi .label text,#mermaid-svg-XamKTKbzEYgdVjgi span{fill:#333;color:#333;}#mermaid-svg-XamKTKbzEYgdVjgi .node rect,#mermaid-svg-XamKTKbzEYgdVjgi .node circle,#mermaid-svg-XamKTKbzEYgdVjgi .node ellipse,#mermaid-svg-XamKTKbzEYgdVjgi .node polygon,#mermaid-svg-XamKTKbzEYgdVjgi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XamKTKbzEYgdVjgi .rough-node .label text,#mermaid-svg-XamKTKbzEYgdVjgi .node .label text,#mermaid-svg-XamKTKbzEYgdVjgi .image-shape .label,#mermaid-svg-XamKTKbzEYgdVjgi .icon-shape .label{text-anchor:middle;}#mermaid-svg-XamKTKbzEYgdVjgi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XamKTKbzEYgdVjgi .rough-node .label,#mermaid-svg-XamKTKbzEYgdVjgi .node .label,#mermaid-svg-XamKTKbzEYgdVjgi .image-shape .label,#mermaid-svg-XamKTKbzEYgdVjgi .icon-shape .label{text-align:center;}#mermaid-svg-XamKTKbzEYgdVjgi .node.clickable{cursor:pointer;}#mermaid-svg-XamKTKbzEYgdVjgi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XamKTKbzEYgdVjgi .arrowheadPath{fill:#333333;}#mermaid-svg-XamKTKbzEYgdVjgi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XamKTKbzEYgdVjgi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XamKTKbzEYgdVjgi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XamKTKbzEYgdVjgi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XamKTKbzEYgdVjgi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XamKTKbzEYgdVjgi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XamKTKbzEYgdVjgi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XamKTKbzEYgdVjgi .cluster text{fill:#333;}#mermaid-svg-XamKTKbzEYgdVjgi .cluster span{color:#333;}#mermaid-svg-XamKTKbzEYgdVjgi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XamKTKbzEYgdVjgi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XamKTKbzEYgdVjgi rect.text{fill:none;stroke-width:0;}#mermaid-svg-XamKTKbzEYgdVjgi .icon-shape,#mermaid-svg-XamKTKbzEYgdVjgi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XamKTKbzEYgdVjgi .icon-shape p,#mermaid-svg-XamKTKbzEYgdVjgi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XamKTKbzEYgdVjgi .icon-shape .label rect,#mermaid-svg-XamKTKbzEYgdVjgi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XamKTKbzEYgdVjgi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XamKTKbzEYgdVjgi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XamKTKbzEYgdVjgi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 选择 RealFIFO
替代 DeltaFIFO
RealFIFO 原子模式
不传 KnownObjects
RealFIFO 处理时
释放 Store 锁
Controller 批量处理
PopBatch + ProcessBatch
Reflector 初始同步
使用 WatchList
Accept: application/cbor
Content-Type: application/cbor
InOrderInformers
AtomicFIFO
UnlockWhileProcessingFIFO
InOrderInformersBatchProcess
WatchListClient
ClientsAllowCBOR
ClientsPreferCBOR
newQueueFIFO()
processLoop
Reflector.ListAndWatch
Request Content Negotiation
4.2 testing/ --- Fake 客户端框架
核心作用
提供 Fake 客户端用于单元测试,无需真实 API Server。
Fake 客户端架构
#mermaid-svg-pZWqh49MgQxjfYPd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pZWqh49MgQxjfYPd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pZWqh49MgQxjfYPd .error-icon{fill:#552222;}#mermaid-svg-pZWqh49MgQxjfYPd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pZWqh49MgQxjfYPd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pZWqh49MgQxjfYPd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pZWqh49MgQxjfYPd .marker.cross{stroke:#333333;}#mermaid-svg-pZWqh49MgQxjfYPd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pZWqh49MgQxjfYPd p{margin:0;}#mermaid-svg-pZWqh49MgQxjfYPd g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-pZWqh49MgQxjfYPd g.classGroup text .title{font-weight:bolder;}#mermaid-svg-pZWqh49MgQxjfYPd .cluster-label text{fill:#333;}#mermaid-svg-pZWqh49MgQxjfYPd .cluster-label span{color:#333;}#mermaid-svg-pZWqh49MgQxjfYPd .cluster-label span p{background-color:transparent;}#mermaid-svg-pZWqh49MgQxjfYPd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pZWqh49MgQxjfYPd .cluster text{fill:#333;}#mermaid-svg-pZWqh49MgQxjfYPd .cluster span{color:#333;}#mermaid-svg-pZWqh49MgQxjfYPd .nodeLabel,#mermaid-svg-pZWqh49MgQxjfYPd .edgeLabel{color:#131300;}#mermaid-svg-pZWqh49MgQxjfYPd .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-pZWqh49MgQxjfYPd .label text{fill:#131300;}#mermaid-svg-pZWqh49MgQxjfYPd .labelBkg{background:#ECECFF;}#mermaid-svg-pZWqh49MgQxjfYPd .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-pZWqh49MgQxjfYPd .classTitle{font-weight:bolder;}#mermaid-svg-pZWqh49MgQxjfYPd .node rect,#mermaid-svg-pZWqh49MgQxjfYPd .node circle,#mermaid-svg-pZWqh49MgQxjfYPd .node ellipse,#mermaid-svg-pZWqh49MgQxjfYPd .node polygon,#mermaid-svg-pZWqh49MgQxjfYPd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pZWqh49MgQxjfYPd .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd g.clickable{cursor:pointer;}#mermaid-svg-pZWqh49MgQxjfYPd g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-pZWqh49MgQxjfYPd g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-pZWqh49MgQxjfYPd .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-pZWqh49MgQxjfYPd .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-pZWqh49MgQxjfYPd .dashed-line{stroke-dasharray:3;}#mermaid-svg-pZWqh49MgQxjfYPd .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-pZWqh49MgQxjfYPd #compositionStart,#mermaid-svg-pZWqh49MgQxjfYPd .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #compositionEnd,#mermaid-svg-pZWqh49MgQxjfYPd .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #dependencyStart,#mermaid-svg-pZWqh49MgQxjfYPd .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #dependencyStart,#mermaid-svg-pZWqh49MgQxjfYPd .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #extensionStart,#mermaid-svg-pZWqh49MgQxjfYPd .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #extensionEnd,#mermaid-svg-pZWqh49MgQxjfYPd .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #aggregationStart,#mermaid-svg-pZWqh49MgQxjfYPd .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #aggregationEnd,#mermaid-svg-pZWqh49MgQxjfYPd .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #lollipopStart,#mermaid-svg-pZWqh49MgQxjfYPd .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd #lollipopEnd,#mermaid-svg-pZWqh49MgQxjfYPd .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-pZWqh49MgQxjfYPd .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-pZWqh49MgQxjfYPd .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pZWqh49MgQxjfYPd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pZWqh49MgQxjfYPd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pZWqh49MgQxjfYPd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FakeClient
+Tracker() : ObjectTracker
+AddReactor(verb, resource, ReactionFunc)
+PrependReactor(verb, resource, ReactionFunc)
+AddWatchReactor(resource, WatchReactionFunc)
+Invokes(action, defaultReturnObj)(runtime.Object, error)
+InvokesWatch(action)(watch.Interface, error)
ObjectTracker
+Add(obj)
+Get(gvr, ns, name) : runtime.Object
+List(gvr, ns, opts) : runtime.Object
+Update(obj)
+Delete(gvr, ns, name)
+Watch(gvr, ns, opts) : watch.Interface
ReactionFunc
+Invoke(action Action)(bool, runtime.Object, error)
<<interface>>
Action
+GetNamespace() : string
+GetVerb() : string
+GetResource() : schema.GroupVersionResource
+Matches(verb, resource) : bool
Reactor 模式
#mermaid-svg-UsQvsz2Fz3pEItoO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UsQvsz2Fz3pEItoO .error-icon{fill:#552222;}#mermaid-svg-UsQvsz2Fz3pEItoO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UsQvsz2Fz3pEItoO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UsQvsz2Fz3pEItoO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UsQvsz2Fz3pEItoO .marker.cross{stroke:#333333;}#mermaid-svg-UsQvsz2Fz3pEItoO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UsQvsz2Fz3pEItoO p{margin:0;}#mermaid-svg-UsQvsz2Fz3pEItoO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO .cluster-label text{fill:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO .cluster-label span{color:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO .cluster-label span p{background-color:transparent;}#mermaid-svg-UsQvsz2Fz3pEItoO .label text,#mermaid-svg-UsQvsz2Fz3pEItoO span{fill:#333;color:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO .node rect,#mermaid-svg-UsQvsz2Fz3pEItoO .node circle,#mermaid-svg-UsQvsz2Fz3pEItoO .node ellipse,#mermaid-svg-UsQvsz2Fz3pEItoO .node polygon,#mermaid-svg-UsQvsz2Fz3pEItoO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UsQvsz2Fz3pEItoO .rough-node .label text,#mermaid-svg-UsQvsz2Fz3pEItoO .node .label text,#mermaid-svg-UsQvsz2Fz3pEItoO .image-shape .label,#mermaid-svg-UsQvsz2Fz3pEItoO .icon-shape .label{text-anchor:middle;}#mermaid-svg-UsQvsz2Fz3pEItoO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UsQvsz2Fz3pEItoO .rough-node .label,#mermaid-svg-UsQvsz2Fz3pEItoO .node .label,#mermaid-svg-UsQvsz2Fz3pEItoO .image-shape .label,#mermaid-svg-UsQvsz2Fz3pEItoO .icon-shape .label{text-align:center;}#mermaid-svg-UsQvsz2Fz3pEItoO .node.clickable{cursor:pointer;}#mermaid-svg-UsQvsz2Fz3pEItoO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UsQvsz2Fz3pEItoO .arrowheadPath{fill:#333333;}#mermaid-svg-UsQvsz2Fz3pEItoO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UsQvsz2Fz3pEItoO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UsQvsz2Fz3pEItoO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UsQvsz2Fz3pEItoO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UsQvsz2Fz3pEItoO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UsQvsz2Fz3pEItoO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UsQvsz2Fz3pEItoO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UsQvsz2Fz3pEItoO .cluster text{fill:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO .cluster span{color:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UsQvsz2Fz3pEItoO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UsQvsz2Fz3pEItoO rect.text{fill:none;stroke-width:0;}#mermaid-svg-UsQvsz2Fz3pEItoO .icon-shape,#mermaid-svg-UsQvsz2Fz3pEItoO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UsQvsz2Fz3pEItoO .icon-shape p,#mermaid-svg-UsQvsz2Fz3pEItoO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UsQvsz2Fz3pEItoO .icon-shape .label rect,#mermaid-svg-UsQvsz2Fz3pEItoO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UsQvsz2Fz3pEItoO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UsQvsz2Fz3pEItoO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UsQvsz2Fz3pEItoO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Yes
No
Yes
No
FakeClient 调用
Get/List/Create/Update/Delete
PrependReactor
匹配?
AddReactor
匹配?
ObjectTracker
默认行为
ReactionFunc.Invoke()
ReactionFunc.Invoke()
4.3 util/ --- 工具库
子模块清单
| 子模块 | 核心类型 | 作用 |
|---|---|---|
util/workqueue |
TypedInterface[T] |
去重/限流/延迟工作队列 |
util/flowcontrol |
RateLimiter, TokenBucketRateLimiter |
令牌桶限流器 |
util/retry |
OnError, OnConflict |
请求重试工具 |
util/cert |
CertPool, WriteCert |
证书工具 |
util/certificate |
CertificateManager |
证书自动轮转 |
util/connrotation |
Dialer |
连接轮转(关闭旧连接) |
util/consistencydetector |
CheckDataConsistency |
数据一致性检测 |
util/csaupgrade |
UpgradeManagedFields |
客户端侧 Apply → SSA 升级 |
util/exec |
ExecInterface |
远程命令执行 |
util/jsonpath |
JSONPath |
JSONPath 查询 |
util/keyutil |
NewPrivateKey |
密钥生成 |
util/homedir |
HomeDir() |
用户主目录检测 |
util/watchlist |
WatchList() |
WatchList 辅助 |
util/apply |
Apply |
Apply 辅助 |
限流器体系
#mermaid-svg-UaXlP3yEhOhqY8hu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UaXlP3yEhOhqY8hu .error-icon{fill:#552222;}#mermaid-svg-UaXlP3yEhOhqY8hu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UaXlP3yEhOhqY8hu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UaXlP3yEhOhqY8hu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UaXlP3yEhOhqY8hu .marker.cross{stroke:#333333;}#mermaid-svg-UaXlP3yEhOhqY8hu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UaXlP3yEhOhqY8hu p{margin:0;}#mermaid-svg-UaXlP3yEhOhqY8hu g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-UaXlP3yEhOhqY8hu g.classGroup text .title{font-weight:bolder;}#mermaid-svg-UaXlP3yEhOhqY8hu .cluster-label text{fill:#333;}#mermaid-svg-UaXlP3yEhOhqY8hu .cluster-label span{color:#333;}#mermaid-svg-UaXlP3yEhOhqY8hu .cluster-label span p{background-color:transparent;}#mermaid-svg-UaXlP3yEhOhqY8hu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UaXlP3yEhOhqY8hu .cluster text{fill:#333;}#mermaid-svg-UaXlP3yEhOhqY8hu .cluster span{color:#333;}#mermaid-svg-UaXlP3yEhOhqY8hu .nodeLabel,#mermaid-svg-UaXlP3yEhOhqY8hu .edgeLabel{color:#131300;}#mermaid-svg-UaXlP3yEhOhqY8hu .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-UaXlP3yEhOhqY8hu .label text{fill:#131300;}#mermaid-svg-UaXlP3yEhOhqY8hu .labelBkg{background:#ECECFF;}#mermaid-svg-UaXlP3yEhOhqY8hu .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-UaXlP3yEhOhqY8hu .classTitle{font-weight:bolder;}#mermaid-svg-UaXlP3yEhOhqY8hu .node rect,#mermaid-svg-UaXlP3yEhOhqY8hu .node circle,#mermaid-svg-UaXlP3yEhOhqY8hu .node ellipse,#mermaid-svg-UaXlP3yEhOhqY8hu .node polygon,#mermaid-svg-UaXlP3yEhOhqY8hu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UaXlP3yEhOhqY8hu .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu g.clickable{cursor:pointer;}#mermaid-svg-UaXlP3yEhOhqY8hu g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-UaXlP3yEhOhqY8hu g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-UaXlP3yEhOhqY8hu .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-UaXlP3yEhOhqY8hu .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-UaXlP3yEhOhqY8hu .dashed-line{stroke-dasharray:3;}#mermaid-svg-UaXlP3yEhOhqY8hu .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-UaXlP3yEhOhqY8hu #compositionStart,#mermaid-svg-UaXlP3yEhOhqY8hu .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #compositionEnd,#mermaid-svg-UaXlP3yEhOhqY8hu .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #dependencyStart,#mermaid-svg-UaXlP3yEhOhqY8hu .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #dependencyStart,#mermaid-svg-UaXlP3yEhOhqY8hu .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #extensionStart,#mermaid-svg-UaXlP3yEhOhqY8hu .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #extensionEnd,#mermaid-svg-UaXlP3yEhOhqY8hu .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #aggregationStart,#mermaid-svg-UaXlP3yEhOhqY8hu .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #aggregationEnd,#mermaid-svg-UaXlP3yEhOhqY8hu .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #lollipopStart,#mermaid-svg-UaXlP3yEhOhqY8hu .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu #lollipopEnd,#mermaid-svg-UaXlP3yEhOhqY8hu .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UaXlP3yEhOhqY8hu .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-UaXlP3yEhOhqY8hu .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UaXlP3yEhOhqY8hu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UaXlP3yEhOhqY8hu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UaXlP3yEhOhqY8hu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} <<interface>>
RateLimiter
+Wait(ctx) : error
+Allow() : bool
+Reserve() : Reservation
+QPS() : float32
+Stop()
TokenBucketRateLimiter
-limiter *rate.Limiter
-qps float32
AlwaysAllowRateLimiter
FakeRateLimiter
+fakeLimiter int
4.4 transport/ --- 传输层
子模块清单
| 子模块 | 作用 |
|---|---|
transport/transport.go |
TLS 缓存 + Transport 构建 |
transport/round_trippers.go |
认证 RoundTripper 链 |
transport/cache.go |
TLS 配置缓存 |
transport/spdy/ |
SPDY 协议支持(Port Forward / Exec) |
transport/websocket/ |
WebSocket 协议支持 |
RoundTripper 装饰链
#mermaid-svg-rowVYHZyh3b5nzLf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rowVYHZyh3b5nzLf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rowVYHZyh3b5nzLf .error-icon{fill:#552222;}#mermaid-svg-rowVYHZyh3b5nzLf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rowVYHZyh3b5nzLf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rowVYHZyh3b5nzLf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rowVYHZyh3b5nzLf .marker.cross{stroke:#333333;}#mermaid-svg-rowVYHZyh3b5nzLf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rowVYHZyh3b5nzLf p{margin:0;}#mermaid-svg-rowVYHZyh3b5nzLf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rowVYHZyh3b5nzLf .cluster-label text{fill:#333;}#mermaid-svg-rowVYHZyh3b5nzLf .cluster-label span{color:#333;}#mermaid-svg-rowVYHZyh3b5nzLf .cluster-label span p{background-color:transparent;}#mermaid-svg-rowVYHZyh3b5nzLf .label text,#mermaid-svg-rowVYHZyh3b5nzLf span{fill:#333;color:#333;}#mermaid-svg-rowVYHZyh3b5nzLf .node rect,#mermaid-svg-rowVYHZyh3b5nzLf .node circle,#mermaid-svg-rowVYHZyh3b5nzLf .node ellipse,#mermaid-svg-rowVYHZyh3b5nzLf .node polygon,#mermaid-svg-rowVYHZyh3b5nzLf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rowVYHZyh3b5nzLf .rough-node .label text,#mermaid-svg-rowVYHZyh3b5nzLf .node .label text,#mermaid-svg-rowVYHZyh3b5nzLf .image-shape .label,#mermaid-svg-rowVYHZyh3b5nzLf .icon-shape .label{text-anchor:middle;}#mermaid-svg-rowVYHZyh3b5nzLf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rowVYHZyh3b5nzLf .rough-node .label,#mermaid-svg-rowVYHZyh3b5nzLf .node .label,#mermaid-svg-rowVYHZyh3b5nzLf .image-shape .label,#mermaid-svg-rowVYHZyh3b5nzLf .icon-shape .label{text-align:center;}#mermaid-svg-rowVYHZyh3b5nzLf .node.clickable{cursor:pointer;}#mermaid-svg-rowVYHZyh3b5nzLf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rowVYHZyh3b5nzLf .arrowheadPath{fill:#333333;}#mermaid-svg-rowVYHZyh3b5nzLf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rowVYHZyh3b5nzLf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rowVYHZyh3b5nzLf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rowVYHZyh3b5nzLf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rowVYHZyh3b5nzLf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rowVYHZyh3b5nzLf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rowVYHZyh3b5nzLf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rowVYHZyh3b5nzLf .cluster text{fill:#333;}#mermaid-svg-rowVYHZyh3b5nzLf .cluster span{color:#333;}#mermaid-svg-rowVYHZyh3b5nzLf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rowVYHZyh3b5nzLf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rowVYHZyh3b5nzLf rect.text{fill:none;stroke-width:0;}#mermaid-svg-rowVYHZyh3b5nzLf .icon-shape,#mermaid-svg-rowVYHZyh3b5nzLf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rowVYHZyh3b5nzLf .icon-shape p,#mermaid-svg-rowVYHZyh3b5nzLf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rowVYHZyh3b5nzLf .icon-shape .label rect,#mermaid-svg-rowVYHZyh3b5nzLf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rowVYHZyh3b5nzLf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rowVYHZyh3b5nzLf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rowVYHZyh3b5nzLf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RoundTripper Chain
用户自定义
config.Transport
authRoundTripper
Auth 插件
userAgentRoundTripper
User-Agent
cacheRoundTripper
TLS 缓存
http.DefaultTransport
TCP/TLS 底层
bearerAuthRoundTripper
Bearer Token
basicAuthRoundTripper
Basic Auth
impersonatingRoundTripper
伪装 Header
debuggingRoundTripper
curl 命令日志
4.5 tools/clientcmd/ --- Kubeconfig 管理
核心作用
读取和解析 kubeconfig 文件(~/.kube/config),构建 rest.Config。
关键类型
| 类型 | 作用 |
|---|---|
Config (clientcmdapi) |
kubeconfig 文件的数据模型 |
DirectClientConfig |
直接从 kubeconfig 构建的客户端配置 |
DeferredLoadingClientConfig |
延迟加载的客户端配置 |
NewDefaultClientConfigLoadingRules() |
默认 kubeconfig 路径规则 |
BuildConfigFromFlags() |
从 masterURL/kubeconfig 构建 Config |
Kubeconfig 合并链
#mermaid-svg-s6oLWJnkcwbCMwwq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-s6oLWJnkcwbCMwwq .error-icon{fill:#552222;}#mermaid-svg-s6oLWJnkcwbCMwwq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s6oLWJnkcwbCMwwq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s6oLWJnkcwbCMwwq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s6oLWJnkcwbCMwwq .marker.cross{stroke:#333333;}#mermaid-svg-s6oLWJnkcwbCMwwq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s6oLWJnkcwbCMwwq p{margin:0;}#mermaid-svg-s6oLWJnkcwbCMwwq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq .cluster-label text{fill:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq .cluster-label span{color:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq .cluster-label span p{background-color:transparent;}#mermaid-svg-s6oLWJnkcwbCMwwq .label text,#mermaid-svg-s6oLWJnkcwbCMwwq span{fill:#333;color:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq .node rect,#mermaid-svg-s6oLWJnkcwbCMwwq .node circle,#mermaid-svg-s6oLWJnkcwbCMwwq .node ellipse,#mermaid-svg-s6oLWJnkcwbCMwwq .node polygon,#mermaid-svg-s6oLWJnkcwbCMwwq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-s6oLWJnkcwbCMwwq .rough-node .label text,#mermaid-svg-s6oLWJnkcwbCMwwq .node .label text,#mermaid-svg-s6oLWJnkcwbCMwwq .image-shape .label,#mermaid-svg-s6oLWJnkcwbCMwwq .icon-shape .label{text-anchor:middle;}#mermaid-svg-s6oLWJnkcwbCMwwq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-s6oLWJnkcwbCMwwq .rough-node .label,#mermaid-svg-s6oLWJnkcwbCMwwq .node .label,#mermaid-svg-s6oLWJnkcwbCMwwq .image-shape .label,#mermaid-svg-s6oLWJnkcwbCMwwq .icon-shape .label{text-align:center;}#mermaid-svg-s6oLWJnkcwbCMwwq .node.clickable{cursor:pointer;}#mermaid-svg-s6oLWJnkcwbCMwwq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-s6oLWJnkcwbCMwwq .arrowheadPath{fill:#333333;}#mermaid-svg-s6oLWJnkcwbCMwwq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-s6oLWJnkcwbCMwwq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-s6oLWJnkcwbCMwwq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s6oLWJnkcwbCMwwq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-s6oLWJnkcwbCMwwq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s6oLWJnkcwbCMwwq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-s6oLWJnkcwbCMwwq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-s6oLWJnkcwbCMwwq .cluster text{fill:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq .cluster span{color:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-s6oLWJnkcwbCMwwq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-s6oLWJnkcwbCMwwq rect.text{fill:none;stroke-width:0;}#mermaid-svg-s6oLWJnkcwbCMwwq .icon-shape,#mermaid-svg-s6oLWJnkcwbCMwwq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s6oLWJnkcwbCMwwq .icon-shape p,#mermaid-svg-s6oLWJnkcwbCMwwq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-s6oLWJnkcwbCMwwq .icon-shape .label rect,#mermaid-svg-s6oLWJnkcwbCMwwq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s6oLWJnkcwbCMwwq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-s6oLWJnkcwbCMwwq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-s6oLWJnkcwbCMwwq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} kubeconfig 文件 1
(--kubeconfig)
kubeconfig 文件 2
(KUBECONFIG env)
~/.kube/config
(默认)
合并策略:
-
Clusters: 后者覆盖
-
AuthInfos: 后者覆盖
-
Contexts: 后者覆盖
clientcmdapi.Config
rest.Config
(供 RESTClient 使用)
4.6 tools/leaderelection/ --- 主选举
关键类型
| 类型 | 作用 |
|---|---|
LeaderElectionConfig |
选举配置(Lock/RenewDeadline/LeaseDuration/RetryPeriod) |
LeaderElector |
选举器实例 |
LeaderLock |
锁抽象(支持 Lease/ConfigMap/Endpoint) |
HealthzAdaptor |
健康检查适配器(/healthz 返回是否 leader) |
LeaderCandidate |
选举候选者(非竞争模式) |
选举时间参数关系
#mermaid-svg-dY29To6gsDtui8Mb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dY29To6gsDtui8Mb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dY29To6gsDtui8Mb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dY29To6gsDtui8Mb .error-icon{fill:#552222;}#mermaid-svg-dY29To6gsDtui8Mb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dY29To6gsDtui8Mb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dY29To6gsDtui8Mb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dY29To6gsDtui8Mb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dY29To6gsDtui8Mb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dY29To6gsDtui8Mb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dY29To6gsDtui8Mb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dY29To6gsDtui8Mb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dY29To6gsDtui8Mb .marker.cross{stroke:#333333;}#mermaid-svg-dY29To6gsDtui8Mb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dY29To6gsDtui8Mb p{margin:0;}#mermaid-svg-dY29To6gsDtui8Mb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dY29To6gsDtui8Mb .cluster-label text{fill:#333;}#mermaid-svg-dY29To6gsDtui8Mb .cluster-label span{color:#333;}#mermaid-svg-dY29To6gsDtui8Mb .cluster-label span p{background-color:transparent;}#mermaid-svg-dY29To6gsDtui8Mb .label text,#mermaid-svg-dY29To6gsDtui8Mb span{fill:#333;color:#333;}#mermaid-svg-dY29To6gsDtui8Mb .node rect,#mermaid-svg-dY29To6gsDtui8Mb .node circle,#mermaid-svg-dY29To6gsDtui8Mb .node ellipse,#mermaid-svg-dY29To6gsDtui8Mb .node polygon,#mermaid-svg-dY29To6gsDtui8Mb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dY29To6gsDtui8Mb .rough-node .label text,#mermaid-svg-dY29To6gsDtui8Mb .node .label text,#mermaid-svg-dY29To6gsDtui8Mb .image-shape .label,#mermaid-svg-dY29To6gsDtui8Mb .icon-shape .label{text-anchor:middle;}#mermaid-svg-dY29To6gsDtui8Mb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dY29To6gsDtui8Mb .rough-node .label,#mermaid-svg-dY29To6gsDtui8Mb .node .label,#mermaid-svg-dY29To6gsDtui8Mb .image-shape .label,#mermaid-svg-dY29To6gsDtui8Mb .icon-shape .label{text-align:center;}#mermaid-svg-dY29To6gsDtui8Mb .node.clickable{cursor:pointer;}#mermaid-svg-dY29To6gsDtui8Mb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dY29To6gsDtui8Mb .arrowheadPath{fill:#333333;}#mermaid-svg-dY29To6gsDtui8Mb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dY29To6gsDtui8Mb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dY29To6gsDtui8Mb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dY29To6gsDtui8Mb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dY29To6gsDtui8Mb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dY29To6gsDtui8Mb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dY29To6gsDtui8Mb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dY29To6gsDtui8Mb .cluster text{fill:#333;}#mermaid-svg-dY29To6gsDtui8Mb .cluster span{color:#333;}#mermaid-svg-dY29To6gsDtui8Mb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dY29To6gsDtui8Mb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dY29To6gsDtui8Mb rect.text{fill:none;stroke-width:0;}#mermaid-svg-dY29To6gsDtui8Mb .icon-shape,#mermaid-svg-dY29To6gsDtui8Mb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dY29To6gsDtui8Mb .icon-shape p,#mermaid-svg-dY29To6gsDtui8Mb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dY29To6gsDtui8Mb .icon-shape .label rect,#mermaid-svg-dY29To6gsDtui8Mb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dY29To6gsDtui8Mb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dY29To6gsDtui8Mb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dY29To6gsDtui8Mb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 约束
时间参数
LeaseDuration
锁的有效期
(默认 15s)
RenewDeadline
续约截止期
(默认 10s)
RetryPeriod
重试间隔
(默认 2s)
RetryPeriod < RenewDeadline < LeaseDuration
容忍时钟偏移 ≈ LeaseDuration / RenewDeadline
4.7 tools/record/ --- 事件记录
关键类型
| 类型 | 作用 |
|---|---|
EventRecorder |
事件记录接口 |
EventBroadcaster |
事件广播器(启动 EventWatcher) |
correlator |
事件聚合器(相同事件合并计数) |
EventSink |
事件写入接口(Create/Update/Patch) |
事件聚合机制
#mermaid-svg-xrMrcRVX5hOtb0Xk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xrMrcRVX5hOtb0Xk .error-icon{fill:#552222;}#mermaid-svg-xrMrcRVX5hOtb0Xk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xrMrcRVX5hOtb0Xk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .marker.cross{stroke:#333333;}#mermaid-svg-xrMrcRVX5hOtb0Xk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xrMrcRVX5hOtb0Xk p{margin:0;}#mermaid-svg-xrMrcRVX5hOtb0Xk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .cluster-label text{fill:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .cluster-label span{color:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .cluster-label span p{background-color:transparent;}#mermaid-svg-xrMrcRVX5hOtb0Xk .label text,#mermaid-svg-xrMrcRVX5hOtb0Xk span{fill:#333;color:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .node rect,#mermaid-svg-xrMrcRVX5hOtb0Xk .node circle,#mermaid-svg-xrMrcRVX5hOtb0Xk .node ellipse,#mermaid-svg-xrMrcRVX5hOtb0Xk .node polygon,#mermaid-svg-xrMrcRVX5hOtb0Xk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .rough-node .label text,#mermaid-svg-xrMrcRVX5hOtb0Xk .node .label text,#mermaid-svg-xrMrcRVX5hOtb0Xk .image-shape .label,#mermaid-svg-xrMrcRVX5hOtb0Xk .icon-shape .label{text-anchor:middle;}#mermaid-svg-xrMrcRVX5hOtb0Xk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .rough-node .label,#mermaid-svg-xrMrcRVX5hOtb0Xk .node .label,#mermaid-svg-xrMrcRVX5hOtb0Xk .image-shape .label,#mermaid-svg-xrMrcRVX5hOtb0Xk .icon-shape .label{text-align:center;}#mermaid-svg-xrMrcRVX5hOtb0Xk .node.clickable{cursor:pointer;}#mermaid-svg-xrMrcRVX5hOtb0Xk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .arrowheadPath{fill:#333333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xrMrcRVX5hOtb0Xk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xrMrcRVX5hOtb0Xk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xrMrcRVX5hOtb0Xk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xrMrcRVX5hOtb0Xk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .cluster text{fill:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk .cluster span{color:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xrMrcRVX5hOtb0Xk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xrMrcRVX5hOtb0Xk rect.text{fill:none;stroke-width:0;}#mermaid-svg-xrMrcRVX5hOtb0Xk .icon-shape,#mermaid-svg-xrMrcRVX5hOtb0Xk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xrMrcRVX5hOtb0Xk .icon-shape p,#mermaid-svg-xrMrcRVX5hOtb0Xk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xrMrcRVX5hOtb0Xk .icon-shape .label rect,#mermaid-svg-xrMrcRVX5hOtb0Xk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xrMrcRVX5hOtb0Xk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xrMrcRVX5hOtb0Xk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xrMrcRVX5hOtb0Xk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Yes
No
Yes
No
Eventf(obj, type, reason, message)
计算事件指纹:
involvedObject + reason + source
聚合窗口内
相同指纹?
Count++
不创建新 Event
Create Event
409 Conflict?
GET + Update(Count)
OK
第五章 架构设计模式总结
5.1 核心设计模式
| 模式 | client-go 中的体现 | 优势 |
|---|---|---|
| 分层架构 | 5 层:传输→REST→抽象客户端→框架→应用 | 关注点分离,每层可独立演进 |
| 代码生成 | Typed Client/Informer/Lister/Apply 自动生成 | 类型安全,减少手写错误 |
| 接口抽象 | Store/Queue/Controller/RateLimiter 等核心接口 | 可替换实现,便于测试 |
| 装饰器链 | RoundTripper 链、WorkQueue 三层嵌套 | 灵活组合功能 |
| 观察者模式 | Informer + ResourceEventHandler | 事件驱动,解耦生产/消费 |
| 生产者-消费者 | Reflector→DeltaFIFO→processLoop | 异步解耦,缓冲削峰 |
| 共享实例 | SharedInformerFactory 保证同 GVR 共享 Informer | 节省资源,减少 API Server 压力 |
| 策略模式 | RateLimiter、KeyFunc、IndexFunc 可替换 | 算法可插拔 |
| 对象池/缓存 | TLS 缓存、Discovery 缓存、Store 缓存 | 减少重复创建 |
| 配置驱动 | Config/Options 结构体注入所有依赖 | 集中配置,构造灵活 |
| 特性门控 | features/ 控制功能灰度发布 | 安全上线新功能 |
| 墓碑对象 | DeletedFinalStateUnknown | 处理 Watch 断连期间的删除事件 |
| 最终一致性 | Informer 的 List→Watch→Resync 语义 | 容忍网络抖动,保证最终一致 |
| 去重+合并 | DeltaFIFO 同 key 合并、WorkQueue dirty set | 减少冗余处理 |
5.2 关键不变量
| 不变量 | 描述 |
|---|---|
| 先缓存后通知 | Store 更新在 Handler 通知之前,确保 Handler 可从 Store 读到最新状态 |
| 单 Pop 单 Process | processLoop 串行消费,同一 key 的 Deltas 不会并发处理 |
| HasSynced 语义 | 初始 List 完成 + 所有 Deltas 已 Pop + Store 已更新 |
| Shared Informer 共享 | 同一 GVR 只创建一个 Informer 实例 |
| 最终一致性 | Watch 断连后自动 re-List,Resync 定期修正 |
| Config 值拷贝 | New(cfg) 拷贝 Config,后续修改不影响已创建的实例 |
| Handler 不可修改对象 | ResourceEventHandler 的约束:MUST NOT modify received objects |
5.3 性能关键设计
| 设计 | 优化目标 | 模块 |
|---|---|---|
| TLS 缓存 | 减少 TLS 握手开销 | transport/cache.go |
| Discovery 缓存 | 减少重复 API 发现请求 | discovery/cached/ |
| SharedInformer 共享 | 减少对 API Server 的 List/Watch 请求 | informers/factory.go |
| 令牌桶限流 | 防止客户端压垮 API Server | rest/config.go, util/flowcontrol |
| Watch 增量推送 | 避免 List 全量拉取 | Reflector, DeltaFIFO |
| 事件聚合 | 减少 Event 资源数量 | tools/record/correlator |
| WorkQueue 去重 | 减少重复调谐 | util/workqueue/queue.go |
| RingGrowing 无界缓冲 | 避免 processorListener 阻塞 | tools/cache/shared_informer.go |
| 并行 List 分页 | 大规模资源 List 加速 | Reflector.WatchListPageSize |
第六章 完整模块索引
| 模块 | 代码行数 | Go 文件数 | 核心作用 |
|---|---|---|---|
| applyconfigurations/ | 126,969 | ~950 | SSA Apply 类型安全配置(代码生成) |
| tools/ | 50,670 | ~200 | Informer 引擎 + Leaderelection + Record + Clientcmd |
| kubernetes/ | 35,035 | ~350 | 强类型 Clientset(代码生成) |
| informers/ | 20,871 | ~180 | SharedInformerFactory(代码生成) |
| util/ | 15,025 | ~100 | WorkQueue + FlowControl + Retry + Cert 工具 |
| rest/ | 11,759 | ~20 | REST 客户端 + 配置 + 请求构建 |
| listers/ | 11,242 | ~180 | 强类型 Lister(代码生成) |
| discovery/ | 10,454 | ~15 | API 发现客户端 + 缓存 |
| transport/ | 6,172 | ~20 | HTTP Transport + TLS + 认证 |
| dynamic/ | 3,947 | ~15 | Dynamic Client + DynamicInformer |
| plugin/ | 3,515 | ~10 | Auth Plugin (GCP/OIDC) |
| testing/ | 3,366 | ~8 | Fake 客户端 + ObjectTracker |
| scale/ | 2,432 | ~5 | Scale 子资源客户端 |
| metadata/ | 2,344 | ~10 | Metadata Client + MetadataInformer |
| restmapper/ | 1,955 | ~5 | RESTMapper (GVK↔GVR) |
| pkg/ | 1,694 | ~5 | 版本信息 |
| features/ | 1,182 | ~5 | 特性门控 |
| examples/ | 1,056 | ~10 | 示例程序 |
| third_party/ | 783 | ~5 | 第三方代码分叉 |
| openapi/ | 721 | ~5 | OpenAPI v2 数据模型 |
| gentype/ | 653 | ~5 | 泛型客户端模板 |
| openapi3/ | 500 | ~5 | OpenAPI v3 数据模型 |
| kubernetes_test/ | 354 | ~3 | Clientset 集成测试 |
| 合计 | 313,240 | 2,316 | --- |
附录A:核心接口完整清单
| 接口 | 所在包 | 核心方法 | 设计目的 |
|---|---|---|---|
Store |
tools/cache | Add/Update/Delete/List/Get/Replace | 本地缓存抽象 |
Indexer |
tools/cache | IndexKeys/ListIndexFuncValues/GetIndexers | 带索引的缓存 |
Queue |
tools/cache | Add/Update/Delete/List/Pop/Close | 事件队列抽象 |
QueueWithBatch |
tools/cache | PopBatch | 批量弹出队列 |
TransactionStore |
tools/cache | Transaction | 事务支持缓存 |
Controller |
tools/cache | Run/RunWithContext/HasSynced/LastSyncResourceVersion | 低级控制器 |
SharedInformer |
tools/cache | AddEventHandler/HasSynced/LastSyncResourceVersion | 共享 Informer |
SharedIndexInformer |
tools/cache | GetIndexer/AddIndexers/GetStore | 带索引的共享 Informer |
ListerWatcher |
tools/cache | List/Watch | 数据源抽象 |
ResourceEventHandler |
tools/cache | OnAdd/OnUpdate/OnDelete | 事件回调 |
RESTClient.Interface |
rest | Verb/Get/Post/Put/Patch/Delete | REST 请求构建 |
DiscoveryInterface |
discovery | ServerGroups/ServerResourcesForGroupVersion | API 发现 |
CachedDiscoveryInterface |
discovery/cached | Invalidate/ServerGroups | 缓存发现 |
meta.RESTMapper |
apimachinery | RESTMapping/KindFor/ResourceFor | GVK↔GVR 映射 |
dynamic.Interface |
dynamic | Resource(gvr) | 动态客户端 |
metadata.Interface |
metadata | Resource(gvr) | 元数据客户端 |
scale.ScaleInterface |
scale | Get/Update/Patch | Scale 子资源 |
workqueue.TypedInterface[T] |
util/workqueue | Add/Get/Done/Len/ShutDown | 工作队列 |
flowcontrol.RateLimiter |
util/flowcontrol | Wait/Allow/Reserve/QPS | 限流器 |
watch.Interface |
apimachinery | ResultChan/Stop | Watch 事件流 |
runtime.Object |
apimachinery | DeepCopyObject/GetObjectKind | Kubernetes 对象 |
meta.MetadataAccessor |
apimachinery | GetName/GetNamespace/GetResourceVersion | 对象元数据访问 |
附录B:特性门控与代码路径映射
B.1 InOrderInformers 特性门控影响
#mermaid-svg-2zqXu63w4XsYUxFU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2zqXu63w4XsYUxFU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2zqXu63w4XsYUxFU .error-icon{fill:#552222;}#mermaid-svg-2zqXu63w4XsYUxFU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2zqXu63w4XsYUxFU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2zqXu63w4XsYUxFU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2zqXu63w4XsYUxFU .marker.cross{stroke:#333333;}#mermaid-svg-2zqXu63w4XsYUxFU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2zqXu63w4XsYUxFU p{margin:0;}#mermaid-svg-2zqXu63w4XsYUxFU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2zqXu63w4XsYUxFU .cluster-label text{fill:#333;}#mermaid-svg-2zqXu63w4XsYUxFU .cluster-label span{color:#333;}#mermaid-svg-2zqXu63w4XsYUxFU .cluster-label span p{background-color:transparent;}#mermaid-svg-2zqXu63w4XsYUxFU .label text,#mermaid-svg-2zqXu63w4XsYUxFU span{fill:#333;color:#333;}#mermaid-svg-2zqXu63w4XsYUxFU .node rect,#mermaid-svg-2zqXu63w4XsYUxFU .node circle,#mermaid-svg-2zqXu63w4XsYUxFU .node ellipse,#mermaid-svg-2zqXu63w4XsYUxFU .node polygon,#mermaid-svg-2zqXu63w4XsYUxFU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2zqXu63w4XsYUxFU .rough-node .label text,#mermaid-svg-2zqXu63w4XsYUxFU .node .label text,#mermaid-svg-2zqXu63w4XsYUxFU .image-shape .label,#mermaid-svg-2zqXu63w4XsYUxFU .icon-shape .label{text-anchor:middle;}#mermaid-svg-2zqXu63w4XsYUxFU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2zqXu63w4XsYUxFU .rough-node .label,#mermaid-svg-2zqXu63w4XsYUxFU .node .label,#mermaid-svg-2zqXu63w4XsYUxFU .image-shape .label,#mermaid-svg-2zqXu63w4XsYUxFU .icon-shape .label{text-align:center;}#mermaid-svg-2zqXu63w4XsYUxFU .node.clickable{cursor:pointer;}#mermaid-svg-2zqXu63w4XsYUxFU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2zqXu63w4XsYUxFU .arrowheadPath{fill:#333333;}#mermaid-svg-2zqXu63w4XsYUxFU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2zqXu63w4XsYUxFU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2zqXu63w4XsYUxFU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2zqXu63w4XsYUxFU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2zqXu63w4XsYUxFU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2zqXu63w4XsYUxFU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2zqXu63w4XsYUxFU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2zqXu63w4XsYUxFU .cluster text{fill:#333;}#mermaid-svg-2zqXu63w4XsYUxFU .cluster span{color:#333;}#mermaid-svg-2zqXu63w4XsYUxFU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2zqXu63w4XsYUxFU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2zqXu63w4XsYUxFU rect.text{fill:none;stroke-width:0;}#mermaid-svg-2zqXu63w4XsYUxFU .icon-shape,#mermaid-svg-2zqXu63w4XsYUxFU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2zqXu63w4XsYUxFU .icon-shape p,#mermaid-svg-2zqXu63w4XsYUxFU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2zqXu63w4XsYUxFU .icon-shape .label rect,#mermaid-svg-2zqXu63w4XsYUxFU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2zqXu63w4XsYUxFU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2zqXu63w4XsYUxFU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2zqXu63w4XsYUxFU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} false
true
true
false
InOrderInformers?
DeltaFIFO
传统模式
RealFIFO
新模式
AtomicFIFO?
原子模式:
options.AtomicEvents=true
options.UnlockWhileProcessing=true
options.KnownObjects=nil
传统模式:
options.KnownObjects=clientState
DeltaFIFOOptions:
KnownObjects=clientState
EmitDeltaTypeReplaced=true
B.2 InOrderInformersBatchProcess 特性门控影响
#mermaid-svg-8kGJoCCEbLRpP0fc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8kGJoCCEbLRpP0fc .error-icon{fill:#552222;}#mermaid-svg-8kGJoCCEbLRpP0fc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8kGJoCCEbLRpP0fc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8kGJoCCEbLRpP0fc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8kGJoCCEbLRpP0fc .marker.cross{stroke:#333333;}#mermaid-svg-8kGJoCCEbLRpP0fc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8kGJoCCEbLRpP0fc p{margin:0;}#mermaid-svg-8kGJoCCEbLRpP0fc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc .cluster-label text{fill:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc .cluster-label span{color:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc .cluster-label span p{background-color:transparent;}#mermaid-svg-8kGJoCCEbLRpP0fc .label text,#mermaid-svg-8kGJoCCEbLRpP0fc span{fill:#333;color:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc .node rect,#mermaid-svg-8kGJoCCEbLRpP0fc .node circle,#mermaid-svg-8kGJoCCEbLRpP0fc .node ellipse,#mermaid-svg-8kGJoCCEbLRpP0fc .node polygon,#mermaid-svg-8kGJoCCEbLRpP0fc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8kGJoCCEbLRpP0fc .rough-node .label text,#mermaid-svg-8kGJoCCEbLRpP0fc .node .label text,#mermaid-svg-8kGJoCCEbLRpP0fc .image-shape .label,#mermaid-svg-8kGJoCCEbLRpP0fc .icon-shape .label{text-anchor:middle;}#mermaid-svg-8kGJoCCEbLRpP0fc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8kGJoCCEbLRpP0fc .rough-node .label,#mermaid-svg-8kGJoCCEbLRpP0fc .node .label,#mermaid-svg-8kGJoCCEbLRpP0fc .image-shape .label,#mermaid-svg-8kGJoCCEbLRpP0fc .icon-shape .label{text-align:center;}#mermaid-svg-8kGJoCCEbLRpP0fc .node.clickable{cursor:pointer;}#mermaid-svg-8kGJoCCEbLRpP0fc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8kGJoCCEbLRpP0fc .arrowheadPath{fill:#333333;}#mermaid-svg-8kGJoCCEbLRpP0fc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8kGJoCCEbLRpP0fc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8kGJoCCEbLRpP0fc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8kGJoCCEbLRpP0fc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8kGJoCCEbLRpP0fc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8kGJoCCEbLRpP0fc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8kGJoCCEbLRpP0fc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8kGJoCCEbLRpP0fc .cluster text{fill:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc .cluster span{color:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8kGJoCCEbLRpP0fc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8kGJoCCEbLRpP0fc rect.text{fill:none;stroke-width:0;}#mermaid-svg-8kGJoCCEbLRpP0fc .icon-shape,#mermaid-svg-8kGJoCCEbLRpP0fc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8kGJoCCEbLRpP0fc .icon-shape p,#mermaid-svg-8kGJoCCEbLRpP0fc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8kGJoCCEbLRpP0fc .icon-shape .label rect,#mermaid-svg-8kGJoCCEbLRpP0fc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8kGJoCCEbLRpP0fc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8kGJoCCEbLRpP0fc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8kGJoCCEbLRpP0fc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全部满足
任一不满足
Yes
No
BatchProcess 启用?
-
Queue 是 QueueWithBatch
-
ProcessBatch != nil
-
特性门控启用
processLoop:
batchQueue.PopBatch(ProcessBatch, Process)
processLoop:
Queue.Pop(Process)
Store 支持 Transaction?
processDeltasInBatch:
构建 txns + callbacks
Store.Transaction(txns...)
processDeltasInBatch:
退化为逐条 processDeltas
B.3 WatchListClient 特性门控影响
#mermaid-svg-0T1CU3iP4JskRS3z{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0T1CU3iP4JskRS3z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0T1CU3iP4JskRS3z .error-icon{fill:#552222;}#mermaid-svg-0T1CU3iP4JskRS3z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0T1CU3iP4JskRS3z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0T1CU3iP4JskRS3z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0T1CU3iP4JskRS3z .marker.cross{stroke:#333333;}#mermaid-svg-0T1CU3iP4JskRS3z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0T1CU3iP4JskRS3z p{margin:0;}#mermaid-svg-0T1CU3iP4JskRS3z .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0T1CU3iP4JskRS3z .cluster-label text{fill:#333;}#mermaid-svg-0T1CU3iP4JskRS3z .cluster-label span{color:#333;}#mermaid-svg-0T1CU3iP4JskRS3z .cluster-label span p{background-color:transparent;}#mermaid-svg-0T1CU3iP4JskRS3z .label text,#mermaid-svg-0T1CU3iP4JskRS3z span{fill:#333;color:#333;}#mermaid-svg-0T1CU3iP4JskRS3z .node rect,#mermaid-svg-0T1CU3iP4JskRS3z .node circle,#mermaid-svg-0T1CU3iP4JskRS3z .node ellipse,#mermaid-svg-0T1CU3iP4JskRS3z .node polygon,#mermaid-svg-0T1CU3iP4JskRS3z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0T1CU3iP4JskRS3z .rough-node .label text,#mermaid-svg-0T1CU3iP4JskRS3z .node .label text,#mermaid-svg-0T1CU3iP4JskRS3z .image-shape .label,#mermaid-svg-0T1CU3iP4JskRS3z .icon-shape .label{text-anchor:middle;}#mermaid-svg-0T1CU3iP4JskRS3z .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0T1CU3iP4JskRS3z .rough-node .label,#mermaid-svg-0T1CU3iP4JskRS3z .node .label,#mermaid-svg-0T1CU3iP4JskRS3z .image-shape .label,#mermaid-svg-0T1CU3iP4JskRS3z .icon-shape .label{text-align:center;}#mermaid-svg-0T1CU3iP4JskRS3z .node.clickable{cursor:pointer;}#mermaid-svg-0T1CU3iP4JskRS3z .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0T1CU3iP4JskRS3z .arrowheadPath{fill:#333333;}#mermaid-svg-0T1CU3iP4JskRS3z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0T1CU3iP4JskRS3z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0T1CU3iP4JskRS3z .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0T1CU3iP4JskRS3z .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0T1CU3iP4JskRS3z .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0T1CU3iP4JskRS3z .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0T1CU3iP4JskRS3z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0T1CU3iP4JskRS3z .cluster text{fill:#333;}#mermaid-svg-0T1CU3iP4JskRS3z .cluster span{color:#333;}#mermaid-svg-0T1CU3iP4JskRS3z div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0T1CU3iP4JskRS3z .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0T1CU3iP4JskRS3z rect.text{fill:none;stroke-width:0;}#mermaid-svg-0T1CU3iP4JskRS3z .icon-shape,#mermaid-svg-0T1CU3iP4JskRS3z .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0T1CU3iP4JskRS3z .icon-shape p,#mermaid-svg-0T1CU3iP4JskRS3z .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0T1CU3iP4JskRS3z .icon-shape .label rect,#mermaid-svg-0T1CU3iP4JskRS3z .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0T1CU3iP4JskRS3z .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0T1CU3iP4JskRS3z .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0T1CU3iP4JskRS3z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} true
false
WatchListClient 启用?
Reflector:
使用 watchlist.WatchList()
替代传统 List + Watch
Reflector:
传统 List → Watch 流程
优势:
-
减少 List 请求
-
更快建立初始缓存
-
减少API Server负载
代价: -
先 List 后 Watch
-
List 可能传输大量数据
B.4 CBOR 特性门控影响
#mermaid-svg-7BEj21T77ypDd7Q4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7BEj21T77ypDd7Q4 .error-icon{fill:#552222;}#mermaid-svg-7BEj21T77ypDd7Q4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7BEj21T77ypDd7Q4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7BEj21T77ypDd7Q4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7BEj21T77ypDd7Q4 .marker.cross{stroke:#333333;}#mermaid-svg-7BEj21T77ypDd7Q4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7BEj21T77ypDd7Q4 p{margin:0;}#mermaid-svg-7BEj21T77ypDd7Q4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 .cluster-label text{fill:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 .cluster-label span{color:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 .cluster-label span p{background-color:transparent;}#mermaid-svg-7BEj21T77ypDd7Q4 .label text,#mermaid-svg-7BEj21T77ypDd7Q4 span{fill:#333;color:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 .node rect,#mermaid-svg-7BEj21T77ypDd7Q4 .node circle,#mermaid-svg-7BEj21T77ypDd7Q4 .node ellipse,#mermaid-svg-7BEj21T77ypDd7Q4 .node polygon,#mermaid-svg-7BEj21T77ypDd7Q4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7BEj21T77ypDd7Q4 .rough-node .label text,#mermaid-svg-7BEj21T77ypDd7Q4 .node .label text,#mermaid-svg-7BEj21T77ypDd7Q4 .image-shape .label,#mermaid-svg-7BEj21T77ypDd7Q4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-7BEj21T77ypDd7Q4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7BEj21T77ypDd7Q4 .rough-node .label,#mermaid-svg-7BEj21T77ypDd7Q4 .node .label,#mermaid-svg-7BEj21T77ypDd7Q4 .image-shape .label,#mermaid-svg-7BEj21T77ypDd7Q4 .icon-shape .label{text-align:center;}#mermaid-svg-7BEj21T77ypDd7Q4 .node.clickable{cursor:pointer;}#mermaid-svg-7BEj21T77ypDd7Q4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7BEj21T77ypDd7Q4 .arrowheadPath{fill:#333333;}#mermaid-svg-7BEj21T77ypDd7Q4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7BEj21T77ypDd7Q4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7BEj21T77ypDd7Q4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7BEj21T77ypDd7Q4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7BEj21T77ypDd7Q4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7BEj21T77ypDd7Q4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7BEj21T77ypDd7Q4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7BEj21T77ypDd7Q4 .cluster text{fill:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 .cluster span{color:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7BEj21T77ypDd7Q4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7BEj21T77ypDd7Q4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-7BEj21T77ypDd7Q4 .icon-shape,#mermaid-svg-7BEj21T77ypDd7Q4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7BEj21T77ypDd7Q4 .icon-shape p,#mermaid-svg-7BEj21T77ypDd7Q4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7BEj21T77ypDd7Q4 .icon-shape .label rect,#mermaid-svg-7BEj21T77ypDd7Q4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7BEj21T77ypDd7Q4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7BEj21T77ypDd7Q4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7BEj21T77ypDd7Q4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} true
false
true
false
ClientsAllowCBOR?
Request 内容协商:
Accept 增加 application/cbor
Accept: application/json
ClientsPreferCBOR?
Accept 顺序:
application/cbor, application/json
Accept 顺序:
application/json, application/cbor
附录C:关键数据结构关系图
C.1 Informer 体系对象关系
#mermaid-svg-Q553bbmq2pZ9KyM1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Q553bbmq2pZ9KyM1 .error-icon{fill:#552222;}#mermaid-svg-Q553bbmq2pZ9KyM1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Q553bbmq2pZ9KyM1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Q553bbmq2pZ9KyM1 .marker.cross{stroke:#333333;}#mermaid-svg-Q553bbmq2pZ9KyM1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Q553bbmq2pZ9KyM1 p{margin:0;}#mermaid-svg-Q553bbmq2pZ9KyM1 .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Q553bbmq2pZ9KyM1 .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-Q553bbmq2pZ9KyM1 .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-Q553bbmq2pZ9KyM1 .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-Q553bbmq2pZ9KyM1 .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-Q553bbmq2pZ9KyM1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-Q553bbmq2pZ9KyM1 .node rect,#mermaid-svg-Q553bbmq2pZ9KyM1 .node circle,#mermaid-svg-Q553bbmq2pZ9KyM1 .node ellipse,#mermaid-svg-Q553bbmq2pZ9KyM1 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Q553bbmq2pZ9KyM1 .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Q553bbmq2pZ9KyM1 .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Q553bbmq2pZ9KyM1 .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Q553bbmq2pZ9KyM1 .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q553bbmq2pZ9KyM1 .edgeLabel .label text{fill:#333;}#mermaid-svg-Q553bbmq2pZ9KyM1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} creates
wraps
contains
contains
contains
creates
uses
uses
writes to
manages
invokes
contains
delegates
contains
per-index
SharedInformerFactory
GenericInformer
SharedIndexInformer
Controller
sharedProcessor
Indexer
Reflector
Queue
ListerWatcher
processorListener
ResourceEventHandler
RingGrowing
threadSafeMap
storeIndex
Index
C.2 REST 请求体系对象关系
#mermaid-svg-Usjz6rMqLGuQmvQh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Usjz6rMqLGuQmvQh .error-icon{fill:#552222;}#mermaid-svg-Usjz6rMqLGuQmvQh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Usjz6rMqLGuQmvQh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Usjz6rMqLGuQmvQh .marker.cross{stroke:#333333;}#mermaid-svg-Usjz6rMqLGuQmvQh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Usjz6rMqLGuQmvQh p{margin:0;}#mermaid-svg-Usjz6rMqLGuQmvQh .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-Usjz6rMqLGuQmvQh .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-Usjz6rMqLGuQmvQh .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-Usjz6rMqLGuQmvQh .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-Usjz6rMqLGuQmvQh .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-Usjz6rMqLGuQmvQh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Usjz6rMqLGuQmvQh .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-Usjz6rMqLGuQmvQh .node rect,#mermaid-svg-Usjz6rMqLGuQmvQh .node circle,#mermaid-svg-Usjz6rMqLGuQmvQh .node ellipse,#mermaid-svg-Usjz6rMqLGuQmvQh .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Usjz6rMqLGuQmvQh .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-Usjz6rMqLGuQmvQh .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-Usjz6rMqLGuQmvQh .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Usjz6rMqLGuQmvQh .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-Usjz6rMqLGuQmvQh .edgeLabel .label text{fill:#333;}#mermaid-svg-Usjz6rMqLGuQmvQh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} creates
creates
builds
uses
uses
calls
decorates
chains
chains
chains
Config
RESTClient
Request
http.Request
withRetry
RateLimiter
Transport
RoundTripper
authRoundTripper
userAgentRoundTripper
cacheRoundTripper
C.3 WorkQueue 体系对象关系
#mermaid-svg-K6dMAHfe2YOsHkuv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-K6dMAHfe2YOsHkuv .error-icon{fill:#552222;}#mermaid-svg-K6dMAHfe2YOsHkuv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-K6dMAHfe2YOsHkuv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-K6dMAHfe2YOsHkuv .marker.cross{stroke:#333333;}#mermaid-svg-K6dMAHfe2YOsHkuv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-K6dMAHfe2YOsHkuv p{margin:0;}#mermaid-svg-K6dMAHfe2YOsHkuv .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-K6dMAHfe2YOsHkuv .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-K6dMAHfe2YOsHkuv .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-K6dMAHfe2YOsHkuv .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-K6dMAHfe2YOsHkuv .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-K6dMAHfe2YOsHkuv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-K6dMAHfe2YOsHkuv .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-K6dMAHfe2YOsHkuv .node rect,#mermaid-svg-K6dMAHfe2YOsHkuv .node circle,#mermaid-svg-K6dMAHfe2YOsHkuv .node ellipse,#mermaid-svg-K6dMAHfe2YOsHkuv .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-K6dMAHfe2YOsHkuv .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-K6dMAHfe2YOsHkuv .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-K6dMAHfe2YOsHkuv .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-K6dMAHfe2YOsHkuv .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-K6dMAHfe2YOsHkuv .edgeLabel .label text{fill:#333;}#mermaid-svg-K6dMAHfe2YOsHkuv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} wraps
wraps
contains
uses
uses
uses
uses
uses
RateLimitingInterface
DelayingInterface
Interface
Queue
dirty_set
processing_set
RateLimiter
waitFor_priority_queue
timer
附录D:错误处理策略
| 模块 | 错误类型 | 处理策略 | 重试机制 |
|---|---|---|---|
| Reflector | Watch 断连 | 退避重连 | ExponentialBackoff (1s→2s→4s→...→30s) |
| Reflector | List 失败 | 退避重试 | ExponentialBackoff (同上) |
| Controller | Process 返回 error | Re-enqueue | DeltaFIFO.AddIfNotPresent |
| Controller | Queue 关闭 | 退出循环 | ErrFIFOClosed → return |
| processLoop | Panic | 自动重启 | wait.Until 1s 间隔重启 |
| REST Request | 5xx / 429 | 自动重试 | withRetry + URLBackoff |
| REST Request | 409 Conflict | 乐观锁重试 | OnConflict + ExponentialBackoff |
| REST Request | 网络错误 | 自动重试 | withRetry + URLBackoff |
| LeaderElection | 获取锁失败 | 重试 | RetryPeriod 间隔 |
| LeaderElection | 续约失败 | 重新获取 | 切换到 Acquiring 状态 |
| Event Record | 409 Conflict | 更新 Count | GET + PUT |
| Discovery | API Group 消失 | 重试 | defaultRetries=2 |
附录E:配置层级与优先级
E.1 rest.Config 配置来源优先级
#mermaid-svg-JHrbZccDPe67PTzD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JHrbZccDPe67PTzD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JHrbZccDPe67PTzD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JHrbZccDPe67PTzD .error-icon{fill:#552222;}#mermaid-svg-JHrbZccDPe67PTzD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JHrbZccDPe67PTzD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JHrbZccDPe67PTzD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JHrbZccDPe67PTzD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JHrbZccDPe67PTzD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JHrbZccDPe67PTzD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JHrbZccDPe67PTzD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JHrbZccDPe67PTzD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JHrbZccDPe67PTzD .marker.cross{stroke:#333333;}#mermaid-svg-JHrbZccDPe67PTzD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JHrbZccDPe67PTzD p{margin:0;}#mermaid-svg-JHrbZccDPe67PTzD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JHrbZccDPe67PTzD .cluster-label text{fill:#333;}#mermaid-svg-JHrbZccDPe67PTzD .cluster-label span{color:#333;}#mermaid-svg-JHrbZccDPe67PTzD .cluster-label span p{background-color:transparent;}#mermaid-svg-JHrbZccDPe67PTzD .label text,#mermaid-svg-JHrbZccDPe67PTzD span{fill:#333;color:#333;}#mermaid-svg-JHrbZccDPe67PTzD .node rect,#mermaid-svg-JHrbZccDPe67PTzD .node circle,#mermaid-svg-JHrbZccDPe67PTzD .node ellipse,#mermaid-svg-JHrbZccDPe67PTzD .node polygon,#mermaid-svg-JHrbZccDPe67PTzD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JHrbZccDPe67PTzD .rough-node .label text,#mermaid-svg-JHrbZccDPe67PTzD .node .label text,#mermaid-svg-JHrbZccDPe67PTzD .image-shape .label,#mermaid-svg-JHrbZccDPe67PTzD .icon-shape .label{text-anchor:middle;}#mermaid-svg-JHrbZccDPe67PTzD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JHrbZccDPe67PTzD .rough-node .label,#mermaid-svg-JHrbZccDPe67PTzD .node .label,#mermaid-svg-JHrbZccDPe67PTzD .image-shape .label,#mermaid-svg-JHrbZccDPe67PTzD .icon-shape .label{text-align:center;}#mermaid-svg-JHrbZccDPe67PTzD .node.clickable{cursor:pointer;}#mermaid-svg-JHrbZccDPe67PTzD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JHrbZccDPe67PTzD .arrowheadPath{fill:#333333;}#mermaid-svg-JHrbZccDPe67PTzD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JHrbZccDPe67PTzD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JHrbZccDPe67PTzD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JHrbZccDPe67PTzD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JHrbZccDPe67PTzD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JHrbZccDPe67PTzD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JHrbZccDPe67PTzD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JHrbZccDPe67PTzD .cluster text{fill:#333;}#mermaid-svg-JHrbZccDPe67PTzD .cluster span{color:#333;}#mermaid-svg-JHrbZccDPe67PTzD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JHrbZccDPe67PTzD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JHrbZccDPe67PTzD rect.text{fill:none;stroke-width:0;}#mermaid-svg-JHrbZccDPe67PTzD .icon-shape,#mermaid-svg-JHrbZccDPe67PTzD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JHrbZccDPe67PTzD .icon-shape p,#mermaid-svg-JHrbZccDPe67PTzD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JHrbZccDPe67PTzD .icon-shape .label rect,#mermaid-svg-JHrbZccDPe67PTzD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JHrbZccDPe67PTzD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JHrbZccDPe67PTzD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JHrbZccDPe67PTzD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 最高优先
In-Cluster Config
(KUBERNETES_SERVICE_HOST)
kubeconfig 文件
(~/.kube/config)
命令行参数
(--master, --kubeconfig)
代码中直接设置
(rest.Config{...})
合并优先级:
-
代码直接设置
-
命令行参数
-
KUBECONFIG env
-
~/.kube/config
-
In-Cluster
E.2 认证方式优先级
#mermaid-svg-fi8wLPjfO5VUBayk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fi8wLPjfO5VUBayk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fi8wLPjfO5VUBayk .error-icon{fill:#552222;}#mermaid-svg-fi8wLPjfO5VUBayk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fi8wLPjfO5VUBayk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fi8wLPjfO5VUBayk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fi8wLPjfO5VUBayk .marker.cross{stroke:#333333;}#mermaid-svg-fi8wLPjfO5VUBayk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fi8wLPjfO5VUBayk p{margin:0;}#mermaid-svg-fi8wLPjfO5VUBayk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fi8wLPjfO5VUBayk .cluster-label text{fill:#333;}#mermaid-svg-fi8wLPjfO5VUBayk .cluster-label span{color:#333;}#mermaid-svg-fi8wLPjfO5VUBayk .cluster-label span p{background-color:transparent;}#mermaid-svg-fi8wLPjfO5VUBayk .label text,#mermaid-svg-fi8wLPjfO5VUBayk span{fill:#333;color:#333;}#mermaid-svg-fi8wLPjfO5VUBayk .node rect,#mermaid-svg-fi8wLPjfO5VUBayk .node circle,#mermaid-svg-fi8wLPjfO5VUBayk .node ellipse,#mermaid-svg-fi8wLPjfO5VUBayk .node polygon,#mermaid-svg-fi8wLPjfO5VUBayk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fi8wLPjfO5VUBayk .rough-node .label text,#mermaid-svg-fi8wLPjfO5VUBayk .node .label text,#mermaid-svg-fi8wLPjfO5VUBayk .image-shape .label,#mermaid-svg-fi8wLPjfO5VUBayk .icon-shape .label{text-anchor:middle;}#mermaid-svg-fi8wLPjfO5VUBayk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fi8wLPjfO5VUBayk .rough-node .label,#mermaid-svg-fi8wLPjfO5VUBayk .node .label,#mermaid-svg-fi8wLPjfO5VUBayk .image-shape .label,#mermaid-svg-fi8wLPjfO5VUBayk .icon-shape .label{text-align:center;}#mermaid-svg-fi8wLPjfO5VUBayk .node.clickable{cursor:pointer;}#mermaid-svg-fi8wLPjfO5VUBayk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fi8wLPjfO5VUBayk .arrowheadPath{fill:#333333;}#mermaid-svg-fi8wLPjfO5VUBayk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fi8wLPjfO5VUBayk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fi8wLPjfO5VUBayk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fi8wLPjfO5VUBayk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fi8wLPjfO5VUBayk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fi8wLPjfO5VUBayk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fi8wLPjfO5VUBayk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fi8wLPjfO5VUBayk .cluster text{fill:#333;}#mermaid-svg-fi8wLPjfO5VUBayk .cluster span{color:#333;}#mermaid-svg-fi8wLPjfO5VUBayk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fi8wLPjfO5VUBayk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fi8wLPjfO5VUBayk rect.text{fill:none;stroke-width:0;}#mermaid-svg-fi8wLPjfO5VUBayk .icon-shape,#mermaid-svg-fi8wLPjfO5VUBayk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fi8wLPjfO5VUBayk .icon-shape p,#mermaid-svg-fi8wLPjfO5VUBayk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fi8wLPjfO5VUBayk .icon-shape .label rect,#mermaid-svg-fi8wLPjfO5VUBayk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fi8wLPjfO5VUBayk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fi8wLPjfO5VUBayk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fi8wLPjfO5VUBayk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Yes
No
Yes
No
Yes
No
Yes
No
Yes
No
Yes
No
ExecProvider
配置?
AuthProvider
配置?
BearerTokenFile
配置?
BearerToken
设置?
Username/Password
设置?
TLS Client Cert
配置?
无认证
Exec 插件认证
AuthProvider 认证
Token 文件认证
(自动刷新)
Bearer Token 认证
Basic Auth
TLS 客户端证书