节点
Kubernetes 通过将容器放入在**节点(Node)**上运行的 Pod 中来执行工作负载。节点可以是虚拟机或者物理机器,取决于集群配置。每个节点包含运行 Pod 所需的服务,节点由控制面负责管理。通常集群中会有若干个节点;学习或资源受限环境中,集群也可能只有一个节点。
节点上的组件包括 kubelet、容器运行时以及 kube-proxy。下面这张图展示了一个 Node 节点内部的组成:

官方文档参考
| 文档 | 链接 |
|---|---|
| 节点(官方中文) | https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/ |
节点的管理
向 API 服务器添加节点的方式主要有两种:
| 方式 | 说明 |
|---|---|
| 自注册 | 节点上的 kubelet 向控制面执行自注册(首选模式,绝大多数发行版选用) |
| 手动管理 | 你(或其他人)手动添加一个 Node 对象;此时需设置 kubelet 标志 --register-node=false |
无论哪种方式,控制面都会检查新的 Node 对象是否合法。例如用如下 JSON 创建 Node 对象:
{
"kind": "Node",
"apiVersion": "v1",
"metadata": {
"name": "10.240.79.157",
"labels": {
"name": "my-first-k8s-node"
}
}
}
Kubernetes 会在内部创建一个 Node 对象作为节点的表示,并检查 kubelet 向 API 服务器注册节点时使 用的 metadata.name 字段是否匹配。如果节点是健康的(即所有必要的服务都在运行中),则该节点可以用来运行 Pod;否则,直到该节点变为健康之前,所有的集群活动都会忽略该节点。
Node 对象的名称必须是合法的 DNS 子域名。
Kubernetes 会一直保存着非法节点对应的对象,并持续检查该节点是否已经变得健康。你必须(或通过某个控制器)显式删除该 Node 对象,才能停止健康检查操作。测试误建的 Node 对象记得手动清理。
节点自注册与 --register-node
当 kubelet 标志 --register-node 为 true(默认)时,它会尝试向 API 服务器注册自己。自注册模式下 kubelet 使用下列参数启动:
| 参数 | 说明 |
|---|---|
--kubeconfig | 用于向 API 服务器执行身份认证所用的凭据的路径 |
--cloud-provider | 与某云驱动进行通信,以读取与自身相关的元数据 |
--register-node | 自动向 API 服务器注册 |
--register-with-taints | 使用所给的污点列表(逗号分隔的 <key>=<value>:<effect>)注册节点;当 register-node 为 false 时无效 |
--node-ip | 可选的、以英文逗号隔开的节点 IP 地址列表,每个地址簇只能指定一个地址(如单协议栈 IPv4 集群中设置为 kubelet 应使用的节点 IPv4 地址)。若未提供,kubelet 优先使用节点默认的 IPv4 地址;没有 IPv4 则使用默认 IPv6 地址 |
--node-labels | 在集群中注册节点时要添加的标签(受 NodeRestriction 准入控制插件实施的标签限制) |
--node-status-update-frequency | 指定 kubelet 向 API 服务器发送其节点状态的频率 |
当 Node 鉴权模式和 NodeRestriction 准入插件被启用后,仅授权 kubelet 创建/修改自己的 Node 资源。
手动节点管理
可以修改 Node 对象(忽略 --register-node 设置),例如修改节点上的标签或将其标记为不可调度。通过在节点上添加一个或多个 node-role.kubernetes.io/<role>: <role> 标签来设置可选的节点角色(<role> 受标签键名格式规则限制;Kubernetes 会忽略标签的值,按惯例将其设置为与键中的 <role> 相同的字符串)。
可以结合节点上的标签和 Pod 上的选择算符来控制调度,例如限制某 Pod 只能在符合要求的节点子集上运行。
标记节点为不可调度(unschedulable)会阻止新 Pod 调度到该节点上,但不影响已经在其上运行的 Pod,这是重启节点或维护前的有用准备步骤:
kubectl cordon $NODENAME # 标记节点为不可调度,新 Pod 不会再调度上来
被 DaemonSet 控制器创建的 Pod 能够容忍节点的不可调度属性。DaemonSet 通常提供节点本地服务(如日志采集、网络插件),即使节点上的应用负载已被腾空,这些服务也仍需运行在节点之上。