惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
Project Zero
Project Zero
D
DataBreaches.Net
I
InfoQ
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Vercel News
Vercel News
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
Intezer
The Hacker News
The Hacker News
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Scott Helme
Scott Helme
T
Threatpost
爱范儿
爱范儿
N
Netflix TechBlog - Medium
D
Docker
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
K
Kaspersky official blog
H
Help Net Security
S
Secure Thoughts
T
Threat Research - Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
G
Google Developers Blog
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
B
Blog
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
P
Privacy International News Feed
Spread Privacy
Spread Privacy
The Last Watchdog
The Last Watchdog

博客园 - 左扬

VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— VictoriaLogs 协同:Metrics 到 Logs 的一体化监控 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 源码阅读路线图:如何高效阅读 VM 源码 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 开源生态:VM 在 CNCF 生态中的位置 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比:Prometheus/InfluxDB/Thanos/VM VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 写入吞吐/查询延迟/内存占用的数学模型 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 模块依赖图——从 import 语句看组件关系 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Goroutine 池/atomic/零拷贝/sync.Pool VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 多租户架构——accountID/projectID 与 tenant 隔离 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 版本演进:1.146.0 LTS 重大更新解析 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 整体数据流:一条监控数据的完整生命周期 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 架构演进:从 TSDB 到 MergeSet 的设计取舍 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Single-Node vs Cluster 模式本质区别 VictoriaMetrics 1.146.0 源码【左扬精讲】—— 开篇总览 Rust 专题【左扬精讲】—— 从语法到灵魂:Ownership、Borrowing 与多语言对比 kubernetes 源码【左扬精讲】—— kube-scheduler 启动流程源码分析 Rust 专题【左扬精讲】—— 选择控制语句、运算符与格式化输出 Rust 专题【左扬精讲】—— 所有权详解 Rust 专题【左扬精讲】—— 作用域详解 Rust 专题【左扬精讲】—— 变量、常量与标量数据类型 kubernetes 源码 / Operator 专题【左扬精讲】—— Deployment Controller 源码分析:从对象创建到滚动更新 kubernetes 源码 / Operator 专题【左扬精讲】—— Operator 开发中的 Webhook:从准入控制到生产部署 Kubernetes源码 / Operator 专题【左扬精讲】—— 实现 Application Controller:从零构建生产级控制器 Kubernetes 编程 / Operator 专题【左扬精讲】—— 定义 Application 资源 + 添加自定义新 API 完整指南 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八):内部架构与核心组件 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八): —— 从入口到调度的全链路源码剖析(k8s v1.36.1) DeepSeek-R1 多模态 R1 / VLM-GRPO【左扬精讲】—— Qwen2-VL 微调与视觉推理强化学习实战 DeepSeek-R1 工业 RAG + 微调混合系统【左扬精讲】—— R1 系列收官之作:从 Prompt → RAG → 微调 选型决策树 DeepSeek-R1 推理时扩展【左扬精讲】—— o1 / R1 慢思考机制:Self-Consistency + ToT + PRM 详解 DeepSeek-R1 端侧 LLM 工程【左扬精讲】—— llama.cpp 调参与 Apple Silicon / 国产 NPU / Android 端侧落地全攻略 DeepSeek-R1 vLLM + k8s 生产部署【左扬精讲】—— 从单卡 7B 到 100 卡 671B MoE 集群的工业化部署实战 DeepSeek-R1 评估与系统(Evaluation & Systems)【左扬精讲】—— 从 GSM8K/MMLU 到 LLM-as-Judge 的工业级评估方法论 DeepSeek-R1 模型训练与算法【左扬精讲】—— GRPO 进阶算法:DAPO / PRIME / RLVR / PRM 四大 2025 前沿改进 DeepSeek-R1 模型训练与算法【左扬精讲】—— 数据蒸馏:用 DeepSeek-R1-671B 生成 800K 高质量 CoT 样本的完整流水线 DeepSeek-R1 优化与微调实战【左扬精讲】—— 从 R1 强化学习新范式到 GRPO 微调一站式入门 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 七):自定义插件开发实战 —— 手写一个 Score 插件并注册到集群 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 六):Scheduler Profile 与多调度器 —— 如何配置多个 profile 实现多租户、Coordinated LeaderElection Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 五):SchedulingQueue 与 QueueingHint —— 三段队列的细节、v1.36 新引入的 QueueingHint 工作机制 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 四):抢占(Preemption)算法剖析 —— DefaultPreemption 如何选 victim、PodDisruptionBudget 如何约束 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 二):内置插件逐个精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件 逐个精读 k8s 源码级精讲(二十六):调度器内置插件逐个精读 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):Scheduling Framework 扩展点逐个源码拆解 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):初识调度模型、内部架构与事件驱动机制 Kubernetes 编程 / client-go 专题【左扬精讲】—— 四种客户端:为什么、怎么选、怎么用 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime、kubebuilder、operator-sdk 三大框架深度对比 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入理解 ManagedFields 字段冲突协调机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Finalizers 深度解析:对象的生命周期与删除控制 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference 字段与级联删除机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入学习 Server-Side Apply:managedFields 替代 last-applied-configuration 的演进方向 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Annotations 与元数据体系(Operator 专题) Kubernetes 编程 / Operator 专题【左扬精讲】—— RESTMapper:把 Group / Version / Kind / Resource 四元组翻译成 REST 路径的"查字典"大师 Kubernetes 编程 / Operator 专题【左扬精讲】—— Converter 资源版本转换器 Kubernetes 编程 / Operator 专题【左扬精讲】—— Application 业务扩展:从单 Deployment 到多 Workload 的复合 Operator 演进 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference / Finalizer / 准入控制:k8s 资源生命周期的三大支柱 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime 框架内幕:从 Manager 到 Reconcile 的全栈拆解 Kubernetes 编程 / Operator 专题【左扬精讲】—— 生产级 Operator 最佳实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— application-operator Reconcile 循环源码精讲:从 client-go Informer 到 workqueue 的全链路解剖 Kubernetes 编程 / Operator 专题【左扬精讲】—— 从零搭建一个 application-operator 新项目:脚手架、API 设计与基于原生 DeploymentStatus/ServiceStatus 的状态建模 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:生产级 Controller 实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析: Controller 调试与诊断工具:从日志分析到问题定位 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DynamicClient 操作 CRD:无需代码生成的动态操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:控制器与 APIServer 完整交互流程:从 Watch 到缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:错误处理与重试机制:WorkQueue 限速器详解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Leader 选举机制:高可用控制器的必备技能 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Controller 开发模式完整实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:SharedInformerFactory 与等待缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:从认证配置到 Deployment 操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:版本对应、架构组件与组件关系 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Informer 源码深度解析:从底层原理到实战应用 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Reflector 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:ListWatcher 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Indexer 与 ThreadSafeStore 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DeltaFIFO 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:workqueue 核心原理与实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— runtime.Codec 资源编解码:serializer 与 codec 差异、编解码数据结构、codec 核心调用链路 Kubernetes 编程 / Operator 专题【左扬精讲】—— Scheme 资源注册机制全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 自定义资源的内部版本与外部版本:从源码看版本定义机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 1.36.1 核心 API 数据结构全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 构建过程 【AIOPS】一文读懂LLM【左扬精讲】:从诞生到普及,解锁大语言模型的核心密码 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Hooks 源码精讲:Hooks 可观测性的无侵入式实现 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 配置解析源码精讲 ——SRE 自定义 Agent 核心技巧 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 并发模型解析 ——SRE 应对高并发采集的调优思路 【AIOPS】AI Agent 专题【左扬精讲】基础架构篇:MCP-VictoriaMetrics Golang 源码整体架构拆解 ——SRE 必懂的核心模块与数据流 OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(下篇)—— 预测式弹性扩缩容 Operator 落地实现) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(上篇)—— 时序预测模型构建与离线训练) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3(上篇)—— 面向 AI / 算力调度场景:GPU 竞价实例资源池统一调度管理 Operator 开发 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目 2 —— 面向零售 / 电商潮汐流量难题:多云多集群数据中心级全链路弹性伸缩 DataCenter Scaler Operator 从 0 到 1 全链路开发 Kubernetes编程 / Operator专题【左扬精讲】—— 深入理解Kubebuilder注解:为什么Operator开发离不开这些特殊注释 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目1 —— Applicaion Operator(通用应用生命周期管理 Operator 实战) Pod 镜像拉取失败?kubectl edit pods修改镜像地址的底层原理与实操 (该方法仅为临时应急方案,并非长期解决方案) 【AIOPS】AI Agent 专题【左扬精讲】模型微调实战:一站式平台 LLaMA-Factory 【AIOPS】AI Agent 专题【左扬精讲】基于 k8s+vLLM+Ray 分布式部署全指南:架构设计、资源调度与性能优化 【AIOPS】AI Agent专题【左扬精讲】非量化版DeepSeek分布式部署全指南:精度保障、显存规划与Ollama/vLLM选型 【AIOPS】AI Agent 专题【左扬精讲】零开发框架实现 ReAct Agent(Go SRE友好)
Kubernetes编程/Operator专题精讲—— 理解控制器模式 —— 控制器模式的核心原理与实现逻辑(从原理到实践)
左扬 · 2026-01-26 · via 博客园 - 左扬

