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="") - 过滤 → 打分 → 绑定
- 监听未调度 Pod(
- 调度流程:
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| Pod37. 容器运行时接口 (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七、关键交互协议
- 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:
// 处理删除
}
}- 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 一直 Pending | kube-scheduler | kubectl describe pod |
| Pod 启动失败 | kubelet | journalctl -u kubelet |
| Service 无法访问 | kube-proxy | `iptables-save |
| API 请求超时 | kube-apiserver | kubectl get componentstatuses |
| 节点 NotReady | kubelet | kubectl describe node |
| 存储卷挂载失败 | CSI Driver | kubectl logs -c csi-driver |
通过以上深度解析,您应该能够全面理解 Kubernetes 各组件如何协同工作,形成完整的容器编排系统。掌握这些组件的交互原理,对于集群运维、故障排查和性能优化至关重要。