Kubernetes 工作节点(Worker Node)是集群中运行容器化应用的工作机器,可以是物理机或虚拟机。每个工作节点都运行着必要的组件来管理和运行 Pod。
工作节点组件
1. kubelet
kubelet 是工作节点上的主要代理,负责与控制平面通信并管理 Pod。
主要职责:
- 监听 API Server,获取 Pod 的期望状态
- 确保容器按照 Pod 规范运行
- 定期向控制平面报告节点和 Pod 的状态
- 处理容器的生命周期(创建、启动、停止、删除)
- 挂载和卸载存储卷
- 运行健康检查(livenessProbe、readinessProbe、startupProbe)
工作原理:
- kubelet 从 API Server 获取分配到该节点的 Pod 规范
- 通过容器运行时接口(CRI)与容器运行时交互
- 使用容器运行时创建和管理容器
- 定期向 API Server 汇报节点和 Pod 状态
配置文件:/var/lib/kubelet/config.yaml
默认端口:10250(HTTPS)、10248(健康检查)、10255(只读 HTTP)
2. kube-proxy
kube-proxy 负责维护节点上的网络规则,实现 Service 的负载均衡和服务发现。
主要职责:
- 监听 API Server 的 Service 和 Endpoint 变化
- 维护网络规则(iptables 或 IPVS)
- 将流量转发到后端 Pod
- 实现 Service 的负载均衡
工作模式:
-
iptables 模式(默认):
- 使用 iptables 规则实现流量转发
- 性能较好,但规则更新有延迟
- 不支持复杂的负载均衡算法
-
ipvs 模式:
- 使用 Linux IPVS 实现负载均衡
- 支持多种负载均衡算法(轮询、最少连接、源地址哈希等)
- 性能更高,适合大规模集群
- 需要加载 ipvs 内核模块
-
userspace 模式(已废弃):
- 在用户空间实现负载均衡
- 性能较差,已不再推荐使用
配置示例:
yamlapiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs"
3. 容器运行时(Container Runtime)
容器运行时负责运行容器的核心组件。Kubernetes 使用容器运行时接口(CRI)与容器运行时交互。
支持的容器运行时:
-
containerd(推荐):
- CNCF 毕业项目
- 轻量级、高性能
- Docker 的底层运行时
-
CRI-O:
- 专为 Kubernetes 设计
- 轻量级、安全
- OCI 兼容
-
Docker Engine(通过 dockershim,已废弃):
- Kubernetes 1.24+ 已移除 dockershim
- 不再推荐使用
CRI 工作流程:
- kubelet 通过 CRI 接口调用容器运行时
- 容器运行时创建和管理容器
- 容器运行时返回容器状态信息
节点状态
节点条件(Conditions)
节点条件描述节点的健康状态:
-
Ready:节点是否健康并可以运行 Pod
- True:节点健康
- False:节点不健康
- Unknown:节点控制器无法获取节点状态
-
MemoryPressure:节点内存压力
- True:节点内存不足
-
DiskPressure:节点磁盘压力
- True:节点磁盘空间不足
-
PIDPressure:节点进程压力
- True:节点进程数过多
-
NetworkUnavailable:节点网络不可用
- True:节点网络配置有问题
节点容量和可分配资源
- Capacity:节点的总资源(CPU、内存、存储)
- Allocatable:节点可分配给 Pod 的资源(扣除系统预留)
节点信息
- OS Image:操作系统镜像
- Kernel Version:内核版本
- Kubelet Version:kubelet 版本
- Container Runtime Version:容器运行时版本
节点管理
节点维护
- 安全驱逐 Pod:
bashkubectl drain <node-name> --ignore-daemonsets
- 标记节点为不可调度:
bashkubectl cordon <node-name>
- 取消节点不可调度标记:
bashkubectl uncordon <node-name>
节点污点(Taints)
污点用于阻止 Pod 调度到特定节点:
bash# 添加污点 kubectl taint nodes <node-name> key=value:NoSchedule # 查看污点 kubectl describe node <node-name> | grep Taint # 删除污点 kubectl taint nodes <node-name> key:NoSchedule-
污点类型:
- NoSchedule:不调度新 Pod,已有 Pod 不受影响
- PreferNoSchedule:尽量不调度,但不是强制
- NoExecute:不调度新 Pod,已有 Pod 会被驱逐(除非有容忍度)
节点标签(Labels)
标签用于组织和选择节点:
bash# 添加标签 kubectl label nodes <node-name> disktype=ssd # 查看标签 kubectl get nodes --show-labels # 删除标签 kubectl label nodes <node-name> disktype-
节点健康检查
kubelet 定期执行健康检查:
- 节点状态检查:检查节点资源是否充足
- 容器健康检查:执行 livenessProbe 和 readinessProbe
- 镜像拉取检查:检查镜像是否可用
最佳实践
-
资源预留:为系统进程和 kubelet 预留足够的 CPU 和内存
-
监控节点:监控节点的 CPU、内存、磁盘和网络使用情况
-
日志收集:收集 kubelet 和容器运行时的日志
-
安全加固:
- 使用 TLS 加密通信
- 限制 kubelet API 访问
- 定期更新组件版本
-
节点维护:使用 drain 命令安全维护节点
-
自动扩缩容:使用 Cluster Autoscaler 自动调整节点数量
-
污点和容忍度:合理使用污点和容忍度控制 Pod 调度
-
节点亲和性:使用节点亲和性优化 Pod 分配
故障排查
- 查看节点状态:
bashkubectl describe node <node-name>
- 查看 kubelet 日志:
bashjournalctl -u kubelet
- 查看容器运行时日志:
bashjournalctl -u containerd
- 检查节点资源:
bashkubectl top nodes