Kubernetes编程/Operator专题精讲—— 理解控制器模式 —— 控制器模式的核心原理与实现逻辑(从原理到实践)

        在 Kubernetes(k8s)的生态体系中,控制器模式是实现 声明式 API 的核心基石,也是理解 K8s 自愈能力、自动化运维的关键

        你日常使用的 Deployment、StatefulSet、Service 等资源的自动化管理,本质上都是控制器模式的具体落地。

        本文将从控制器模式的核心原理出发,解析 kube-controller-manager 的作用,以 Deployment 为例拆解其创建流程,并深入讲解 Operator 模式的实现逻辑与实践。

一、控制器模式的核心原理

1.1、核心思想:调和循环(Reconciliation Loop)

Kubernetes 的控制器模式本质是实现 实际状态(Actual State)期望状态(Desired State)无限逼近的闭环控制系统,核心逻辑可概括为:

观察(Observe)→ 对比(Compare)→ 行动(Act)
      • 观察:通过 k8s API Server 获取资源的实际状态(如 Pod 的运行数量、节点状态);
      • 对比:将实际状态与用户通过 YAML 声明的期望状态对比,找出差异;
      • 行动:通过调用 k8s API 执行操作(如创建 / 删除 Pod、更新资源标签),消除状态差异。

这个循环被称为“调和循环”(Reconciliation Loop),是所有 k8s 控制器的通用骨架,其核心目标是 最终一致性 —— 不保证立即达到期望状态,但会持续尝试直到状态匹配。

