K8S-Node
Node
在 Kubernetes 集群中,节点(Node)是运行工作负载的实际计算资源,可以是物理服务器或虚拟机。每个节点都运行着必要的服务来支持 Pod 的执行,并由控制面统一管理。
节点管理机制
自注册模式
Kubernetes 提供了两种节点管理方式:
自动注册(默认):
当 kubelet 的 --register-node
标志设置为 true(默认值)时,kubelet 会自动向 API 服务器注册自己。这个过程包括:
- kubelet 启动时读取节点配置信息
- 向 API 服务器发送注册请求
- Kubernetes 在内部创建对应的 Node 对象
- 系统验证节点名称的合法性并检查节点健康状况
手动注册:
在某些情况下,可能需要手动创建 Node 对象,这时需要设置 kubelet 的 --register-node=false
标志。手动注册通常用于:
- 需要精确控制节点属性的环境
- 自动化工具管理节点生命周期的场景
节点状态管理
Kubernetes 持续监控节点状态,通过以下方式管理节点生命周期:
- 健康节点:所有必要服务正常运行,可以接收和运行 Pod
- 不健康节点:关键服务存在问题,集群活动会忽略该节点
- 节点恢复:当不健康节点恢复正常后,Kubernetes 会自动重新启用它
注意 : Kubernetes 会一直保存非正常节点对应的对象,并持续检查其健康状态,直到该节点被显式删除。
节点名称的唯一性
命名规则
节点名称在 Kubernetes 集群中必须保持唯一性,
Node名称唯一的原因
- 身份标识:节点名称是 Node 对象的主要标识符
- 资源关联:系统资源、监控数据和网络策略都与节点名称关联
- 集群操作:管理操作(如驱逐、维护)都基于节点名称执行
命名规范
- 使用有意义且一致的命名约定
- 避免使用易混淆的字符(如大小写混合,特殊字符)
- 考虑使用基础设施提供的唯一标识符
节点自注册过程详解
注册流程
节点自注册是一个多步骤的过程:
- kubelet 启动:读取配置并初始化
- 凭证获取:获取访问 API 服务器所需的认证信息
- 节点信息收集:收集硬件信息、操作系统数据和容量信息
- API 调用:向 API 服务器发送 Node 对象创建请求
- 状态更新:定期更新节点状态信息
配置参数详解
kubelet 与节点注册相关的重要参数:
# 是否启用自注册(默认true)
--register-node=true# 节点标签和注解
--node-labels=key1=value1,key2=value2# 节点状态更新频率
--node-status-update-frequency=10s
重新注册场景
当节点配置需要更新时,推荐的做法是重新向 API 服务器注册节点。这通常在以下情况下需要:
- 硬件资源变更(如内存、CPU扩容)
- 标签或注解更新
- 网络配置变更
- kubelet 重要配置修改
节点心跳机制
地址信息
节点的地址字段提供了网络标识信息,其具体含义取决于云提供商或物理基础设施的配置:
- HostName:由节点内核报告的主机名,可通过 kubelet 的
--hostname-override
参数覆盖 - ExternalIP:通常是从集群外部可路由的 IP 地址
- InternalIP:通常是仅在集群内部可路由的 IP 地址
节点状况
节点的 conditions
字段描述了运行中节点的状态,主要包括以下类型:
状况类型 | 描述 |
---|---|
Ready | 节点健康且可接收 Pod 时为 True;不健康时为 False;节点控制器在最近监控宽限期内未收到消息时为 Unknown |
DiskPressure | True 表示节点磁盘可用量低,存在磁盘空间压力 |
MemoryPressure | True 表示节点内存可用量低,存在内存压力 |
PIDPressure | True 表示节点上进程过多,存在进程压力 |
NetworkUnavailable | True 表示节点网络配置不正确 |
状况与污点的关联
当节点出现问题时,Kubernetes 控制面会自动创建与节点状况对应的污点
- Ready 状况为 Unknown 超过 NodeMonitorGracePeriod(默认50秒)时,添加
node.kubernetes.io/unreachable
污点 - Ready 状况为 False 超过宽限期时,添加
node.kubernetes.io/not-ready
污点
污点会影响 Pod 的调度行为:
- 调度器在分配 Pod 时会考虑节点污点
- 已调度到节点的 Pod 可能因 NoExecute 污点而被驱逐
- Pod 可以通过设置容忍度继续在特定污点的节点上运行
心跳的作用
节点心跳是 Kubernetes 集群确定节点可用性的核心机制,用于:
- 健康检测:确认节点是否正常运行
- 故障检测:及时发现节点故障并采取相应措施
- 资源调度:为调度器提供准确的节点状态信息
心跳类型
Kubernetes 使用两种类型的心跳机制:
1. NodeStatus 心跳
通过节点状态的 .status
字段实现:
- 由 kubelet 定期更新(默认每10秒)
- 包含丰富的节点状态信息
- 直接存储在 Node 对象中
关键状态信息包括:
- 容量与可分配资源
- 当前运行条件(Ready、MemoryPressure、DiskPressure等)
- 运行中的 Pod 信息
- 主机系统信息
2. Lease 对象心跳
从 Kubernetes 1.14 引入的补充机制:
- 创建独立的 Lease 对象(每个节点一个)
- 更轻量级的心跳机制
- 减少大型集群中 etcd 的负载
Lease 对象的优势:
- 降低 API 服务器的负载
- 提高心跳更新的可靠性
- 更好地支持大规模集群
心跳更新机制
kubelet 负责管理两种心跳的更新:
- .status 更新:当节点状态发生变化时,或在配置的时间间隔内(默认5分钟)没有更新事件时触发
- Lease 更新:默认每10秒更新一次,独立于.status更新
- 如果 Lease 更新失败,kubelet 采用指数回退机制重试
- 初始重试间隔为200毫秒,最长重试间隔为7秒钟
心跳故障处理
当节点停止发送心跳时,控制面会采取分级响应:
- 标记不可达:节点状态更新为 Unknown(在
node-monitor-grace-period
后,默认40秒) - 调度暂停:停止向该节点调度新的 Pod
- 驱逐决策:节点控制器根据设置决定是否驱逐 Pod(在
pod-eviction-timeout
后,默认5分钟) - 恢复检测:持续监测节点是否恢复,恢复后自动重新启用
可配置参数:
# 节点未响应多久后标记为不可用(默认40秒)
--node-monitor-grace-period=40s# 节点不可用后多久开始驱逐Pod(默认5分钟)
--pod-eviction-timeout=5m
节点控制器
节点控制器功能
- 节点注册管理:处理节点的添加和删除
- 状态监控:定期检查节点健康状况
- 心跳管理:监控节点心跳更新
- 驱逐管理:在节点故障时驱逐Pod
控制器协调循环
节点控制器的工作流程:
for {// 获取所有节点列表nodes := listAllNodes()for _, node := range nodes {// 检查节点心跳if !hasRecentHeartbeat(node) {// 标记节点状态为UnknownmarkNodeStatusUnknown(node)// 检查是否需要驱逐Podif isEvictionRequired(node) {evictPodsFromNode(node)}} else {// 更新节点状态为健康updateNodeStatusHealthy(node)}}// 等待下一次循环sleep(syncPeriod)
}
配置参数
节点控制器的行为可以通过以下关键参数进行配置:
参数 | 默认值 | 描述 |
---|---|---|
--node-monitor-period | 5s | 节点状态检查周期 |
--node-monitor-grace-period | 40s | 节点未响应标记为不可用的等待时间 |
--pod-eviction-timeout | 5m | 节点不可用后开始驱逐Pod的等待时间 |
--node-eviction-rate | 0.1 | 每秒驱逐节点的速率限制 |
--secondary-node-eviction-rate | 0.01 | 区域故障时的节点驱逐速率 |
--large-cluster-size-threshold | 50 | 大型集群的大小阈值 |
--unhealthy-zone-threshold | 0.55 | 不健康区域的阈值比例 |
故障处理
1. 网络分区处理
当节点与控制面之间的网络发生分区时:
- 节点控制器检测到心跳丢失
- 标记节点状态为 Unknown
- 添加
node.kubernetes.io/unreachable
污点 - 在超时后开始驱逐 Pod
2. 节点资源压力处理
当节点遇到资源压力时:
- kubelet 报告 MemoryPressure 或 DiskPressure 状况
- 节点控制器监控这些状况
- 根据需要添加相应的污点
- 影响新 Pod 的调度决策
3. 区域故障处理
在云环境中区域故障时:
- 节点控制器检测到整个区域不可用
- 降低驱逐速率以避免大规模重新调度风暴
- 优先保证集群稳定性
查看节点控制器状态
# 查看节点控制器日志
kubectl logs -n kube-system kube-controller-manager-<pod-name> | grep node_controller# 检查节点状况
kubectl describe node <node-name># 查看节点事件
kubectl get events --field-selector involvedObject.kind=Node
Node官方文档