K8S(Kubernetes)中的Node是集群中的核心对象之一,代表着集群中的单个工作机器。


一、Node 概述

Node(节点) 是 Kubernetes 集群中的工作节点,负责运行容器化应用。每个节点可以是物理机、虚拟机或云实例,由 Master 节点统一管理。
核心职责
• 运行 Pod 及其容器。
• 向 Master 上报资源状态(CPU、内存、存储等)。
• 执行调度器分配的 Pod 生命周期操作(创建、销毁等)。


二、Node 的组成

每个 Node 包含以下核心组件:

  1. kubelet
    • 与 Master 通信的代理,负责管理 Pod 和容器。
    • 确保 Pod 中容器处于运行状态。
  2. kube-proxy
    • 实现 Kubernetes Service 的网络规则,提供负载均衡和流量转发。
  3. 容器运行时(Container Runtime)
    • 负责运行容器(如 Docker、containerd、CRI-O)。
  4. 操作系统组件
    • 网络插件(CNI)、存储驱动、监控代理等。

三、Node 的生命周期
  1. 注册(Registration)
    • 新节点通过 kubelet 向 Master 注册。
    • 提供节点信息(IP、资源容量、标签等)。
  2. 健康检查(Health Checks)
    • Master 定期检查节点状态(心跳机制)。
    • 异常节点标记为 NotReady,并驱逐其 Pod。
  3. 维护与下线(Maintenance/Decommissioning)
    • 通过 kubectl drain 安全驱逐 Pod 并下线节点。

四、Node 的管理操作
1. 查看节点信息
# 列出所有节点(基础信息)
kubectl get nodes

# 查看节点详细信息(JSON/YAML 格式)
kubectl get node <node-name> -o yaml

# 查看节点资源使用情况(需安装 metrics-server)
kubectl top node
2. 节点标签(Labels)

标签用于标识节点特性(如硬件类型、区域等),支持调度器定向调度。

# 添加/修改标签
kubectl label node <node-name> disktype=ssd

# 删除标签
kubectl label node <node-name> disktype-

# 通过标签筛选节点
kubectl get nodes -l disktype=ssd
3. 节点污点(Taints)与容忍(Tolerations)
  • 污点(Taints):阻止 Pod 调度到节点(除非 Pod 声明容忍)。

应用于Node上,用于标记Node具有某些不希望的属性,从而阻止新的Pod调度到该Node上(或尽量不调度、或删除已在运行的Pod)。

  • 容忍(Tolerations):允许 Pod 调度到带污点的节点。

应用于Pod上,用于表示Pod能够容忍哪些Taints。通过为Pod添加与Node上Taints相匹配的Tolerations,可以使Pod能够调度到具有这些Taints的Node上。

# 添加污点
kubectl taint node <node-name> key=value:NoSchedule

# 删除污点
kubectl taint node <node-name> key:NoSchedule-

示例 Pod 容忍配置:

spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"
4. 节点维护模式

安全驱逐节点上的所有 Pod(常用于升级或维护):

# 驱逐 Pod 并标记节点不可调度(NoSchedule)
kubectl cordon <node-name>

# 驱逐所有 Pod 并清空节点
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

# 恢复节点为可调度状态
kubectl uncordon <node-name>

五、Node 状态详解

通过 kubectl describe node <node-name> 查看节点状态字段:

  • Conditions:节点健康状况(如 ReadyMemoryPressure)。
  • Capacity/Allocatable:节点资源总量及可分配量。
  • System Info:操作系统、内核版本、容器运行时等。
  • Non-terminated Pods:节点上运行的 Pod 列表。

常见状态说明:

状态 含义
Ready 节点健康,可接收新 Pod
MemoryPressure 节点内存不足
DiskPressure 节点磁盘空间不足
PIDPressure 节点进程 ID 资源不足

六、节点调度与隔离
1. 手动调度限制

通过 nodeName 强制 Pod 调度到指定节点:

spec:
  nodeName: <node-name>
2. 节点亲和性(Node Affinity)

定向调度到符合标签条件的节点:

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values: [ssd]
3. 节点反亲和性(Node Anti-Affinity)

避免 Pod 调度到同一节点(如高可用场景):

spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: [web]
        topologyKey: kubernetes.io/hostname

七、节点维护与故障排查
1. 常见问题场景

节点 NotReady:检查 kubelet 服务、网络连接、资源压力。
Pod 无法调度到节点:确认污点、标签、资源是否满足。
节点资源耗尽:清理未使用的镜像或扩容集群。

2. 日志收集
# 查看 kubelet 日志(需 SSH 到节点)
journalctl -u kubelet

# 查看容器运行时日志(如 Docker)
docker logs <container-id>
3. 重置节点
# 清空节点配置(谨慎操作!)
kubeadm reset

八、节点监控与优化
  1. 监控工具
    • Prometheus + Node Exporter:监控 CPU、内存、磁盘、网络。
    • Kubernetes Dashboard:可视化节点状态。
  2. 资源优化
    • 设置合理的 Pod 资源请求(requests)和限制(limits)。
    • 启用自动扩缩(Cluster Autoscaler)。

九、总结

Node 是 Kubernetes 集群的基石,理解其管理机制对运维至关重要。通过合理使用标签、污点、亲和性等调度策略,结合监控和维护操作,可确保集群的高效与稳定。节点故障时,快速定位 kubelet、网络或资源问题,是恢复服务的关键能力。

十、拓展

【一起来学kubernetes】16、CronJob使用详解

【一起来学kubernetes】19、Pod使用详解

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