Kubernetes (k8s) 核心运行原理的流程图及文字说明

flowchart TD %% 用户提交资源流程 A[用户] -->|提交 Manifest| B[kubectl] B -->|发送请求| C[API Server] C -->|写入状态| D[etcd] D -->|持久化存储| C %% 控制平面响应变更 subgraph ControlPlane C -->|通知变更| E[Controller Manager] C -->|通知变更| F[Scheduler] E -->|监控状态| C F -->|查询未调度 Pod| C end %% Pod 调度与绑定 F -->|绑定 Pod 到 Node| C C -->|更新 Pod 绑定| D %% 工作节点执行流程 subgraph WorkerNode G[kubelet] -->|监听 Pod 分配| C G -->|创建 Pod| H[Container Runtime] H -->|启动容器| I[Pod Containers] G -->|上报状态| C J[kube-proxy] -->|监听 Service/Endpoint| C J -->|配置网络规则| K[Node Network] end %% 添加步骤序号作为独立节点 N1["步骤 1-4: 资源提交与存储"] -.- A N2["步骤 5-8: 控制平面响应"] -.- ControlPlane N3["步骤 9-10: Pod 调度"] -.- F N4["步骤 11-16: 节点执行"] -.- WorkerNode classDef step fill:#f9f,color:black,stroke-dasharray:5 5; class N1,N2,N3,N4 step;

核心步骤说明:

  1. 用户提交配置
    用户通过 kubectl 提交 YAML/JSON 格式的资源配置清单(Deployment、Service 等)。

  2. API Server 接收请求
    kube-apiserver 验证请求合法性,将资源状态写入 etcd

  3. 状态持久化
    etcd 作为分布式键值存储,持久化保存集群所有状态数据。

  4. 控制器响应变更
    Controller Manager 中的控制器(如 Deployment Controller)通过 Informer 机制 监听资源变更:

    • 比较当前状态与期望状态(例如:副本数不足时创建新 Pod)。
    • 生成新的 Pod 配置并提交给 API Server。
  5. 调度器工作
    Scheduler 监听未绑定的 Pod:

    • 过滤(Filter):排除不满足条件的 Node(如资源不足)。
    • 打分(Score):对符合的 Node 优先级排序。
    • 绑定(Bind):将 Pod 绑定到最优 Node(写入 etcd)。
  6. Node 节点执行
    kubelet 监听分配到本节点的 Pod:

    • 调用 Container Runtime(如 containerd)拉取镜像、启动容器。
    • 通过 CNI 插件配置容器网络。
  7. 服务发现与负载均衡
    kube-proxy 监听 Service 和 Endpoint 变化:

    • 更新节点上的 iptables/IPVS 规则,实现服务负载均衡。
  8. 状态反馈
    kubelet 持续收集 Pod/容器状态上报给 API Server,最终写入 etcd


关键设计思想:

  • 声明式 API:用户声明“期望状态”,系统自动收敛到该状态。
  • 控制循环:控制器不断检查实际状态与期望状态的差异并修复。
  • 组件松耦合:通过 API Server 的 REST API 交互,组件可独立升级。
  • 事件驱动:基于 etcd 的 Watch 机制实现高效状态同步。

进阶流程示例(Deployment 扩缩容):

flowchart LR U[用户] -->|kubectl scale deploy/web --replicas=3| APIServer APIServer -->|写入 etcd| etcd DeploymentController -->|监听副本数变化| APIServer DeploymentController -->|创建 ReplicaSet| APIServer ReplicaSetController -->|监听并创建 3 个 Pod| APIServer Scheduler -->|绑定 Pod 到 Node| APIServer kubelet -->|启动容器| ContainerRuntime