1. 开篇:为什么节点组件如此重要?
在Kubernetes集群中,Node节点像是辛勤的码头工人,负责执行具体的"货物装卸"(Pod调度和运行)任务。Kubelet和Kube-proxy就像是工人的左右手:一个专注于管理集装箱(Pod)的装卸和检查,另一个则负责港口的交通指挥(网络规则)。本文将用生活化的语言,结合真实生产案例,深入分析这两个组件的原理与故障排查方法。
2. Kubelet的核心功能
Kubelet是每个节点上的"超级管理员",直接与容器运行时(如Docker或containerd)交互。它的核心职责包括:
- Pod生命周期管理:按控制器指令创建/销毁容器
- 资源监控与上报:定期向API Server汇报节点状态
- 健康检查:执行Liveness/Readiness探针
- 镜像管理:下载和清理容器镜像
示例场景:Pod创建失败排查
假设我们使用Kubernetes v1.24 + containerd运行时,遇到Pod状态卡在ContainerCreating
:
kubectl describe pod web-server-5df87f76d-8qpzv
# 事件输出节选:
Events:
Warning FailedCreatePodSandBox 2s (x4 over 5s) kubelet
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network:
plugin type="calico" failed: stat /var/lib/calico/nodename: no such file or directory
# 检查Kubelet日志(journalctl查看)
journalctl -u kubelet --since "5 minutes ago" | grep -i calico
原因分析:
Calico网络插件需要节点名称文件存在,但实际未生成。需要检查以下配置项:
# containerd配置文件位置
/etc/containerd/config.toml
# 检查是否启用CNI插件
[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
3. Kube-proxy的工作原理
Kube-proxy是集群的"交通协管员",通过维护iptables/ipvs规则实现服务发现和负载均衡。核心机制包括:
- Endpoint同步:监控Service与Pod的映射关系
- 规则生成:根据服务类型(ClusterIP/NodePort)创建转发规则
- 会话保持:通过
service.spec.sessionAffinity
配置
示例场景:服务无法访问问题 在Kubernetes v1.25 + iptables模式下,发现ClusterIP无法访问:
# 查看服务的Endpoints是否正常
kubectl get endpoints nginx-service
# 验证iptables规则链
iptables -t nat -L KUBE-SERVICES | grep 10.96.88.88
# 如果无对应规则,检查kube-proxy日志
kubectl logs -n kube-system kube-proxy-abcde
典型错误日志:
E0821 11:00:00 sync_proxy_rules.go:786] Failed to execute iptables-restore:
exit status 1 (iptables-restore: line 42 failed)
解决方案:
- 检查
/var/lib/kube-proxy
目录下的配置文件 - 增加iptables锁等待时间:
# kube-proxy配置示例
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
iptables:
minSyncPeriod: "15s"
syncPeriod: "30s"
masqueradeAll: false
4. 深度排查工具箱
Kubelet调试三板斧:
# 查看节点资源容量
kubectl describe node worker-01 | grep -i capacity
# 强制删除卡住Pod(危险操作)
kubectl delete pod stuck-pod --force --grace-period=0
# 采集实时指标
kubectl get --raw /api/v1/nodes/worker-01/proxy/metrics/cadvisor
Kube-proxy网络诊断:
# 查看当前代理模式
kubectl -n kube-system get cm kube-proxy -o yaml | grep mode
# IPVS模式诊断命令
ipvsadm -Ln | grep -A 10 10.96.0.1
# 模拟DNS解析测试
kubectl run -it --rm debug --image=alpine:3.16 -- nslookup kubernetes.default
5. 组件选型与技术折衷
Kube-proxy模式对比:
特性 | iptables模式 | IPVS模式 |
---|---|---|
性能 | 万级规则后急剧下降 | 百万级规则线性扩展 |
LB算法 | 随机 | 支持RR、LC等算法 |
规则复杂度 | 链式嵌套难维护 | 扁平结构易读 |
资源消耗 | 内存占用较低 | CPU占用更优 |
生产经验法则:
- 50节点以下集群:iptables更轻量
- 高流量服务集群:优先选择IPVS
- 云厂商托管服务:注意与CNI插件的兼容性
6. 应用场景与避坑指南
典型应用场景:
- 自动化修复场景(Kubelet):
# 当容器内存超限时自动重启
apiVersion: v1
kind: Pod
spec:
containers:
- name: web
livenessProbe:
exec:
command: ["check_health.sh"]
resources:
limits:
memory: "512Mi"
- 会话保持场景(Kube-proxy):
apiVersion: v1
kind: Service
spec:
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 3600
防踩坑清单:
- 始终保证kubelet证书轮换配置正确(RotateKubeletClientCertificate)
- 禁用Swap分区可能引发未知OOM Killer行为
- IPVS模式下需确保内核加载ip_vs相关模块
- 监控kubelet的PLEG(Pod生命周期事件生成器)延迟
7. 总结与最佳实践
通过三个典型场景的分析可以看出:
- Kubelet问题多与容器运行时、资源配额相关
- Kube-proxy故障常源于网络插件兼容性
- 定期检查组件指标(如kubelet的runtime_operations_errors)
推荐监控指标:
kubelet_runtime_operations_errors_total{operation_type="create_container"}
kubeproxy_sync_proxy_rules_duration_seconds_bucket
最终生存法则:
永远为kubelet预留至少20%的系统资源,并定期执行滚动重启!