1.2、控制器模式的核心组件

一个标准的 k8s 控制器通常包含以下核心模块: 

模块 作用说明
Informer 监听 API Server 的资源事件(增 / 删 / 改),缓存资源数据,避免频繁请求 API Server
WorkQueue 异步处理资源事件的任务队列,实现 解耦削峰填谷
Sync/Reconcile 函数 核心业务逻辑,实现 “观察 - 对比 - 行动” 的核心逻辑
Client 与 API Server 交互的客户端(如 client-go),用于读写 k8s 资源

二、kube-controller-manager:核心控制器的总管家

        kube-controller-manager 作为 Kubernetes 控制平面的 核心管控中枢,是实现集群 声明式 API  状态自洽 的关键组件。它本身不执行具体管控逻辑,而是通过独立 goroutine 运行多个专业控制器,统一监听 apiserver 的资源状态变化,持续对比 期望状态  实际状态,一旦发现偏差立即触发 纠偏操作,最终让集群始终贴合用户定义的状态。

        其核心运行逻辑可概括为:监听(apiserver)→ 对比(状态)→ 纠偏(操作)→ 反馈(更新),所有内置控制器均遵循这一通用逻辑,仅针对不同资源的管控细节做差异化实现。下面结合文字解析 + 时序图,详细讲解其整体工作流程和六大核心控制器的具体实现。

2.1、核心架构

kube-controller-manager 的核心运行逻辑,就是 以标准化的监听 - 队列 - 处理框架为基础,通过声明式调和逻辑,让集群的实际状态最终贴合用户定义的期望状态,这也是 Kubernetes 自动化运维的底层核心。

