Home

Kubernetes 核心组件的深度解析

以下是对 Kubernetes 核心组件的深度解析,包含详细功能说明、相互关系图解和交互流程示意图:


一、Kubernetes 架构全景图

|kubectl| API[kube-apiserver]
API --> etcd[etcd]
API --> Scheduler[kube-scheduler]
API --> CM[kube-controller-manager]
API --> CCM[cloud-controller-manager]

CM -->|控制指令| API
Scheduler -->|绑定决策| API

subgraph Control Plane
    API
    etcd
    Scheduler
    CM
    CCM
end

subgraph Worker Node 1
    K1[kubelet] -->|报告状态| API
    K1 -->|管理容器| CRI[容器运行时]
    K1 -->|配置网络| CNI[网络插件]
    P1[Pod] -->|网络| CNI
    K1 -->|存储管理| CSI[存储插件]
    
    KProxy1[kube-proxy] -->|更新规则| API
    KProxy1 -->|流量转发| P1
end

subgraph Worker Node 2
    K2[kubelet]
    KProxy2[kube-proxy]
    P2[Pod]
end

API -->|指令下发| K1
API -->|指令下发| K2
CCM -->|云平台API| Cloud[Cloud Provider] -->


二、核心组件功能详解

1. kube-apiserver

  • 功能:集群的”中央网关”
    • 唯一直接与 etcd 通信的组件
    • 处理所有 RESTful API 请求
    • 实现认证、授权、准入控制
  • 关键接口
    • /api/v1/pods
    • /apis/apps/v1/deployments

2. etcd

  • 功能:分布式键值存储
    • 存储集群所有状态数据
    • 使用 Raft 协议保证一致性
    • 数据模型:/registry/<object-type>/<namespace>/<name>
  • 典型数据
/registry/pods/default/my-pod: {
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {...},
  "spec": {...},
  "status": {...}
}

