找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2786

积分

0

好友

374

主题
发表于 3 天前 | 查看: 22| 回复: 0

在 Kubernetes 的宏大架构中,节点(Node) 是承载所有应用工作负载的物理或虚拟机器。如果说控制平面是集群的“大脑”,那么节点就是其强健的“四肢”和“躯干”。理解节点的角色、内部组件、生命周期管理以及与控制平面的交互机制,对于任何希望高效运维和优化 Kubernetes 集群的人来说都至关重要。

一、节点的核心角色与定义

Kubernetes 通过将容器打包进 Pod 中,并将这些 Pod 调度到节点上运行,从而执行用户的工作负载。每个节点都是一个独立的计算单元,它必须包含运行 Pod 所需的所有必要服务,并由集群的控制平面进行统一管理和调度。

  • 物理形态: 节点可以是云环境中的虚拟机(VM),也可以是数据中心里的物理服务器。
  • 最小规模: 即使是最简单的学习环境,也至少包含一个节点;而生产环境则通常由数十甚至数千个节点组成。

二、节点的关键组件

每个健康的节点上都运行着一组不可或缺的系统级组件,它们共同确保了 Pod 的正常运行以及与集群其他部分的通信。

  1. kubelet

    • 核心代理: 这是节点上最重要的组件,作为 Kubernetes 在该节点上的主要“代理人”。
    • 核心职责: 它负责确保容器(Pod)处于运行状态且健康。kubelet 会从 API Server 获取分配给本节点的 PodSpec(Pod 规约),并指示底层的容器运行时来启动、停止或重启容器。
    • 作用范围kubelet 只管理由 Kubernetes 创建的容器,对节点上手动运行的容器(如直接用 docker run 启动的)视而不见。
  2. 容器运行时 (Container Runtime)

    • 执行引擎: 负责实际运行容器的软件。Kubernetes 通过 CRI (Container Runtime Interface) 标准与之交互。
    • 主流选择: 现代 Kubernetes 集群普遍采用 containerdCRI-O 作为容器运行时,Docker Engine 已不再被直接支持。
  3. kube-proxy

    • 网络代理: 实现 Kubernetes Service 的网络概念。
    • 工作原理: 它维护节点上的网络规则(通常基于 iptablesIPVS),确保集群内部或外部的网络流量能够正确地路由到目标 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)

节点通过两种机制向控制平面发送“心跳”以证明其存活:

  • 更新 .statuskubelet 定期(默认每 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 或其他云原生技术,欢迎访问云栈社区与更多同行交流。




上一篇:OpenClaw API密钥安全防护:三步告别明文泄露风险
下一篇:中小企业云原生转型利器:基于K8s的开箱即用一站式平台Rainbond
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 23:15 , Processed in 0.882458 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表