kube-controller-manager 运行在控制平面节点,与 kube-apiserver、kube-scheduler 并称 控制平面三个核心,其核心架构特点:

    • 与 apiserver 单向交互:所有控制器仅通过 apiserver 读写集群资源,不直接与节点 / 容器交互,保证集群管控的中心化和安全性;
    • 控制器独立运行:每个控制器都是一个独立 goroutine,轻量级、无状态,互不阻塞,单个控制器故障不影响其他控制器运行;
    • 基于 监听 -> 队列 -> 处理 模型:通过 apiserver 的 List/Watch API 监听资源变化,变化事件存入本地工作队列,控制器从队列中取事件逐一处理,避免并发冲突。 

      image

2.2、通用工作时序图(所有控制器的基础执行逻辑) 

┌───────────────┐        ┌──────────────────┐        ┌──────────────────────┐
│  用户/其他组件  │        │   kube-apiserver │        │ kube-controller-manager │
└───────┬───────┘        └─────────┬────────┘        └──────────┬─────────┘
        │                          │                            │
        │ 1、定义期望状态(创建/更新资源) │                         │
        │ ──────────────────────────→                           │
        │                          │                            │
        │                          │ 2、资源状态变更,触发Watch事件 │
        │                          │ ───────────────────────────→
        │                          │                            │
        │                          │                            │ 3、控制器接收事件,对比 期望状态 与 实际状态
        │                          │                            │    (从apiserver拉取最新实际状态)
        │                          │ ←───────────────────────────
        │                          │                            │
        │                          │                            │ 4、发现状态偏差,执行纠偏操作(调用apiserver API)
        │                          │ ←───────────────────────────
        │                          │                            │
        │                          │ 5、apiserver执行操作,更新资源实际状态 │
        │                          │                            │
        │                          │ 6、状态更新完成,反馈给控制器  │
        │                          │ ───────────────────────────→
        │                          │                            │
        │                          │                            │ 7、控制器确认状态一致,结束本次管控流程
└───────────────┘        └──────────────────┘        └──────────────────────┘

帮助 SRE 理解关键核心点: 

      • Watch 机制:基于 HTTP 长连接的 推模式,apiserver 主动向控制器推送资源变化,而非控制器轮询,提升响应效率;
      • 工作队列:控制器将 Watch 到的事件存入本地队列,采用 先入先出 模式处理,避免高并发下的事件丢失和重复处理;
      • 状态对比:控制器的核心工作是 状态校验,而非直接执行操作,所有实际操作(如创建 Pod、删除节点)均通过调用 apiserver 的 API 完成。

2.3、第一层:Informer 组件(监听与事件预处理)

Informer 是 控制器  apiserver 之间的桥梁,核心作用是高效监听资源变化,并对事件做预处理,避免控制器直接面对复杂的 Watch 流。

2.3.1、核心能力

      • List + Watch 组合:
        • 启动时先执行 List 请求,拉取资源的全量数据,初始化本地缓存(Store);
        • 之后通过 Watch 长连接,接收 apiserver 推送的资源增量变化(创建、更新、删除),实时更新本地缓存。
      • 事件去重 / 防抖:同一资源短时间内多次变化(如 1 秒内 Pod 状态更新 5 次),Informer 会合并为一次事件,避免控制器重复处理;
      • 本地缓存:所有资源状态都缓存在控制器本地(Store),控制器查询状态时优先读缓存,而非每次调用 apiserver,大幅降低 apiserver 压力。

2.3.2、关键意义

Informer 屏蔽了 apiserver Watch API 的底层细节(如重连、分片、事件乱序),让控制器只需关注 资源变化事件,无需处理网络异常、事件重复等问题。

2.4、第二层:WorkQueue 工作队列(解耦与削峰)

WorkQueue 是控制器的 事件缓冲区核心作用是解耦 Informer 的事件生产和 Handler 的事件消费,实现削峰填谷。

2.4.1、核心能力

      • FIFO 有序消费:事件按接收顺序入队,控制器按顺序处理,避免并发冲突;
      • 重试机制:处理失败的事件会重新入队(可配置重试次数 / 延迟),保证事件不丢失;
      • 限速队列(RateLimitingQueue):默认使用限速队列,避免某一资源频繁失败导致队列被占满(如 Pod 创建失败后无限重试);
      • 键值存储:队列中仅存储资源的 唯一标识(如 namespace/name),而非完整资源对象,减少内存占用。

