Kubernetes 架构剖析:Master 节点与 Worker 节点组件
Kubernetes 的架构,说白了就是「大脑」加「手脚」的配合。Master 节点负责决策,Worker 节点负责干活。我刚开始接触 K8s 时,总觉得组件太多记不住。后来拆开来看,其实每个组件各司其职,逻辑非常清晰。
下面这张图是我自己总结的 K8s 核心架构,你先有个整体印象。
Master 节点:集群的大脑
Master 节点上跑着四个核心组件:API Server、Scheduler、Controller Manager 和 etcd。它们共同构成了控制平面。我个人习惯把 Master 节点比作「机场塔台」——它不直接开飞机,但所有起降指令都从这儿发出。
API Server
API Server 是集群的唯一入口。所有组件、kubectl、外部系统,都得通过它来跟集群打交道。它负责三件事:认证你是谁、授权你能干什么、准入控制检查你的请求是否合规。
我的经验:API Server 是无状态的,你可以水平扩展。我曾经在生产环境压测时发现 API Server 成了瓶颈,后来加了负载均衡和缓存,吞吐量直接翻倍。
API Server 背后是 etcd,所有数据都持久化在这里。你想想看,如果 etcd 挂了,整个集群就失忆了。所以 etcd 一定要做备份,我建议至少 3 节点起步。
Scheduler
Scheduler 负责把新创建的 Pod 分配到合适的 Worker 节点上。它怎么选?说白了就是两步:先过滤(Filter),再打分(Score)。
- 过滤阶段:排除不满足条件的节点,比如资源不足、端口冲突、污点不匹配。
- 打分阶段:对剩余节点按策略打分,选最高分的那个。
默认调度策略考虑的是资源均衡。但我遇到过一种情况:某些 Pod 对网络延迟特别敏感,这时候就得用自定义调度器,或者给节点打标签做亲和性调度。
避坑指南:我曾经在生产环境遇到过调度「风暴」——同时创建几百个 Pod,Scheduler 压力暴增,调度延迟从毫秒级变成秒级。后来加了调度队列的限流,才稳住。
Controller Manager
Controller Manager 是一个控制器集合。它里面跑着几十个控制器,比如 Node Controller、Replication Controller、Endpoint Controller 等等。每个控制器都在自己的循环里不断检查「当前状态」和「期望状态」是否一致,不一致就调协。
举个例子:你声明了 3 个副本,某个 Pod 挂了,Replication Controller 检测到实际只有 2 个,就会立即创建第 3 个。整个过程不需要人工干预。
etcd
etcd 是分布式键值存储,存的是集群的「真相」。所有组件的状态、配置、元数据,全在 etcd 里。它基于 Raft 协议保证一致性。
嗯,这里要注意:etcd 对磁盘 IO 很敏感。我见过有人把 etcd 跑在机械盘上,结果集群频繁超时。建议用 SSD,并且单独挂载。
Worker 节点:集群的手脚
Worker 节点是真正跑业务的地方。每个 Worker 节点上都有三个核心组件:kubelet、kube-proxy 和容器运行时。
kubelet
kubelet 是 Master 派到 Worker 节点上的「监工」。它负责管理本节点上的 Pod 生命周期——创建、启动、监控、重启、销毁。
kubelet 定期向 API Server 汇报节点状态和 Pod 状态。如果某个 Pod 挂了,kubelet 会尝试重启它。但如果重启多次还失败,kubelet 会把状态标记为 CrashLoopBackOff。
我的经验:排查 Pod 起不来时,第一件事就是看 kubelet 日志。我遇到过好几次,问题出在容器镜像拉取失败,但 kubelet 日志里写得清清楚楚。
kube-proxy
kube-proxy 负责实现 Service 的负载均衡。它监听 API Server 上 Service 和 Endpoint 的变化,然后更新本机的 iptables 或 IPVS 规则。
说白了,当你访问一个 Service 的 ClusterIP 时,流量会被 kube-proxy 设置的规则转发到后端的某个 Pod 上。默认模式是 iptables,性能一般但稳定。如果对性能有要求,可以切到 IPVS 模式。
避坑指南:我曾经在大型集群里遇到 iptables 规则过多导致性能下降的问题。几万个 Service 的规则,iptables 查表越来越慢。后来切到 IPVS 模式,延迟降了 80%。
容器运行时
容器运行时负责真正拉取镜像、启动容器。Kubernetes 通过 CRI(Container Runtime Interface)与运行时交互。常见的运行时包括 Docker、containerd、CRI-O。
你可能会问:Docker 不是被 Kubernetes 弃用了吗?其实弃用的是 dockershim,不是 Docker 本身。如果你用 containerd 作为运行时,性能更好,也更轻量。
组件协作流程
咱们走一遍完整的流程,看看这些组件是怎么配合的:
- 你执行
kubectl create deployment nginx --image=nginx:latest - kubectl 把请求发给 API Server
- API Server 认证、授权、准入检查通过后,把 Deployment 对象写入 etcd
- Controller Manager 中的 Deployment Controller 检测到新的 Deployment,创建 ReplicaSet
- ReplicaSet Controller 检测到副本数为 0,创建 Pod 对象
- Scheduler 监听到新的未调度 Pod,经过过滤和打分,选择一个 Worker 节点
- Scheduler 把绑定结果写回 API Server,更新 Pod 的 nodeName 字段
- 目标 Worker 节点上的 kubelet 监听到 Pod 被调度到自己身上
- kubelet 通过 CRI 调用容器运行时,拉取镜像、启动容器
- kube-proxy 更新 iptables 规则,确保 Service 能路由到新 Pod
整个过程看起来步骤多,但实际上从你敲命令到 Pod 运行,通常只需要几秒钟。这就是 Kubernetes 的魅力——复杂但高效。
组件对比速查表
| 组件 | 所属节点 | 核心职责 | 通信方式 |
|---|---|---|---|
| API Server | Master | 集群入口,认证/授权/准入 | REST API |
| Scheduler | Master | Pod 调度决策 | Watch API Server |
| Controller Manager | Master | 控制器循环,维持期望状态 | Watch API Server |
| etcd | Master | 分布式存储,集群状态持久化 | gRPC |
| kubelet | Worker | 节点代理,管理 Pod 生命周期 | Watch API Server |
| kube-proxy | Worker | 网络代理,Service 负载均衡 | Watch API Server |
| Container Runtime | Worker | 容器运行环境 | CRI |
总结一下:Master 节点管决策,Worker 节点管执行。API Server 是枢纽,etcd 是记忆,Scheduler 是调度员,Controller Manager 是监工,kubelet 是现场执行人,kube-proxy 是网络交警。理解了这些角色,Kubernetes 就不再神秘了。