节点

    通常集群中会有若干个节点;而在一个学习用或者资源受限的环境中,你的集群中也可能 只有一个节点。

    节点上的包括 kubelet、 以及 kube-proxy

    向 添加节点的方式主要有两种:

    1. 你,或者别的什么人,手动添加一个 Node 对象。

    在你创建了 Node 对象或者节点上的 kubelet 执行了自注册操作之后, 控制面会检查新的 Node 对象是否合法。例如,如果你使用下面的 JSON 对象来创建 Node 对象:

    Kubernetes 会在内部创建一个 Node 对象作为节点的表示。Kubernetes 检查 kubelet 向 API 服务器注册节点时使用的 metadata.name 字段是否匹配。 如果节点是健康的(即所有必要的服务都在运行中),则该节点可以用来运行 Pod。 否则,直到该节点变为健康之前,所有的集群活动都会忽略该节点。

    Node 对象的名称必须是合法的 DNS 子域名

    当 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 地址。
    • --node-labels - 在集群中注册节点时要添加的 标签。 (参见 所实施的标签限制)。
    • --node-status-update-frequency - 指定 kubelet 向控制面发送状态的频率。

    启用节点授权模式和 时,仅授权 kubelet 创建或修改其自己的节点资源。

    手动节点管理

    你可以使用 kubectl 来创建和修改 Node 对象。

    如果你希望手动创建节点对象时,请设置 kubelet 标志 。

    你可以结合使用节点上的标签和 Pod 上的选择算符来控制调度。 例如,你可以限制某 Pod 只能在符合要求的节点子集上运行。

    如果标记节点为不可调度(unschedulable),将阻止新 Pod 调度到该节点之上,但不会 影响任何已经在其上的 Pod。 这是重启节点或者执行其他维护操作之前的一个有用的准备步骤。

    要标记一个节点为不可调度,执行以下命令:

    一个节点的状态包含以下信息:

    你可以使用 kubectl 来查看节点状态和其他细节信息:

    下面对每个部分进行详细描述。

    这些字段的用法取决于你的云服务商或者物理机配置。

    • HostName:由节点的内核设置。可以通过 kubelet 的 --hostname-override 参数覆盖。
    • ExternalIP:通常是节点的可外部路由(从集群外可访问)的 IP 地址。
    • InternalIP:通常是节点的仅可在集群内部路由的 IP 地址。

    conditions 字段描述了所有 Running 节点的状态。状况的示例包括:

    节点条件使用 JSON 对象表示。例如,下面的响应描述了一个健康的节点。

    如果 Ready 条件处于 Unknown 或者 False 状态的时间超过了 pod-eviction-timeout 值, (一个传递给 kube-controller-manager 的参数), 节点上的所有 Pod 都会被节点控制器计划删除。默认的逐出超时时长为 5 分钟。 某些情况下,当节点不可达时,API 服务器不能和其上的 kubelet 通信。 删除 Pod 的决定不能传达给 kubelet,直到它重新建立和 API 服务器的连接为止。 与此同时,被计划删除的 Pod 可能会继续在游离的节点上运行。

    节点生命周期控制器会自动创建代表状况的 。 当调度器将 Pod 指派给某节点时,会考虑节点上的污点。 Pod 则可以通过容忍度(Toleration)表达所能容忍的污点。

    capacity 块中的字段标示节点拥有的资源总量。 allocatable 块指示节点上可供普通 Pod 消耗的资源量。

    可以在学习如何在节点上预留计算资源 的时候了解有关容量和可分配资源的更多信息。

    第二个是保持节点控制器内的节点列表与云服务商所提供的可用机器列表同步。 如果在云环境下运行,只要某节点不健康,节点控制器就会询问云服务是否节点的虚拟机仍可用。 如果不可用,节点控制器会将该节点从它的节点列表删除。

    第三个是监控节点的健康情况。节点控制器负责在节点不可达 (即,节点控制器因为某些原因没有收到心跳,例如节点宕机)时, 将节点状态的 状况更新为 “Unknown“。 如果节点接下来持续处于不可达状态,节点控制器将逐出节点上的所有 Pod(使用体面终止)。 默认情况下 40 秒后开始报告 “Unknown“,在那之后 5 分钟开始逐出 Pod。 节点控制器每隔 --node-monitor-period 秒检查每个节点的状态。

    kubelet 负责创建和更新 NodeStatusLease 对象。

    当一个可用区域(Availability Zone)中的节点变为不健康时,节点的驱逐行为将发生改变。 节点控制器会同时检查可用区域中不健康(NodeReady 状况为 Unknown 或 False) 的节点的百分比。如果不健康节点的比例超过 --unhealthy-zone-threshold (默认为 0.55), 驱逐速率将会降低:如果集群较小(意即小于等于 --large-cluster-size-threshold 个节点 - 默认为 50),驱逐操作将会停止,否则驱逐速率将降为每秒 --secondary-node-eviction-rate 个(默认为 0.01)。 在单个可用区域实施这些策略的原因是当一个可用区域可能从控制面脱离时其它可用区域 可能仍然保持连接。 如果你的集群没有跨越云服务商的多个可用区域,那(整个集群)就只有一个可用区域。

    跨多个可用区域部署你的节点的一个关键原因是当某个可用区域整体出现故障时, 工作负载可以转移到健康的可用区域。 因此,如果一个可用区域中的所有节点都不健康时,节点控制器会以正常的速率 --node-eviction-rate 进行驱逐操作。 在所有的可用区域都不健康(也即集群中没有健康节点)的极端情况下, 节点控制器将假设控制面节点的连接出了某些问题, 它将停止所有驱逐动作直到一些连接恢复。

    节点控制器还负责驱逐运行在拥有 NoExecute 污点的节点上的 Pod, 除非这些 Pod 能够容忍此污点。 节点控制器还负责根据节点故障(例如节点不可访问或没有就绪)为其添加 。 这意味着调度器不会将 Pod 调度到不健康的节点上。

    Kubernetes 调度器保证节点上 有足够的资源供其上的所有 Pod 使用。它会检查节点上所有容器的请求的总和不会超过节点的容量。 总的请求包括由 kubelet 启动的所有容器,但不包括由容器运行时直接启动的容器, 也不包括不受 kubelet 控制的其他进程。

    如果启用了 , kubelet 可以在作出资源分配决策时使用拓扑提示。 参考控制节点上拓扑管理策略 了解详细信息。