2.4.2、关键意义

即使 apiserver 短时间推送大量事件(如集群扩容时 1000 个 Pod 同时创建),WorkQueue 也能缓存这些事件,控制器按自身处理能力逐步消费,避免控制器过载崩溃。 

2.5、第三层:Handler 处理函数(核心逻辑执行)

Handler 是控制器的 大脑,核心作用是实现 状态对比 - 纠偏 的核心逻辑,也是不同控制器差异化的核心所在。执行流程(所有控制器通用):

      • 从队列取事件:每次从 WorkQueue 取出一个资源标识(如 default/nginx-rc);
      • 读本地缓存 + 校验:从 Informer 本地缓存读取该资源的最新状态,若资源已被删除(如 RC 已被删),则直接跳过;
      • 拉取实际状态:针对需要管控的关联资源(如 RC 对应的 Pod),调用 apiserver 拉取 实际状态(如当前运行的 Pod 数量);
      • 状态对比:对比 期望状态(如 RC 中定义的 replicas: 3)和 实际状态(如当前只有 2 个 Pod);
      • 执行纠偏操作:若状态不一致,调用 apiserver API 执行纠偏(如创建 1 个新 Pod);
      • 确认结果:操作完成后,再次检查状态,确保纠偏生效。

三、六大控制器详解

kube-controller-manager 内置的六大核心控制器各司其职,覆盖节点、Pod、Service、命名空间等核心资源的全生命周期管控,下面逐一讲解其 核心作用、工作机制、时序图 和 实际应用场景 

3.3.1、节点控制器(Node Controller)—— 集群节点的健康哨兵

3.3.1.1、核心作用

监控集群所有节点的健康状态,自动识别节点故障,触发节点标记和 Pod 驱逐,保证集群节点的可用性和业务连续性。

        • 节点心跳检查间隔:5s
        • 节点失联标记阈值(Unknown):40s(node-monitor-grace-period)
        • 故障节点 Pod 驱逐阈值:5min(pod-eviction-timeout)
3.3.1.2、工作时序图
┌──────────────┐         ┌──────────────────┐       ┌──────────────────────┐
│    kubelet   │         │   kube-apiserver │       │   Node Controller    │
└───────┬──────┘         └─────────┬────────┘       └──────────┬─────────┘
        │                          │                           │
        │ 1、正常向apiserver上报节点状态(心跳+资源使用)            │
        │ ──────────────────────────>                          │
        │                          │                           │
        │ 2、节点故障(宕机/网络中断),停止上报心跳                   │
        │                          │                           │
        │                          │ 3、控制器Watch到节点状态无更新,开始计时
        │                          │ ───────────────────────────>
        │                          │                           │
        │                          │                           │ 4、达到40s阈值,将节点标记为Unknown状态(调用apiserver)
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │ 5、继续计时,等待5min驱逐阈值 │
        │                          │                           │
        │                          │                           │ 6、阈值到达,检查节点上Pod的控制器归属(是否属于Deployment/RS)
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │                           │ 7、对有控制器的Pod,触发驱逐(通知apiserver删除故障节点上的Pod)
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │ 8、apiserver更新Pod状态,触发kube-scheduler重新调度
        │                          │                           │
        │                          │                           │ 9、新Pod在健康节点创建,控制器确认节点故障处理完成
└──────────────┘        └──────────────────┘        └──────────────────────┘
3.3.1.3、核心工作机制
        • 心跳监控:通过 apiserver 监听 kubelet 上报的节点状态,持续获取节点的存活状态、资源使用情况;
        • 故障识别:节点超过阈值无心跳,立即标记为 Unknown,避免新的 Pod 被调度到故障节点;
        • Pod 驱逐:故障节点达到驱逐阈值后,仅驱逐有控制器管理的 Pod(无控制器的静态 Pod 不会被驱逐);
        • 节点恢复:若故障节点恢复并重新上报心跳,控制器会将其标记为 Ready,重新纳入集群调度。
3.3.1.4、常见场景

集群某节点因硬件故障宕机,Node Controller 会在 5 分 40 秒 后自动将该节点上的业务 Pod 驱逐,kube-scheduler 会将这些 Pod 重新调度到其他健康节点,保证业务不中断。

