Kubernetes 架构
Kubernetes 通过控制循环协调容器工作负载。本文负责组件分工、创建链路、调度和 etcd。
1. 面试核心
先记住这几条,再读正文- API 与持久状态。 apiserver 提供对象 API,etcd 保存集群对象的持久状态。卡 · 组件
- 控制循环。 控制器通过 API 观察对象,并持续调整实际状态。卡 · Pod 创建链路
- 调度与运行。 scheduler 选择节点,kubelet 通过 CRI 驱动本机容器。卡 · Pod 创建链路
- 多数派提交。 etcd 的 Raft 提交需要多数成员确认。卡 · etcd 存储
- API 与存储安全。 RBAC 约束 API 操作,Secret 静态加密保护落盘内容。卡 · API 访问与 Secret 加密
2. 组件
| 位置 | 组件 | 职责 |
|---|---|---|
| 控制平面 | kube-apiserver | 提供对象 API,执行认证、授权与准入 |
| 控制平面 | etcd | 持久保存 API 对象 |
| 控制平面 | kube-scheduler | 给未绑定的 Pod 选择节点 |
| 控制平面 | kube-controller-manager | 运行副本、节点等控制循环 |
| 云集成 | cloud-controller-manager | 对接云节点、路由和负载均衡器 |
| 节点 | kubelet | 管理本机 Pod,执行探针并上报状态 |
| 节点 | 容器运行时 | 通过 CRI 接收镜像和容器操作 |
| 节点 | kube-proxy 或替代组件 | 实现 Service 数据转发 |
| 插件 | CNI、CoreDNS、CSI | 提供网络、域名解析和存储接入 |
核心控制组件通过 apiserver 协调对象状态。其他通信仍有直接调用。例如 kubelet 调用运行时,apiserver 访问 kubelet。日志、exec 和端口转发都涉及节点通信。
ReplicaSet 控制器观察到副本不足后,会创建 Pod。它持续校正差异,重试失败操作。控制器应按当前状态执行幂等协调。
静态 Pod 由 kubelet 读取节点清单并管理。kubeadm 的清单目录默认是 /etc/kubernetes/manifests。本地 etcd 拓扑的控制平面可用静态 Pod 启动。API 中的镜像 Pod 用于展示状态。调度器无需参与这些 Pod 的创建。
3. Pod 创建链路
以提交 Deployment 为例:
- kubectl 将清单发给 apiserver。
- API 请求通过认证、授权、准入和校验。
- apiserver 将对象持久保存到 etcd。
- Deployment 控制器创建或调整 ReplicaSet。
- ReplicaSet 控制器补足 Pod 对象。
- scheduler 为未绑定的 Pod 选择节点。
- kubelet 观察到分配结果,准备卷和容器环境。
- 运行时通过 CRI 接收操作,配置沙箱与网络。
- 容器启动后,kubelet 执行探针并上报状态。
Linux CRI 运行时可调用 CNI 配置网络。pause 容器是保留沙箱 Namespace 的一种实现。卷准备、镜像拉取等步骤存在各自的重试流程。
EndpointSlice 保存端点地址和就绪条件。未就绪端点也能出现在对象中。流量是否进入还取决于就绪状态和 Service 配置。数据路径见 工作负载、Service 与集群网络。
4. 调度
| 阶段 | 主要依据 |
|---|---|
| 过滤 | requests、节点选择、污点、卷与拓扑约束 |
| 打分 | 资源分布、首选亲和、拓扑和镜像位置 |
| 绑定 | 将选择的节点写入 Pod 绑定结果 |
资源过滤使用 requests 和节点可分配量。实时 CPU 用量不直接替代 requests。调度还包括亲和性、污点、卷等条件。
没有可行节点时,Pod 保持 Pending。kubectl describe pod 的事件会列出过滤原因。资源不足与硬约束冲突需要分别处理。
Pod 绑定后会留在所选节点。扩容节点不会自动重新分配旧 Pod。拓扑分布约束可改善新 Pod 的分布。重新平衡需要额外策略,并考虑驱逐代价。
5. etcd 存储
etcd 保存 Pod、Service、Secret 等 API 对象。应用数据库内容、容器文件和业务日志由各自系统保存。
Raft 写入需多数成员确认。3 个成员可容忍 1 个失效,5 个可容忍 2 个。增加为偶数成员会提高多数派门槛。因此,成员规划常选择奇数规模。
磁盘持久化和成员间网络都会影响提交延迟。排查应关注成员健康、Leader 变化和磁盘延迟。Raft 机制详见 Raft。
etcd 不可用会阻塞对象持久更新。已有容器和已安装的转发规则可继续工作。后端变化、节点故障和控制循环却无法正常协调。因此,业务可用性还取决于故障期间的变化。
etcd 3.6 用 etcdctl snapshot save 保存在线快照。恢复使用 etcdutl snapshot restore。Kubernetes 恢复还需处理 revision 回退与 watch 缓存。快照演练应包含 revision bump 和 mark-compacted。恢复方案应保留数据,并避免新旧集群同时提供服务。
6. API 访问与 Secret 加密
认证确认请求者身份。授权判断该身份是否能执行目标操作。准入再修改或检查对象内容。
RBAC 的 Role 约束命名空间内的权限。ClusterRole 定义集群级或可复用的权限集合。RoleBinding 在命名空间内绑定权限。ClusterRoleBinding 将权限绑定到集群范围。
Secret 的 base64 是编码。默认存储行为仍需配置静态加密来保护内容。读取 Secret 的 API 权限也要最小化。备份应按同等敏感程度管理。加密密钥的保存与恢复需和数据备份配套。
7 · 面试题卡片
本页题目与参考回答
7.1 Kubernetes 的控制平面和节点上分别有哪些组件?各自的作用是什么?
考察重点
- 控制平面与节点组件的职责。
- 组件通过 apiserver 和 watch 协作的控制循环模式。
相关内容:组件。
参考回答
控制平面负责 API、状态存储、调度和协调。
apiserver 是对象访问入口,etcd 保存对象。scheduler 选择节点,各控制器持续调整实际状态。
节点的 kubelet 管理 Pod,运行时执行容器操作。Service 转发由 kube-proxy 或替代组件承担。CNI、CoreDNS 和 CSI 分别提供网络、解析与存储接入。
对象协调主要通过 apiserver。kubelet 到运行时等路径仍使用直接调用。
7.2 从 kubectl apply 一个 Deployment 到 Pod 运行起来,中间经历了哪些步骤?调度器怎样选择节点?
考察重点
- apiserver、控制器、调度器、kubelet、CNI 在链路中的先后顺序。
- 调度的过滤与打分;调度依据 requests;分布不均的原因和处理。
参考回答
Deployment 经 API 保存后,由控制器逐步创建 Pod。
Deployment 控制器管理 ReplicaSet。ReplicaSet 控制器补足 Pod。scheduler 过滤并评分,然后提交节点绑定。
目标 kubelet 准备卷并调用 CRI。运行时准备沙箱、网络、镜像与容器。kubelet 持续上报状态和探针结果。Service 数据面再根据端点条件选择后端。
资源过滤使用 requests。污点、亲和性、卷和拓扑也参与选择。节点扩容后,已有 Pod 仍留在原节点。
7.3 etcd 在 Kubernetes 中起什么作用?它怎样保证多节点数据一致?etcd 出问题会有什么影响?
考察重点
- etcd 保存集群状态、提供 watch。
- Raft 的多数派写入;奇数节点;故障影响与备份恢复;静态 Pod。
参考回答
etcd 持久保存 Kubernetes 的 API 对象。
Raft 通过多数派提交维持一致性。3 个成员可容忍 1 个失效,5 个可容忍 2 个。
etcd 故障会阻塞持久更新和相关控制循环。已有容器与转发规则可继续运行。故障期间发生的节点和后端变化会增加业务风险。
处理时先确认成员、网络和磁盘状态。灾难恢复使用已验证的快照方案。etcd 3.6 恢复工具是 etcdutl。Kubernetes 场景还需处理 revision 和 watch 缓存。
7.4 认证、RBAC 和准入分别检查什么?Secret 为什么还要加密?
考察重点:身份、操作权限、对象约束和落盘保护。
相关内容:API 访问与 Secret 加密。
参考回答
认证确认身份,RBAC 授权检查操作权限。
准入检查或修改对象内容。Secret 的 base64 只改变表示方式。静态加密保护持久存储中的内容。API 读取权限与备份访问仍需分别约束。