集群节点规划

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

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

在集群中:

  • 控制平面节点会被标记为角色标签 node-role.kubernetes.io/control-plane

    注意:

    在 Kubernetes v1.24 之前,社区也使用标签 node-role.kubernetes.io/master 来标记控制平面节点。为了向后兼容,这两个标签都被视为用于识别控制平面节点的有效标签。

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

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

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

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

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

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

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

注意:

本节中的操作仅适用于非不可变集群。不要将这些操作用于由云提供商管理的集群、第三方集群,或节点使用不可变 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 资源添加 Taint

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

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

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

步骤 3:验证标签和 Taint

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

# 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 taint。

将 Pod 迁移到 Infra 节点

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

  • 指向 infra 角色标签的 nodeSelector。
  • 与 infra 节点 taint 对应的 toleration。

下面是一个配置为在 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: "" 标签的节点上,而 toleration 允许该 Pod 容忍 taint node-role.kubernetes.io/infra=reserved:NoSchedule

通过这些配置,Pod 将被调度到 infra 节点上。

注意:

通过 OLM Operators 或 Cluster Plugins 安装的 pods 并不总是可以迁移到 infra 节点。能否移动这些 pods 取决于各个 Operator 或 Cluster Plugin 的配置。

自定义节点规划

除了 infra 节点之外,你可能还希望为其他专用用途指定工作节点,例如承载日志组件、存储服务或监控 agent。

你可以通过为工作节点分配更多自定义角色标签及其对应的 taint,来实现这一点,从而有效地将它们转变为自定义角色节点。

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

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

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

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

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

步骤 2:添加对应的 Taint

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

将 <role> 替换为你的自定义角色名称,并将 <value> 替换为有意义的描述,例如 reserved 或 dedicated。该值是可选的,但可以帮助运维人员理解调度意图。

步骤 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:为节点添加 Taint

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

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

步骤 3:验证标签和 Taint

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

这将确认该节点已成功配置为带有相应标签和 taint 的 log 节点。

使用角色标签和 taint 按用途对 Kubernetes 节点进行分区,提升工作负载隔离能力,并将选定组件调度到配置适当的节点上。