3.3.2、副本控制器(Replication Controller,RC)—— 保障期望的 Pod 副本数量

3.3.2.1、核心作用 

保证指定数量的 Pod 副本始终运行,是 Deployment、ReplicaSet 的底层实现基础(ReplicaSet 是 RC 的升级版,支持更丰富的标签选择器,逻辑与 RC 完全一致)。 

3.3.2.2、工作时序图
┌───────────────┐        ┌──────────────────┐        ┌──────────────────────┐
│  用户定义RC   │        │   kube-apiserver   │        │ Replication Controller │
└───────┬───────┘        └─────────┬────────┘        └──────────┬─────────┘
        │                          │                            │
        │ 1、创建RC,指定replicas:3 + Pod模板 + 标签选择器          │
        │ ──────────────────────────>                           │
        │                          │                            │
        │                          │ 2、Watch到RC创建事件,推送给控制器
        │                          │ ───────────────────────────>
        │                          │                           │
        │                          │                           │ 3、控制器通过标签选择器查询实际运行的Pod数(初始为0)
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │                           │ 4、发现实际数(0) < 期望数(3),触发创建Pod操作(调用apiserver,基于Pod模板创建3个Pod)
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │ 5、apiserver创建Pod,触发kube-scheduler调度
        │                          │                           │
        │                          │ 6、Pod调度到节点并运行,kubelet上报Pod状态为Running
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │ 7、控制器Watch到Pod状态更新,重新查询实际Pod数(3)
        │                          │ ───────────────────────────>
        │                          │                           │
        │                          │                           │ 8、实际数=期望数,状态一致,结束本次处理
        │                          │                           │
        │                          │                           │ 9、若某Pod异常退出(实际数变为2),控制器立即补建1个Pod,恢复副本数为3
        │                          │ <───────────────────────────
└───────────────┘        └──────────────────┘        └──────────────────────┘
3.3.2.3、核心工作机制
        • 标签匹配:通过 标签选择器 筛选归属于当前 RC 的 Pod,仅对匹配的 Pod 进行副本数管控;
        • Pod 模板:当需要补建 Pod 时,直接基于 RC 中定义的 Pod 模板创建,保证新 Pod 与原有 Pod 配置一致;
        • 实时监控:Pod 发生异常退出、被手动删除、节点故障等情况,控制器会立即感知并补建,无需人工干预。
3.3.2.4、常见场景

用户创建 RC 部署 3 个 Nginx Pod,其中 1 个 Pod 因容器崩溃退出,RC 会在几秒内自动新建 1 个 Nginx Pod,始终保持 3 个副本运行。 

3.3.3、端点控制器(Endpoint Controller)—— Service <——> Pod

3.3.3.1、核心作用
        • 维护 Endpoints 资源(Service 与 Pod 的映射关系表,存储匹配的 Pod IP:Port),是 Service 能实现 负载均衡 和 Pod 访问 的核心,也是 kube-proxy 配置转发规则的依据。
        • 标签匹配 + 映射更新:监听 Service 和 Pod 的变化,自动将匹配 Service 标签的 Pod 地址加入 Endpoints,将不匹配 / 已删除的 Pod 地址从 Endpoints 中移除。
3.3.3.2、工作时序图
┌───────────────┐        ┌──────────────────┐        ┌──────────────────────┐
│ Service/Pod   │        │   kube-apiserver   │        │ Endpoint Controller  │
└───────┬───────┘        └─────────┬────────┘        └──────────┬─────────┘
        │                          │                            │
        │ 1、创建Service,指定标签选择器app:nginx                   │
        │ ──────────────────────────>                           │
        │                          │                            │
        │ 2、创建3个带app:nginx标签的Pod并运行                      │
        │ ──────────────────────────>                           │
        │                          │                            │
        │                          │ 3、Watch到Service和Pod创建事件,推送给控制器
        │                          │ ───────────────────────────>
        │                          │                            │
        │                          │                            │ 4、控制器通过Service的标签选择器,筛选出匹配的3个Pod
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │                            │ 5、创建/更新Endpoints资源,写入3个Pod的IP:Port
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │ 6、kube-proxy Watch到Endpoints变化,更新节点iptables/IPVS规则
        │                          │ ───────────────────────────>
        │                          │                           │
        │                          │                           │ 7、若1个Pod异常删除,控制器立即从Endpoints中移除其IP:Port
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │ 8、kube-proxy同步更新转发规则,避免访问到已删除的Pod
└───────────────┘        └──────────────────┘        └──────────────────────┘
3.3.3.3、核心工作机制
        • 双向监听:同时监听 Service 和 Pod 资源的创建、更新、删除事件,任何一方变化都会触发映射检查;
        • Endpoints 与 Service 强绑定:一个 Service 对应一个同名的 Endpoints 资源,存储在同一命名空间;
        • 无状态更新:仅维护地址映射,不参与实际的流量转发,流量转发由节点上的 kube-proxy 完成。
