在 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 的工作原理是:
- 集群部署 Node 后,Node 上运行 kubelet、kube-proxy 和 CRI(如 Docker)等组件。
- kubelet 将 Node 信息注册到 API server,并定期心跳和报告状态。
- schedculer 根据 Pod 的资源需求和调度策略选择 Node。
- kubelet 根据调度决定启动 Pod,并负责其生命周期管理。
- kube-proxy 根据 Service 配置为 Pod 提供代理和负载均衡。
- CRI 实际操作容器,启动和停止容器。
- 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 代理等组件,其主要特征是:
- 运行kubelet、kube-proxy和CRI等组件。
- 负责真正启动和运行 Pod。
- 汇报状态和资源使用给 Master。
- 可配置污点和容忍以控制Pod调度。
- 具有 CPU、内存等资源,配置资源总量与可调度量。
它通过以下方式工作:
- 部署后运行 Kubernetes 组件 wie kubelet 和 kube-proxy。
- kubelet 注册 Node 并汇报状态,接收 Pod 调度指令启动Pod。
- kube-proxy 为 Service 提供代理。