Kubernetes 中的 Node 是什么?

在 Kubernetes 中,Node 是工作节点,是 Pod 运行所在的物理机或虚拟机。Node 由 Master 进行管理,运行 Kubernetes 代理和 Runtime 等组件。

Node 的主要功能是:

  • 运行 Pod:Node 上运行的 kubelet 负责启动和监控 Pod。
  • 代理服务:Node 上的 kube-proxy 负责为 Service 提供代理转发。
  • 容器运行时:Node 运行的 Docker/CRI 负责真正运行容器。
  • 资源管理:Node 上的 kubelet 负责监控 Node 资源使用情况,确保 足够资源运行新调度的 Pod。

Node 状态包含:

  • 就绪(Ready):运行正常并可以接受新 Pod 调度。
  • 未就绪(NotReady):无法接受新 Pod 调度。
  • 网络不可达(NetworkUnavailable):网络插件不可用,不能调度 Pod。

Node 还定义了以下重要的属性:

  • spec.taints:污点,排斥特定 Pod 调度到该 Node。
  • spec.tolerations:容忍,允许 Pod 调度到具有匹配污点的 Node。
  • metadata.labels:标签,用于查找拥有匹配标签的 Node。
  • spec.unschedulable:是否允许调度 Pod,默认为 false。
  • status.capacity和status.allocatable:内存、CPU 等资源总量与可调度量。
  • status.nodeInfo.nodeAddress:Node 的IP 和 主机名。

Node 的工作原理是:

  1. 集群部署 Node 后,Node 上运行 kubelet、kube-proxy 和 CRI(如 Docker)等组件。
  2. kubelet 将 Node 信息注册到 API server,并定期心跳和报告状态。
  3. schedculer 根据 Pod 的资源需求和调度策略选择 Node。
  4. kubelet 根据调度决定启动 Pod,并负责其生命周期管理。
  5. kube-proxy 根据 Service 配置为 Pod 提供代理和负载均衡。
  6. CRI 实际操作容器,启动和停止容器。
  7. Node 定期汇报容量和 Pod 状态给 API server。

例如,一个 Node 定义如下:

yaml
apiVersion: v1
kind: Node
metadata:
  name: node1  
spec:
  taints:
    - key: "node"
    value: "node1"
    effect: "NoSchedule" 
status:
  capacity:
    cpu: "2"
    memory: "1024Mi"
  allocatable:  
    cpu: "1"
    memory: "512Mi"
  nodeInfo:
    nodeAddress: 192.168.1.2  

这个 Node node1 的主要属性是:

  • 拥有一个污点 node=node1:NoSchedule。
  • 总容量 CPU 2 核内存 1Gi,可调度量 CPU 1核内存 512Mi。
  • 内部 IP 为 192.168.1.2。
  • 其工作流程是,Pod 要避开该污点才能调度到该 Node,最终由 kubelet 启动。

所以总结来说,Node 的主要作用是提供计算资源,运行 Pod 和 Kubernetes 代理等组件,其主要特征是:

  1. 运行kubelet、kube-proxy和CRI等组件。
  2. 负责真正启动和运行 Pod。
  3. 汇报状态和资源使用给 Master。
  4. 可配置污点和容忍以控制Pod调度。
  5. 具有 CPU、内存等资源,配置资源总量与可调度量。

它通过以下方式工作:

  1. 部署后运行 Kubernetes 组件 wie kubelet 和 kube-proxy。
  2. kubelet 注册 Node 并汇报状态,接收 Pod 调度指令启动Pod。
  3. kube-proxy 为 Service 提供代理。