3.3.3.4、常见场景

用户访问 Service 的 ClusterIP 时,请求会通过 kube-proxy 的转发规则,转发到 Endpoints 中的任意一个 Pod IP,实现 Service 对 Pod 的透明访问和负载均衡。 

3.3.4、命名空间控制器(Namespace Controller)—— 命名空间的生命周期管家 

3.3.4.1、核心作用
        • 管理命名空间的全生命周期,包括创建、更新、删除,核心是处理命名空间的删除逻辑,保证命名空间删除时,其下的所有资源被递归清理。
        • 命名空间删除为异步操作,不会立即删除,而是先标记为 Terminating 状态,直到所有子资源清理完成后,才最终删除命名空间。
3.3.4.2、工作时序图
┌───────────────┐        ┌──────────────────┐        ┌──────────────────────┐
│  用户操作NS    │        │   kube-apiserver │        │ Namespace Controller │
└───────┬───────┘        └─────────┬────────┘        └──────────┬─────────┘
        │                          │                            │
        │ 1、执行kubectl delete ns test                          │
        │ ──────────────────────────>                           │
        │                          │                            │
        │                          │ 2、将ns/test标记为Terminating状态,推送给控制器 │
        │                          │ ───────────────────────────>
        │                          │                            │
        │                          │                            │ 3、控制器查询ns/test下的所有资源(Pod/Service/RC等)
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │                            │ 4、递归删除所有子资源(按依赖顺序:先删除RC,再删除Pod,最后删除Service/ConfigMap等)
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │ 5、逐个删除资源,持续检查子资源剩余数量
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │                            │ 6、确认ns/test下无任何子资源
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │                            │ 7、最终删除ns/test资源,解除Terminating状态
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │ 8、命名空间删除完成,事件推送给apiserver
└───────────────┘        └──────────────────┘        └──────────────────────┘
3.3.4.3、核心工作机制
        • 状态标记:命名空间删除的第一步是标记为 Terminating,防止新资源被创建到该命名空间;
        • 递归清理:按 资源依赖顺序 清理子资源,避免因资源依赖导致删除失败;
        • 卡点处理:若某子资源删除失败(如 Pod 一直处于 Terminating 状态),命名空间会卡在 Terminating 状态,需手动排查并清理卡点资源。
3.3.4.4、常见场景

用户删除测试命名空间 test,Namespace Controller 会自动清理该命名空间下的所有测试 Pod、Service、RC 等资源,无需人工逐个删除,避免集群资源残留。

3.3.5、服务账号控制器(ServiceAccount Controller)—— 集群的身份凭证管理员

3.3.5.1、核心作用
      • 管理集群中的 ServiceAccount(服务账号)和对应的 Secret 令牌,为 Pod 提供访问 kube-apiserver 的身份认证凭证,实现 Pod 与 apiserver 的安全交互。
      • 默认创建 + 凭证自动挂载:为每个命名空间自动创建 default 服务账号,为每个 ServiceAccount 自动创建对应的 Secret 令牌,Pod 若未指定 ServiceAccount,会自动挂载 default 账号的令牌。
