节点
节点状态
一个节点的状态包含以下信息:
地址
条件
容量与可分配
信息
可以使用以下命令显示节点状态和有关节点的其他详细信息:
kubectl describe node <insert-node-name-here>
地址
这些字段组合的用法取决于你的云服务商或者裸机配置。
HostName:由节点的内核设置。可以通过 kubelet 的 --hostname-override 参数覆盖。
ExternalIP:通常是节点的可以外部路由(从集群外可访问)的 IP 地址。
InternalIP:通常是节点的仅可在集群内部路由的 IP 地址。
条件
conditions 字段描述了所有 Running 节点的状态。条件的示例包括:
| 节点条件 | 描述 |
|---|---|
| OutOfDisk | True 表示节点的空闲空间不足以用于添加新 Pods, 否则为 False |
| Ready | 表示节点是健康的并已经准备好接收 Pods;False 表示节点不健康而且不能接收 Pods;Unknown 表示节点控制器在最近 node-monitor-grace-period 期间(默认 40 秒)没有收到节点的消息 |
| MemoryPressure | True 表示节点存在内存压力,即节点内存可用量低,否则为 False |
| PIDPressure | True 表示节点存在进程压力,即进程过多;否则为 False |
| DiskPressure | True 表示节点存在磁盘压力,即磁盘可用量低,否则为 False |
| NetworkUnavailable | True 表示节点网络配置不正确;否则为 False |
节点条件使用 JSON 对象表示。例如,下面的响应描述了一个健康的节点。
"conditions": [{"type": "Ready","status": "True","reason": "KubeletReady","message": "kubelet is posting ready status","lastHeartbeatTime": "2019-06-05T18:38:35Z","lastTransitionTime": "2019-06-05T11:41:27Z"}]
容量与可分配
描述节点上的可用资源:CPU、内存和可以调度到节点上的 Pods 的个数上限。
capacity 块中的字段指示节点拥有的资源总量。allocatable 块指示节点上可供普通 Pod 消耗的资源量。
可以在学习如何在节点上保留计算资源 的同时阅读有关容量和可分配资源的更多信息。
信息
关于节点的通用信息,例如内核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、Docker 版本 (如果使用了)和操作系统名称。这些信息由 kubelet 从节点上搜集而来。
管理
与 Pods 和 Services 不同, 节点并不是在 Kubernetes 中从头创建的:它们由外部的云服务商(例如 Google Compute Engine)创建,或者是来自你的资源池 中的物理机或者虚拟机。这意味着当 Kubernetes 创建一个节点时,它其实仅仅创建了一个对象来代表这个节点。创建以后,Kubernetes 将检查这个节点是否可用。例如,如果你尝试使用如下内容创建一个节点:
{"kind": "Node","apiVersion": "v1","metadata": {"name": "10.240.79.157","labels": {"name": "my-first-k8s-node"}}}
Kubernetes 会在内部创一个 Node 对象(用以表示节点),并基于 metadata.name 字段执行健康检查, 如果节点合法,即所有必要服务都处于运行状态,它就有资格运行 Pod;否则它将被所有的集群活动忽略直到其变为合法为止。
说明:Kubernetes 保留无效节点所对应的对象,并持续检查它是否合法。若要停止这种检查,必须显式删除 Node 对象。
当前,有 3 个组件同 Kubernetes 节点接口交互:节点控制器、kubelet 和 kubectl。
节点控制器
节点控制器是一个 Kubernetes 控制面组件,管理节点的方方面面。
心跳机制
Kubernetes 节点发送的心跳有助于确定节点的可用性。心跳有两种形式:NodeStatus 和 Lease 对象。每个节点在 kube-node-lease命名空间 中都有一个关联的 Lease 对象。Lease 是一种轻量级的资源,可在集群扩展时提高节点心跳机制的性能。
kubelet 负责创建和更新 NodeStatus 和 Lease 对象。
当状态发生变化时,或者在配置的时间间隔内没有更新时,kubelet 会更新 NodeStatus。NodeStatus 更新的默认间隔为 5 分钟(比不可达节点的 40 秒默认超时时间长很多)。
kubelet 会每 10 秒(默认更新间隔时间)创建并更新其 Lease 对象。Lease 更新独立于 NodeStatus 更新而发生。
可靠性
在 Kubernetes 1.4 中我们更新了节点控制器逻辑以更好地处理大批量节点访问控制面而出问题的情况 (例如,控制面节点的网络出了问题)。从 1.4 开始,节点控制器在决定逐出 Pod 之前 会检查集群中所有节点的状态。
节点自注册
当 kubelet 标志 --register-node 为 true (默认)时,它会尝试向 API 服务注册自己。这是首选模式,被绝大多数发行版选用。
对于自注册模式,kubelet 使用下列参数启动:
--kubeconfig - 用于向 apiserver 表明身份的凭据路径。
--cloud-provider - 如何从云服务商读取关于自己的元数据。
--register-node - 自动向 API 服务注册。
--register-with-taints - 使用污点列表(逗号分隔的 <key>=<value>:<effect>)注册节点。当 register-node 为 false 时无效。
--node-ip - 节点 IP 地址。
--node-labels - 在集群中注册节点时要添加的标签(请参阅 NodeRestriction 准入插件 在 1.13+ 中实施的标签限制)。
--node-status-update-frequency - 指定 kubelet 向控制面组件发送状态的频率。
启用节点授权模式 和 NodeRestriction 准入插件时, 仅授权 kubelet 创建或修改其自己的节点资源。
手动节点管理
集群管理员可以创建及修改节点对象。如果管理员希望手动创建节点对象,请设置 kubelet 标志 --register-node=false。管理员可以修改节点资源(忽略 --register-node 设置)。修改包括在节点上设置标签及 标记它为不可调度。
kubectl cordon $NODENAME
说明: 请注意,被 DaemonSet 控制器创建的 Pods 将忽略 Kubernetes 调度器,且不会遵照节点上不可调度的属性。这个假设基于守护程序属于节点机器,即使在准备重启而隔离应用的时候。




