AI 协助说明: 本页由 Codex 协助核验和修复站内链接;正文的技术事实和适用范围未因本次修改而改变,仍以文中来源及当前官方文档为准。
本文边界:本文从节点侧协作关系解释组件分工,不展开 kubelet、流量转发实现或容器运行时的单组件原理。
推荐深读:Kubelet 详解、kube-proxy 详解 与 Containerd 深度解析。
1. Kubelet:节点的生命维持系统#
基本角色#
Kubelet是Kubernetes节点上的主要代理,负责Pod的整个生命周期管理:
- 从API Server接收Pod清单并确保容器正常运行
- 执行健康检查(liveness/readiness probes)
- 管理卷(Volumes)挂载与卸载
- 收集节点和Pod的资源使用指标
- 向API Server报告节点和Pod状态
- 执行容器日志管理
交互方式#
graph LR
A[API Server] -->|分配Pod| B(Kubelet)
B -->|CRI接口| C[Container Runtime]
B -->|CNI接口| D[网络插件]
B -->|CSI接口| E[存储插件]
C -->|运行| F[容器1]
C -->|运行| G[容器2]
B -->|报告状态| A
B -->|执行| H[Pod生命周期管理]- 关键交互流程:
- 通过API Server的Watch机制接收分配给本节点的Pod
- 通过CRI (Container Runtime Interface) API与容器运行时交互
- 通过CNI (Container Network Interface)调用网络插件配置Pod网络
- 通过CSI (Container Storage Interface)管理持久化存储
- 定期向API Server发送心跳和状态更新
- 执行配置的探针并根据结果采取行动
面向对象#
- 直接用户:集群管理员(配置、排错、升级)
- 间接用户:所有开发者(通过Pod配置影响kubelet行为)
- 监控对象:SRE/运维团队(监控节点健康状况)
开发者视角#
作为开发者,你通过Pod配置间接控制kubelet:
配置合理的liveness/readiness探针:
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 3 periodSeconds: 3 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 10理解资源限制如何被强制执行:
resources: limits: memory: "128Mi" cpu: "500m" requests: memory: "64Mi" cpu: "250m"了解Pod生命周期事件:
- 为什么容器可能被重启(OOMKilled、探针失败)
- 为什么Pod可能卡在"Terminating"状态
- Init容器与应用容器的执行顺序
调试技巧:
# 查看kubelet日志(节点级别排错) journalctl -u kubelet -f # 检查Pod在节点上的实际状态 crictl pods crictl logs <container-id>
类比理解#
Kubelet就像建筑工地的工头:
- 从项目经理(API Server)接收建筑图纸(Pod配置)
- 指挥工人(容器运行时)按照图纸施工
- 定期检查工程质量(健康检查)
- 向项目经理报告施工进度和问题
- 确保工地(节点)有足够材料和设备
2. Kube-proxy:服务网络的交通警察#
基本角色#
Kube-proxy是Kubernetes的网络代理,负责实现Service概念和流量路由:
- 维护节点上的网络规则(iptables/IPVS规则)
- 将Service的ClusterIP流量转发到后端Pod
- 支持多种代理模式:
- userspace(已淘汰)
- iptables(默认,高性能)
- IPVS(大规模集群,高级负载均衡算法)
- 处理会话亲和性(SessionAffinity)
- 与网络策略(NetworkPolicy)配合工作
交互方式#
graph TB
A[API Server] -->|Service/Endpoint变更| B(Kube-proxy)
B -->|配置规则| C[iptables/IPVS]
D[Pod流量] --> C
C -->|负载均衡| E[后端Pod1]
C -->|负载均衡| F[后端Pod2]
C -->|负载均衡| G[后端Pod3]
H[外部流量] -->|NodePort/ExternalIP| Ciptables模式工作流程:
- 从API Server Watch Service和Endpoint对象变化
- 为每个Service创建iptables规则链
- 当流量到达Service IP时,iptables根据规则随机选择后端Pod
- DNAT(目标地址转换)将流量转发到选中的Pod
IPVS模式优势:
- 支持更多负载均衡算法(轮询、最少连接、源IP哈希等)
- 更好的性能和可扩展性(尤其在大规模集群)
- 内置会话保持和健康检查
面向对象#
- 配置者:集群管理员(选择模式、性能调优)
- 使用者:开发者(设计微服务架构、调试连接问题)
- 网络策略制定者:安全团队和平台工程师
开发者视角#
作为开发者,你依赖kube-proxy实现服务发现和负载均衡:
理解不同Service类型的工作原理:
- ClusterIP:仅集群内部访问
- NodePort:通过节点IP:端口访问
- LoadBalancer:云提供商负载均衡器
- ExternalName:CNAME记录到外部服务
常见配置:
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 9376 type: ClusterIP sessionAffinity: ClientIP # 会话亲和性排查连接问题:
# 检查Service和Endpoints kubectl get svc,ep my-service # 测试Service可达性 kubectl run test --image=busybox --rm -it --restart=Never -- sh wget -qO- http://my-service # 检查节点上的iptables规则 iptables-save | grep my-service了解网络策略对流量的影响:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-app-access spec: podSelector: matchLabels: app: my-app ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 80
类比理解#
Kube-proxy就像机场的行李分拣系统:
- 接收所有到达的行李(网络请求)
- 根据目的地标签(Service IP)分拣
- 将行李分配到正确的传送带(后端Pod)
- 确保没有传送带过载(负载均衡)
- 当某传送带故障(Pod宕机),自动重新路由
3. Container Runtime:容器的引擎室#
基本角色#
Container Runtime是实际运行容器的软件,负责容器生命周期管理:
- 下载/缓存容器镜像
- 创建/启动/停止/删除容器
- 执行资源隔离(cgroups、namespaces)
- 收集容器日志和指标
- 实现CRI (Container Runtime Interface)规范
主流实现#
| 运行时 | 特点 | 适用场景 |
|---|---|---|
| containerd | 从Docker中分离的核心容器运行时,轻量级 | 通用生产环境,CNCF毕业项目 |
| CRI-O | 专为Kubernetes设计的轻量级运行时 | OpenShift环境,安全优先场景 |
| Docker Engine | 通过cri-dockerd适配器支持Kubernetes | 旧集群迁移,开发环境 |
交互方式#
graph LR
A[Kubelet] -->|gRPC API| B[CRI Shim]
B -->|调用| C[Runtime Service]
B -->|调用| D[Image Service]
C -->|管理| E[容器生命周期]
D -->|管理| F[镜像缓存]
E --> G[Containerd]
F --> G
G --> H[runc]
H --> I[Linux内核]
I --> J[cgroups]
I --> K[namespaces]CRI架构:
- Kubelet通过gRPC调用CRI接口
- CRI Shim(如containerd的cri插件)转换CRI调用到具体运行时API
- 容器运行时调用底层执行器(如runc)创建容器
- 通过Linux内核特性(cgroups、namespaces)实现资源隔离
镜像管理流程:
- Kubelet请求拉取镜像
- 运行时检查本地缓存
- 未命中缓存时,从配置的镜像仓库拉取
- 验证镜像签名(如果启用)
- 解压并存储到本地缓存
面向对象#
- 维护者:集群管理员(版本升级、漏洞修复)
- 安全团队:运行时安全策略、漏洞扫描
- 开发者:镜像构建、调试容器启动失败
开发者视角#
作为开发者,你通过容器镜像和配置与运行时交互:
了解镜像拉取策略:
imagePullPolicy: Always # 总是拉取 imagePullPolicy: IfNotPresent # 本地不存在时拉取 imagePullPolicy: Never # 仅使用本地镜像调试容器启动失败:
# 查看容器运行时状态 crictl info # 列出所有容器(包括失败的) crictl ps -a # 检查容器日志 crictl logs <container-id> # 检查镜像列表 crictl images理解安全上下文在运行时的执行:
securityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 capabilities: add: ["NET_ADMIN", "SYS_TIME"] readOnlyRootFilesystem: true privileged: false了解容器日志机制:
- 标准输出/错误被kubelet收集
- 配置日志轮转避免磁盘占满
- 理解JSON日志格式与多行日志处理
类比理解#
Container Runtime就像汽车引擎:
- 接收油门指令(kubelet命令)
- 将燃料(镜像)转化为动力(计算资源)
- 有内置仪表盘(指标收集)
- 需要定期保养(安全更新)
- 不同品牌(containerd、CRI-O)有不同性能特点
- 驾驶员(开发者)不需了解引擎内部工作,但需要知道基本使用方法
整体交互流程:Pod启动全过程#
sequenceDiagram
API Server->>+Scheduler: 新Pod需要调度
Scheduler-->>-API Server: 选择节点并绑定
API Server->>+Kubelet: 通知新Pod分配到本节点
Kubelet->>+Container Runtime: 拉取容器镜像
Container Runtime->>-Container Registry: 下载镜像
Container Registry-->>-Container Runtime: 返回镜像
Container Runtime-->>-Kubelet: 镜像就绪
Kubelet->>+CNI Plugin: 配置Pod网络
CNI Plugin-->>-Kubelet: 网络配置完成
Kubelet->>+Container Runtime: 创建并启动容器
Container Runtime-->>-Kubelet: 容器运行中
Kubelet->>+Kube-proxy: 通知新Pod加入Service后端
Kube-proxy->>+Node Network Stack: 更新iptables/IPVS规则
Node Network Stack-->>-Kube-proxy: 规则更新完成
Kube-proxy-->>-Kubelet: 网络配置确认
Kubelet->>+API Server: 报告Pod状态为Running
API Server-->>-API Server: 更新etcd中的Pod状态节点组件间的协作关系#
服务请求流程#
- 外部请求到达节点IP:NodePort
- Kube-proxy的iptables规则捕获流量
- 根据Service后端选择目标Pod IP
- 流量通过CNI配置的网络路径到达Pod
- 容器内的应用处理请求
- 响应沿相同路径返回
资源监控流程#
- Container Runtime收集容器CPU/内存使用
- Kubelet聚合容器指标
- Kubelet向API Server报告节点和Pod资源使用
- Metrics Server从API Server聚合集群级指标
- HPA (Horizontal Pod Autoscaler) 基于指标自动调整副本数
- Kube-proxy动态更新负载均衡后端
面向不同角色的核心要点#
开发者(你的角色)需要重点掌握#
Kubelet交互:
- 配置有效的liveness/readiness探针
- 合理设置资源请求/限制
- 理解Pod生命周期事件
- 有效收集和分析容器日志
Kube-proxy影响:
- 理解Service类型及其网络行为
- 设计微服务通信模式
- 调试连接问题和DNS解析
- 了解网络策略对应用通信的影响
Container Runtime考虑:
- 构建优化的容器镜像
- 理解镜像拉取策略
- 调试容器启动失败
- 配置适当的安全上下文
集群管理员需要额外掌握#
- Kubelet:配置参数调优、证书轮换、资源预留
- Kube-proxy:模式选择(iptables vs IPVS)、性能调优
- Container Runtime:安全加固、漏洞管理、运行时选择
- 整体节点:监控指标收集、自动修复策略
学习与调试建议#
1. 实用命令集合#
# 检查节点组件状态
kubectl get nodes -o wide
kubectl describe node <node-name>
# 直接与容器运行时交互
crictl ps -a # 列出所有容器
crictl pods # 列出所有Pod
crictl images # 列出镜像
crictl inspect <container-id> # 详细容器信息
# 检查kube-proxy规则
iptables-save | grep <service-name>
ipvsadm -ln # 如果使用IPVS模式
# 诊断网络连接
kubectl run debug-pod --image=nicolaka/netshoot --rm -it --restart=Never -- sh
# 在容器内执行:
nslookup my-service
curl -v http://my-service2. 常见问题排查流程#
Pod无法启动:
kubectl describe pod <pod-name>查看事件- 检查容器日志
kubectl logs <pod-name> - 在节点上使用
crictl ps -a | grep <pod-name>检查容器状态 - 检查kubelet日志
journalctl -u kubelet | grep <pod-name>
服务无法访问:
- 验证Service和Endpoints
kubectl get svc,ep <service-name> - 检查网络策略
kubectl get networkpolicy - 在节点上检查iptables规则
iptables-save | grep <service-ip> - 从集群内Pod测试连接
kubectl run test --image=busybox --rm -it --restart=Never -- wget -qO- http://<service-name>
3. 学习路径建议#
基础实验:
- 在minikube/kind中部署应用,观察节点组件行为
- 故意制造资源不足,观察kubelet的驱逐行为
- 修改Service配置,观察kube-proxy规则变化
深入实践:
- 通过cri-debug工具分析容器运行时行为
- 使用tcpdump抓包分析服务流量路径
- 模拟节点故障,观察Pod重建过程
推荐资源:
- 《Kubernetes Up & Running》第7章(节点组件)
- Kubernetes官方文档"Concepts/Architecture/Nodes"
- containerd GitHub仓库的CRI实现说明
- 《Cloud Native Infrastructure》中网络章节
理解节点组件不是为了成为节点管理员,而是为了设计出在Kubernetes环境中运行良好的应用。当你了解这些组件如何工作,就能:
- 配置合理的健康检查,避免服务中断
- 优化容器镜像大小,加速部署
- 设计有效的服务通信,减少网络延迟
- 快速定位和解决应用问题
- 做出符合Kubernetes设计理念的架构决策
记住:节点组件是Kubernetes的"执行层",它们将控制平面的声明式配置转化为实际运行的应用。作为开发者,你不需要管理这些组件,但必须理解它们如何影响你的应用行为,才能在云原生环境中取得成功。