3.3.5.2、工作时序图
┌───────────────┐        ┌──────────────────┐        ┌──────────────────────┐
│ 命名空间/Pod   │        │   kube-apiserver │        │ ServiceAccount Controller │
└───────┬───────┘        └─────────┬────────┘        └──────────┬─────────┘
        │                          │                            │
        │ 1、创建新命名空间 ns/test                                │
        │ ──────────────────────────>                           │
        │                          │                            │
        │                          │ 2、Watch到NS创建事件,推送给控制器
        │                          │ ───────────────────────────>
        │                          │                            │
        │                          │                            │ 3、为ns/test自动创建default ServiceAccount
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │                            │ 4、为default ServiceAccount自动创建Secret令牌(包含JWT认证信息)
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │ 5、在ns/test中创建Pod,未指定ServiceAccount 
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │                            │ 6、控制器自动将default ServiceAccount的Secret令牌挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount目录
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │ 7、Pod内应用通过挂载的令牌,向apiserver发起认证并请求API
        │                          │ <───────────────────────────
        │                          │                            │
        │                          │ 8、若删除ServiceAccount,控制器自动删除对应的Secret令牌
        │                          │ <───────────────────────────
└───────────────┘        └──────────────────┘        └──────────────────────┘
3.3.5.3、核心工作机制
      • 默认初始化:集群中每个命名空间都有且仅有一个 default 服务账号,由控制器保证其存在;
      • 凭证自动生成:ServiceAccount 与 Secret 令牌一一对应,令牌为 JWT 格式,包含认证所需的所有信息;
      • 无感知挂载:Pod 无需任何额外配置,即可自动挂载 default 账号的令牌,实现与 apiserver 的无缝认证。
3.3.5.4、常见场景

Pod 内的监控应用(如 Prometheus)需要查询集群的 Pod 列表和节点状态,应用会通过挂载的令牌向 apiserver 认证,通过后即可调用 k8s API 获取所需信息。  

3.3.6、垃圾回收控制器(Garbage Collector)—— 集群的资源垃圾回收

3.3.6.1、核心作用
      • 清理集群中的孤儿资源(无所有者、无被引用的资源),基于所有者引用(OwnerReference) 机制工作,避免集群资源泄露。
      • 所有者引用:资源之间的父子依赖关系,如 Deployment → ReplicaSet → Pod,子资源的 OwnerReference 会指向父资源,标记其归属。
3.3.6.2、工作时序图
┌───────────────┐        ┌──────────────────┐        ┌──────────────────────┐
│ 父资源/子资源   │        │   kube-apiserver │        │ Garbage Collector    │
└───────┬───────┘        └─────────┬────────┘        └──────────┬─────────┘
        │                          │                            │
        │ 1、创建Deployment,自动创建RS,RS自动创建Pod(均设置OwnerReference)
        │ ──────────────────────────>                          │
        │                          │                           │
        │ 2、执行kubectl delete deploy test(默认cascade=true)
        │ ──────────────────────────>                          │
        │                          │                           │
        │                          │ 3、Watch到Deployment删除事件,推送给控制器
        │                          │ ───────────────────────────>
        │                          │                           │
        │                          │                           │ 4、控制器通过OwnerReference,查询到Deployment的子资源RS
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │                           │ 5、先删除子资源RS
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │                           │ 6、再通过OwnerReference查询到RS的子资源Pod,删除所有Pod
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │                           │ 7、检查是否有孤儿资源(无OwnerReference的资源),发现1个手动创建的无归属Pod
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │                           │ 8、自动删除该孤儿Pod,释放节点资源
        │                          │ <───────────────────────────
        │                          │                           │
        │                          │ 9、所有依赖资源和孤儿资源清理完成
└───────────────┘        └──────────────────┘        └──────────────────────┘
3.3.6.3、核心机制
      • 级联删除:删除父资源时,默认会递归删除其所有子资源(cascade=true),若设置 cascade=false,则仅删除父资源,子资源变为孤儿资源;
      • 孤儿资源检测:定期扫描集群资源,识别无 OwnerReference 且长期未被使用的资源,自动清理;
      • 引用计数:对于被多个资源引用的资源(如 ConfigMap 被多个 Pod 引用),仅当引用数为 0 时,才会被清理。
3.3.6.4、常见场景

用户手动创建了一个 Pod 用于测试,测试完成后忘记删除,该 Pod 异常退出后成为孤儿资源,垃圾回收控制器会在一定时间后自动清理该 Pod,释放节点的 CPU / 内存资源。