在 Kubernetes 的宏大架构中,节点(Node) 是承载所有应用工作负载的物理或虚拟机器。如果说控制平面是集群的“大脑”,那么节点就是其强健的“四肢”和“躯干”。理解节点的角色、内部组件、生命周期管理以及与控制平面的交互机制,对于任何希望高效运维和优化 Kubernetes 集群的人来说都至关重要。
一、节点的核心角色与定义
Kubernetes 通过将容器打包进 Pod 中,并将这些 Pod 调度到节点上运行,从而执行用户的工作负载。每个节点都是一个独立的计算单元,它必须包含运行 Pod 所需的所有必要服务,并由集群的控制平面进行统一管理和调度。
- 物理形态: 节点可以是云环境中的虚拟机(VM),也可以是数据中心里的物理服务器。
- 最小规模: 即使是最简单的学习环境,也至少包含一个节点;而生产环境则通常由数十甚至数千个节点组成。
二、节点的关键组件
每个健康的节点上都运行着一组不可或缺的系统级组件,它们共同确保了 Pod 的正常运行以及与集群其他部分的通信。
-
kubelet
- 核心代理: 这是节点上最重要的组件,作为 Kubernetes 在该节点上的主要“代理人”。
- 核心职责: 它负责确保容器(Pod)处于运行状态且健康。
kubelet 会从 API Server 获取分配给本节点的 PodSpec(Pod 规约),并指示底层的容器运行时来启动、停止或重启容器。
- 作用范围:
kubelet 只管理由 Kubernetes 创建的容器,对节点上手动运行的容器(如直接用 docker run 启动的)视而不见。
-
容器运行时 (Container Runtime)
- 执行引擎: 负责实际运行容器的软件。Kubernetes 通过 CRI (Container Runtime Interface) 标准与之交互。
- 主流选择: 现代 Kubernetes 集群普遍采用
containerd 或 CRI-O 作为容器运行时,Docker Engine 已不再被直接支持。
-
kube-proxy
- 网络代理: 实现 Kubernetes Service 的网络概念。
- 工作原理: 它维护节点上的网络规则(通常基于
iptables 或 IPVS),确保集群内部或外部的网络流量能够正确地路由到目标 Service 背后的 Pod。
三、节点的生命周期管理
节点如何加入集群、被管理以及最终退出,构成了其完整的生命周期。
1. 节点注册
新节点加入集群主要有两种方式:
- 自注册 (Self-Registration - 推荐)
- 机制: 节点上的
kubelet 进程在启动时,通过 --register-node=true(默认值)标志,主动向 API Server 发起注册请求。
- 过程:
kubelet 会携带自身的元数据(如 IP 地址、标签、污点等)创建一个 Node 对象。控制平面会验证此对象,并将其纳入集群管理。
- 优势: 自动化程度高,是绝大多数发行版和部署工具(如 kubeadm)采用的方式。
- 手动管理 (Manual Administration)
- 机制: 集群管理员使用
kubectl create -f node.yaml 手动创建 Node 对象。
- 场景: 适用于需要精细控制节点属性,或者在
kubelet 无法自注册的特殊环境中。
- 注意: 此模式下,应将
kubelet 的 --register-node 标志设置为 false。
2. 节点名称唯一性
- 核心原则: 每个节点的名称在整个集群中必须是唯一的。
- 深层含义: Kubernetes 假设同名的节点实例具有完全相同的状态(如网络配置、磁盘内容、标签等)。如果一个节点发生了重大变更(如硬件升级、操作系统重装),但保留了旧名称,可能会导致集群状态不一致。
- 最佳实践: 当需要彻底更换或大规模修改一个节点时,应先从 API Server 中删除其
Node 对象,待更新完成后再重新注册,以确保状态一致性。
3. 节点维护与隔离
- 不可调度 (Unschedulable): 使用
kubectl cordon <node-name> 命令可以将节点标记为不可调度。这会阻止新的 Pod 被调度到该节点上,但不会影响已在运行的 Pod。这是执行节点维护(如内核升级)前的标准操作。
- 安全腾空 (Safe Drain): 结合
kubectl drain 命令,可以在 cordon 的基础上,优雅地驱逐(Evict)节点上所有可被驱逐的 Pod,确保应用的高可用性不受影响。
四、节点状态与健康监控
控制平面通过持续监控节点状态来保证集群的稳定性。
1. 节点状态 (Node Status)
一个 Node 对象的状态包含以下关键信息:
- Addresses: 节点的 IP 地址(如 InternalIP, ExternalIP, Hostname)。
- Conditions: 节点的各种状况,其中最重要的是
Ready 状况,表明节点是否健康并准备好接受 Pod。
- Capacity/Allocatable: 节点的资源总量(CPU、内存等)和可分配给 Pod 的资源量。
- Info: 节点的操作系统、内核版本、容器运行时版本等详细信息。
可通过 kubectl describe node <node-name> 查看这些信息。
2. 节点心跳 (Node Heartbeats)
节点通过两种机制向控制平面发送“心跳”以证明其存活:
- 更新
.status: kubelet 定期(默认每 10 秒)向 API Server 报告其状态。
- Lease 对象: 在
kube-node-lease 命名空间中,每个节点都有一个对应的 Lease(租约)对象,kubelet 会定期更新它。这是一种更轻量级的心跳机制。
3. 节点控制器 (Node Controller)
作为控制平面的核心组件之一,节点控制器负责:
- 健康监控: 检测节点是否失联。如果在
node-monitor-grace-period(默认 40 秒)内未收到心跳,会将节点的 Ready 状况更新为 Unknown。
- 自动驱逐: 如果节点在
pod-eviction-timeout(默认 5 分钟)后仍未恢复,节点控制器会触发 API 发起的驱逐,将该节点上的所有 Pod 从 API Server 中删除,以便调度器能将它们重新调度到健康节点上。
- 速率限制: 为防止大规模故障导致雪崩,驱逐操作有严格的速率限制(默认每秒 0.1 个节点)。在多可用区(AZ)环境中,策略会更加智能,以区分是局部 AZ 故障还是整个集群的网络问题。
五、高级特性:资源与拓扑
- 资源容量跟踪: 调度器在做调度决策时,会严格检查节点上所有 Pod 的资源请求总和是否超过节点的
Allocatable 容量,从而避免资源过载。
- 节点拓扑 (Node Topology): 在启用了
TopologyManager 特性后,kubelet 可以利用 CPU、内存等硬件的 NUMA 拓扑信息,做出更优的资源分配决策,这对于高性能计算(HPC)和延迟敏感型应用尤为重要。
总结
Kubernetes 节点远非一个简单的容器宿主机,而是一个由 kubelet、容器运行时和 kube-proxy 精密协作的、受控于中央大脑的智能工作单元。从自注册到健康监控,再到优雅的维护流程,Kubernetes 为节点管理提供了一套完整且健壮的机制,这也是云原生理念在基础设施层面的重要体现。深入掌握这些概念,不仅能帮助你构建更稳定的集群,还能在故障排查和性能调优时提供清晰的思路。如果你想更深入地探讨 Kubernetes 或其他云原生技术,欢迎访问云栈社区与更多同行交流。
|