集群节点规划

集群利用 Kubernetes 节点角色标签 node-role.kubernetes.io/<role> 来为节点分配不同的角色。为了描述方便,我们将此类标签称为角色标签。

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

在集群中:

  • 控制平面节点带有角色标签 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 节点,专门用于承载日志组件。

本文档将指导你如何创建 infra 节点和自定义角色节点,并将工作负载迁移到这些节点上。

目录

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

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

注意:

本节操作仅适用于非不可变集群。即以下操作不支持在云集群(如通过 Alauda Container Platform EKS Provider 集群插件部署的 EKS 托管集群)、第三方集群或节点使用不可变操作系统的集群上执行。

添加 Infra 节点

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

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

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

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

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

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

该命令为节点 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=reserved
                    ...
Taints:             node-role.kubernetes.io/infra=reserved:NoSchedule

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

将 Pod 迁移到 Infra 节点

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

  • 使用 nodeSelector 指定 infra 角色标签。
  • 配置对应的容忍污点。

下面是一个配置为运行在 infra 节点上的 Deployment 示例清单。

apiVersion: apps/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 Operator 或集群插件安装的 Pod 不一定能迁移到 infra 节点,是否支持迁移取决于各 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。该值为可选,但有助于文档说明和清晰度。

步骤 3:验证配置

kubectl describe node <node>

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

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

如果你想创建专门安装日志组件的节点,可以添加 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=reserved
                    ...
Taints:             node-role.kubernetes.io/log=reserved:NoSchedule

这表明节点已成功配置为 log 节点,并带有相应的标签和污点。

通过以上实践,你可以根据节点的预期用途有效地划分 Kubernetes 节点,提升工作负载隔离性,确保特定组件部署到配置合适的节点上。