Kubelet、etcd、Controller 到底谁管什么?用人话讲透 K8s 架构

92 阅读4分钟

Kubernetes 就像一个自动化的“分布式工厂”,而 Kubelet、etcd、Controller 分别是现场工人、仓库账本和车间主管。它们不止各司其职,还在不停地联动,一旦任何一个出问题,全场都会“卡壳”。


你可能常听说这些词:

  • Kubelet 崩了,Pod 启不起来?
  • etcd 慢了,集群全卡?
  • Controller 失灵,副本数不对?

但它们到底谁负责干什么,怎么协同工作,怎么影响整个集群?这篇文章,带你用人话,一次讲透。


Kubernetes 架构就像一个自动化工厂

我们先换个角度,把 Kubernetes 想象成一个高效协作的“云上工厂”:

K8s 组件工厂角色干的事
etcd仓库 + 台账所有货物状态、任务列表、库存信息都记在这
Controller车间主管一直在看“应该有几个机器在干活”,不对劲就立刻调人
Kubelet一线工人按图纸干活,安装软件、启动容器、上报进度

想想就明白了:你让一个工厂生产 10 台机器,Controller 发现只在运行 7 台,就立刻安排新的;Kubelet 会负责把机器装好。仓库(etcd)记录“现在到底有几台、什么状态”,大家都依赖这个账本来行动。


etcd:这个账本没了,集群就瘫了

etcd 是 Kubernetes 的唯一数据库,所有资源对象都存储在这里,比如:

  • 你 apply 的 YAML 定义(Pod、Service、Deployment…)
  • 当前所有节点、容器、网络、证书的状态
  • 控制器的目标期望值

特点:

  • 是一个轻量的分布式 KV 存储(使用 Raft 算法保证强一致性)
  • 性能瓶颈多数出在磁盘 IO,建议配 NVMe
  • 是集群级的“单点真实源”(Single Source of Truth)

备份建议:

etcdctl snapshot save /backup/etcd-$(date +%s).db

📌 注意:很多集群“突然卡死”,其实不是 K8s 崩了,是 etcd 慢了、写不进了、磁盘爆了。


Controller:最操心的“车间主管”

Controller(控制器)是 Kubernetes 控制面的核心逻辑引擎。

你给系统下达了一个“我要 5 个 Nginx 副本”的命令,其实是 Controller 在:

  • 不停“观察”:现在到底有几个 Pod 正在运行?
  • 发现少了,就调用 API Server 补上
  • 多了,主动删掉

常见控制器:

  • ReplicaSet Controller(管理副本)
  • Deployment Controller(发布滚动更新)
  • HPA Controller(按指标自动伸缩)
  • Node Controller(判断节点挂了)

关键点:

  • 控制器是“理想派”:只关心期望和实际有没有差别
  • 实际部署动作不是它完成的,是 Kubelet 做的
  • 每个控制器只关注一种资源对象,并以“控制循环”运行

🔧 诊断技巧:

kubectl get events     # 看 Controller 有没有派单
kubectl describe deploy nginx-deploy  # 看控制器下发情况

Kubelet:真正落地干活的“前线工人”

Kubelet 是运行在每个 Node 上的 Agent,它负责 Pod 的生命周期管理。

它是唯一“干实事”的人,比如:

  • 看 API Server 发来的 Pod 定义
  • 调用 containerd / Docker 拉镜像、创建容器
  • 定期执行健康探针、挂载存储卷、配置网络
  • 监控 Pod 状态并上报

Kubelet 不关心副本数、不关心调度,它的工作是:

  1. 收到任务
  2. 想尽办法“让它跑起来”
  3. 状态回报 API Server

🔍 排查技巧:

journalctl -u kubelet -f    # 看 Kubelet 日志
crictl ps -a                # 查看容器运行情况

常见故障如:

  • 容器创建失败(镜像拉不下来、Volume 挂不稳)
  • CNI 出错,Pod 卡在 ContainerCreating
  • Kubelet 无法上报状态,节点变成 NotReady

用一次 Pod 创建讲清三者如何配合

你执行了:

kubectl apply -f nginx-deploy.yaml

幕后发生了什么?

  1. API Server 收到请求,把 YAML 写进 etcd。
  2. ReplicaSet Controller 发现目标是运行 3 个 Pod。
  3. 它发现现在是 0,就新建了 3 个 Pod 对象 → 写入 etcd。
  4. Scheduler 出场,决定 Pod 分配在哪些节点。
  5. 各个 Node 的 Kubelet 发现自己被分配了任务 → 拉镜像 → 起容器。
  6. Kubelet 把“我起好了”这件事回报 API Server → API Server 写进 etcd。
  7. Controller 验证目标和实际一致,一切 OK。

一个闭环就这样完成了。


故障排查顺序:按角色来找错最省事

问题先看谁工具
Pod 一直起不来Kubeletdescribe pod 看事件 / journalctl
Deployment 更新没生效Controllerkubectl get events
全集群卡顿 / 无法 get 资源etcdetcdctl alarm list + iostat
节点频繁 NotReadyKubelet检查网络 / 心跳间隔设置
自定义资源没触发动作Controllerkubectl logs <controller-pod>

总结:记住这 3 个核心角色的分工

组件本质类比出问题的典型表现
etcd存储系统仓库台账全局卡顿、状态混乱
Controller控制逻辑主管派单副本数不符、自动扩容失败
Kubelet执行器工人干活Pod 卡壳、容器不启动

记住一句话etcd 存信息,Controller 造理想,Kubelet 让它成真。


📌 写在最后

喜欢这种“把晦涩架构讲明白”的文章?欢迎 👍 收藏 + 分享给你的 DevOps 小伙伴,我们云端再见!