集群节点规划

集群使用格式为 node-role.kubernetes.io/<role> 的 Kubernetes 节点角色标签,为节点分配不同的角色。在本文中,role label 指的是此类标签。

默认情况下,集群包含两种类型的节点:控制平面节点和工作节点,分别用于承载控制平面工作负载和应用工作负载。

在集群中:

  • 控制平面节点带有角色标签 node-role.kubernetes.io/control-plane。

    注意:

    在 Kubernetes v1.24 之前,Community 还使用标签 node-role.kubernetes.io/master 标记控制平面节点。为保持向后兼容性,这两个标签均可用于识别控制平面节点。

  • 默认情况下,工作节点没有角色标签。不过,如有需要,您可以为工作节点显式分配角色标签 node-role.kubernetes.io/worker。

除了这些默认角色标签之外,您还可以在工作节点上定义自定义角色标签,以便进一步将其分类为不同的功能类型。例如:

  • 您可以添加角色标签 node-role.kubernetes.io/infra,将节点指定为用于承载基础设施组件的 infra 节点。

  • 您可以添加角色标签 node-role.kubernetes.io/log,将节点指定为专用于承载日志组件的日志节点。

使用角色标签和污点创建 infra 节点或自定义角色节点,然后在工作负载隔离有需要时,将选定的工作负载迁移到这些节点。

在非不可变集群上创建 Infra 节点

默认情况下,集群仅包含控制平面节点和工作节点。如果您希望将某些工作节点指定为专用于承载基础设施组件的 infra 节点,则需要手动为这些节点添加适当的角色标签和污点。

注意:

本节中的操作仅适用于非不可变集群。请勿对 provider 管理的云集群、第三方集群或节点使用不可变 OS 的集群执行这些操作。

添加 Infra 节点

步骤 1:为 Node 资源添加 Infra 角色标签

kubectl label nodes 192.168.143.133 node-role.kubernetes.io/infra="" --overwrite

此命令为 Node 192.168.143.133 添加 infra 角色标签:node-role.kubernetes.io/infra: "",表示该节点是 infra 节点。

步骤 2:为 Node 资源添加污点

添加污点,以防止其他工作负载被调度到 infra 节点上。

kubectl taint nodes 192.168.143.133 node-role.kubernetes.io/infra=reserved:NoSchedule

此命令为 Node 192.168.143.133 添加污点 node-role.kubernetes.io/infra=reserved:NoSchedule,表示只有能够容忍此污点的应用才能被调度到该节点上。

步骤 3:验证标签和污点

检查节点是否已分配 infra 角色标签和污点:

# kubectl describe node 192.168.143.133
Name:               192.168.143.133
Roles:              infra
Labels:             node-role.kubernetes.io/infra=""
                    ...
Taints:             node-role.kubernetes.io/infra=reserved:NoSchedule

输出表明,Node 192.168.143.133 已配置为 infra 节点,并带有 node-role.kubernetes.io/infra=reserved:NoSchedule 污点。

在 Immutable 集群上创建 Infra 节点

对于节点运行 Immutable OS(Alauda OS)的集群,请勿手动向 Node 资源应用角色标签或污点:此架构中的节点会被替换,而不是就地修改,因此应用于单个 Node 的配置都会在下次节点替换时消失。应改为在节点池资源上声明标签和污点,这样节点池创建的每个节点(包括替换节点)都会携带这些配置。

  • 业务节点池在 MachineDeployment.spec.template.spec.taints 中声明污点,并在机器模板上声明标签;控制平面节点池使用 KubeadmControlPlane.spec.machineTemplate。完整操作步骤(包括 capi-controller-manager 上的标签同步设置,该设置是 Machine 标签在传递到 Node 前所需的)请参阅 配置节点上的注解、标签和污点。
  • 如果专用节点池还必须接收工作节点的机器配置(时区、时间同步以及其他由 MachineConfig 管理的设置),则除了自身的角色标签外,还需要 node-role.kubernetes.io/worker 标签:默认的工作节点 MachineConfigPool 会根据该标签选择节点,而没有该标签的节点将不会接收任何机器配置,且不会显示错误。
  • 角色标签本身遵循上述章节中的相同约定,例如 node-role.kubernetes.io/infra、node-role.kubernetes.io/log 等;污点 node-role.kubernetes.io/<role>=reserved:NoSchedule 的工作方式也相同。

global 集群同时作为业务集群的单集群部署是一种受支持的部署形式;其节点规划遵循与其他同等规模集群相同的规则。

将 Pod 迁移到 Infra 节点

如果希望将特定 Pod 调度到 infra 节点上,需要进行以下配置:

  • 以 infra 角色标签为目标的 nodeSelector。
  • 与 infra 节点污点对应的容忍度。

以下是配置为在 infra 节点上运行的 Pod 清单示例。

apiVersion: v1
kind: Pod
metadata:
  name: infra-pod-demo
  namespace: default
spec:
  ...
  nodeSelector:
    node-role.kubernetes.io/infra: ""
  tolerations:
  - effect: NoSchedule
    key: node-role.kubernetes.io/infra
    value: reserved
    operator: Equal
  ...

nodeSelector 确保 Pod 仅调度到带有 node-role.kubernetes.io/infra: "" 标签的节点上,而容忍度允许 Pod 容忍污点 node-role.kubernetes.io/infra=reserved:NoSchedule。

完成这些配置后,Pod 将被调度到 infra 节点上。

注意:

将通过 OLM Operators 或集群插件安装的 Pod 移动到 infra 节点上并不总是可行。能否移动这些 Pod 取决于各个 Operator 或集群插件的配置。

自定义节点规划

除 infra 节点外,您可能还希望为其他专用用途指定工作节点,例如托管日志组件、存储服务或监控代理。

您可以通过为工作节点分配更多自定义角色标签和相应的污点来实现这一点,从而将其有效地转换为自定义角色节点。

定义自定义角色节点的一般步骤

此过程与创建 infra 节点类似。

步骤 1:添加自定义角色标签

kubectl label nodes <node> node-role.kubernetes.io/<role>="" --overwrite

将 <role> 替换为所需的角色名称,例如 monitoring、storage 或 log。

步骤 2:添加相应的污点

kubectl taint nodes <node> node-role.kubernetes.io/<role>=<value>:NoSchedule

将 <role> 替换为自定义角色名称,并将 <value> 替换为有意义的描述符,例如 reserved 或 dedicated。此值是可选的,但可以帮助 operator 了解调度意图。

步骤 3:验证配置

kubectl describe node <node>

确保 Labels 和 Taints 字段反映您的自定义角色配置。

示例:创建专用于日志组件的节点

如果您希望创建一个专门用于安装日志组件的节点,可以添加 log 角色。在此情况下,请按如下方式创建 log 节点。

步骤 1:添加 log 角色标签

kubectl label nodes 192.168.143.133 node-role.kubernetes.io/log="" --overwrite

此标签表示该节点指定用于日志相关工作负载。

步骤 2:向节点添加污点

kubectl taint nodes 192.168.143.133 node-role.kubernetes.io/log=reserved:NoSchedule

此污点可防止未调度的工作负载部署到该节点上。

步骤 3:验证标签和污点

Name:               192.168.143.133
Roles:              log
Labels:             node-role.kubernetes.io/log=""
                    ...
Taints:             node-role.kubernetes.io/log=reserved:NoSchedule

这将确认该节点已成功配置为带有适当标签和污点的 log 节点。

使用角色标签和污点按用途划分 Kubernetes 节点、改进工作负载隔离,并将选定组件调度到配置适当的节点上。