3. kube-scheduler

  • 功能:Pod 调度决策引擎
    • 监听未调度 Pod(spec.nodeName=""
    • 过滤 → 打分 → 绑定
  • 调度流程
B[过滤节点]

B —> C[打分排序] C —> D[选择最优节点] D —> E[绑定到节点] —>

4. kube-controller-manager

  • 功能:运行所有控制器
    • Deployment Controller:管理 ReplicaSet
    • ReplicaSet Controller:维护 Pod 副本数
    • Node Controller:监控节点状态
    • Service Controller:管理 Service 和 Endpoints
  • 工作原理
for {
    desiredState := GetDesiredState()
    currentState := GetCurrentState()
    if currentState != desiredState {
        Reconcile() // 协调状态
    }
    sleep(syncPeriod)
}

5. kubelet

  • 功能:节点”守护进程”
    • 管理 Pod 生命周期(创建/销毁)
    • 执行健康检查(liveness/readiness)
    • 报告节点和 Pod 状态
    • 挂载存储卷
  • 工作流程
sequenceDiagram
    participant API as API Server
    participant K as kubelet
    participant CRI as 容器运行时
    participant CNI as 网络插件
    participant CSI as 存储插件
    participant Pod as Pod

    Note over K: 启动初始化
    K->>API: 1. 注册节点信息
    K->>API: 2. 启动List-Watch监听Pod
    
    loop 持续监听
        API-->>K: 3. 推送Pod配置变更事件
    end
    
    alt 创建新Pod
        K->>CSI: 4. 挂载存储卷
        CSI-->>K: 返回挂载点
        K->>CRI: 5. 拉取镜像
        CRI-->>K: 返回镜像ID
        K->>CNI: 6. 配置网络命名空间
        CNI-->>K: 分配IP地址
        K->>CRI: 7. 创建容器
        CRI-->>K: 返回容器ID
        K->>Pod: 8. 启动容器进程
        K->>API: 9. 更新Pod状态为Running
    end
    
    alt 更新Pod
        K->>CRI: 执行容器更新操作
        CRI-->>K: 返回结果
        K->>API: 更新Pod状态
    end
    
    alt 删除Pod
        K->>Pod: 10. 发送SIGTERM信号
        K->>CRI: 11. 执行preStop钩子
        K->>CRI: 12. 强制终止容器(SIGKILL)
        K->>CNI: 13. 清理网络配置
        K->>CSI: 14. 卸载存储卷
        K->>API: 15. 确认Pod删除
    end
    
    loop 健康监控
        K->>Pod: 16. 执行Liveness探针
        alt 检查失败
            K->>CRI: 重启容器
        end
        K->>Pod: 17. 执行Readiness探针
        K->>API: 18. 更新Endpoint状态
    end

6. kube-proxy

  • 功能:网络流量代理
    • 维护节点上的网络规则
    • 实现 Service 的 ClusterIP 和 LoadBalancer
    • 支持三种模式:
      • userspace(已淘汰)
      • iptables(默认)
      • IPVS(高性能)
  • 数据流转
flowchart LR
  Client -->|请求| ServiceIP
  kube-proxy -->|DNAT| Pod1
  kube-proxy -->|DNAT| Pod2
  kube-proxy -->|DNAT| Pod3

7. 容器运行时接口 (CRI)

  • 实现:containerd, CRI-O
  • 功能
    • 管理容器生命周期
    • 处理镜像下载
    • 执行健康检查
  • 操作流程
kubelet → CRI shim → 容器运行时 → 创建容器

三、组件交互深度解析

场景:创建 Deployment

sequenceDiagram
    participant U as User
    participant A as API Server
    participant E as etcd
    participant S as Scheduler
    participant C as Controller Manager
    participant K as kubelet
    participant P as kube-proxy

    U->>A: kubectl create -f deployment.yaml
    A->>E: 存储Deployment对象
    C->>A: Watch到新Deployment
    C->>A: 创建ReplicaSet
    A->>E: 存储ReplicaSet
    C->>A: 创建Pod (未调度)
    A->>E: 存储Pod
    
    S->>A: Watch到未调度Pod
    S->>S: 选择节点(Node1)
    S->>A: 绑定Pod到Node1
    
    K->>A: Watch到绑定到本节点的Pod
    K->>CRI: 创建容器
    CRI-->>K: 容器状态
    K->>A: 更新Pod状态为Running
    
    P->>A: Watch到Service变化
    P->>P: 更新iptables/IPVS规则

四、插件系统架构

1. CNI (容器网络接口)

graph LR
    K[kubelet] -->|调用| CNI[CNI插件]
    CNI -->|配置| P[Pod网络]
    CNI -->|集成| NP[网络方案]
    NP --> Calico[Calico]
    NP --> Flannel[Flannel]
    NP --> Weave[Weave Net]

2. CSI (容器存储接口)

sequenceDiagram
    participant K as kubelet
    participant C as CSI Driver
    participant SP as Storage Provider

    K->>C: 调用CreateVolume
    C->>SP: 创建云磁盘/EBS
    SP-->>C: VolumeID
    C-->>K: Volume信息
    K->>C: 调用NodePublishVolume
    C->>SP: 挂载磁盘到节点
    SP-->>C: 挂载点
    C-->>K: 挂载成功

五、控制流 vs 数据流

控制流(管理指令)

graph LR
    User-->API
    API-->etcd
    API-->Controller
    API-->Scheduler
    Scheduler-->API
    Controller-->API
    API-->kubelet

数据流(应用流量)

graph LR
    User-->Ingress
    Ingress-->Service
    Service-->Pod
    Pod-->Pod
    Pod-->External

六、高可用架构设计

graph TB
    LB[Load Balancer] --> API1[API Server 1]
    LB --> API2[API Server 2]
    LB --> API3[API Server 3]
    
    API1 --> etcd1[etcd 1]
    API2 --> etcd2[etcd 2]
    API3 --> etcd3[etcd 3]
    
    API1 --> Scheduler1
    API1 --> Controller1
    
    API2 --> Scheduler2
    API2 --> Controller2
    
    API3 --> Scheduler3
    API3 --> Controller3
    
    Worker1[kubelet] --> LB
    Worker2[kubelet] --> LB

七、关键交互协议

  1. List-Watch 机制
// 客户端示例代码
watcher, _ := client.CoreV1().Pods("").Watch(context.TODO(), metav1.ListOptions{})
for event := range watcher.ResultChan() {
    switch event.Type {
    case watch.Added:
        // 处理新增Pod
    case watch.Modified:
        // 处理更新
    case watch.Deleted:
        // 处理删除
    }
}
  1. Leader 选举

--leader-elect=true
--leader-elect-lease-duration=15s
--leader-elect-renew-deadline=10s

八、组件健康依赖关系

graph TD
    etcd --> API
    API --> Scheduler
    API --> Controller
    API --> kubelet
    kubelet --> Pods
    kube-proxy --> Services
    
    classDef critical fill:#f96;
    class etcd,API critical;

关键路径

  • etcd 故障 → 整个集群不可用
  • API Server 故障 → 控制平面中断
  • kubelet 故障 → 节点失联

九、故障排查矩阵

故障现象首要检查组件关键命令
Pod 一直 Pendingkube-schedulerkubectl describe pod
Pod 启动失败kubeletjournalctl -u kubelet
Service 无法访问kube-proxy`iptables-save
API 请求超时kube-apiserverkubectl get componentstatuses
节点 NotReadykubeletkubectl describe node
存储卷挂载失败CSI Driverkubectl logs -c csi-driver

通过以上深度解析,您应该能够全面理解 Kubernetes 各组件如何协同工作,形成完整的容器编排系统。掌握这些组件的交互原理,对于集群运维、故障排查和性能优化至关重要。

Kubernetes 网络 存储 AI