基础设施节点

基础设施节点是专用于托管基础设施组件的工作节点。为工作节点添加基础设施角色标签和污点,即可创建基础设施节点,然后将选定的组件迁移到该节点。

节点角色

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

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

在集群中,控制平面节点带有角色标签 node-role.kubernetes.io/control-plane。

注意:

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

对于计划用于日志记录、监控和 ingress 等基础设施组件的节点或节点池,请使用角色标签 node-role.kubernetes.io/infra。要进一步划分这些节点,可以定义自己的角色,例如 node-role.kubernetes.io/log 或 node-role.kubernetes.io/monitor。

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

在 Alauda OS 节点上创建基础设施节点

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

以下步骤在节点池上声明基础设施角色。要创建节点池,请参阅提供商的“创建集群”页面:裸金属、Huawei DCS、Huawei Cloud Stack 或 VMware vSphere。

步骤 1:在节点池上声明基础设施标签和污点

在节点池的 MachineDeployment 中,将标签设置在 .spec.template.metadata.labels 上,并将污点设置在 .spec.template.spec.taints 上。对于控制平面节点池,请改为在其 KubeadmControlPlane 的 .spec.machineTemplate.metadata.labels 和 .spec.machineTemplate.taints 上进行设置。示例仅展示定义基础设施角色的字段;请保持 MachineDeployment 的其他字段不变。

apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: <infra-md-name>
  namespace: <namespace>
spec:
  clusterName: <cluster-name>
  template:
    metadata:
      labels:
        node-role.kubernetes.io/infra: ""
    spec:
      taints:
      - key: node-role.kubernetes.io/infra
        value: reserved
        effect: NoSchedule

在节点池模板中添加或更改的标签和污点会应用于该节点池的现有节点,而不会替换这些节点。

步骤 2:验证

节点池中的节点注册后,请检查 Node 是否具有基础设施角色标签和污点 node-role.kubernetes.io/infra=reserved:NoSchedule,例如使用 kubectl describe node <node-name> 进行检查。

在单集群部署中,global 集群同时充当业务集群,这是一种受支持的部署形式;其节点规划遵循与其他相同规模集群相同的规则。

在非 Alauda OS 节点上创建基础设施节点

默认情况下,集群仅包含控制平面节点和 worker 节点。如果要将某些 worker 节点指定为专用于托管基础设施组件的基础设施节点,需要手动为这些节点添加相应的角色标签和污点。

注意:

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

步骤 1:为节点资源添加基础设施角色标签

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

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

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

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

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:验证标签和污点

检查节点是否已分配基础设施角色标签和污点:

# 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

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

如果要改为在 Web 控制台中为现有节点设置标签和污点,请参阅管理节点。

将工作负载移动到基础设施节点

如果要将特定 Pod 调度到基础设施节点上,需要进行以下配置:

  • 以基础设施角色标签为目标的 nodeSelector。
  • 与基础设施节点污点对应的 tolerations。

下面是一个配置为在基础设施节点上运行的 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 容忍污点 node-role.kubernetes.io/infra=reserved:NoSchedule。

完成这些配置后,Pod 将被调度到基础设施节点上。

注意:

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

对于以下组件,文档介绍了如何将其放置在基础设施节点上:

自定义角色节点

要进一步划分基础设施节点,可以定义自定义角色,例如用于日志组件的日志节点,或用于监控组件的监控节点。角色名称可以自定义。

自定义角色节点的工作方式与基础设施节点完全相同,只是使用您的角色名称替代 infra:

  • 使用角色标签 node-role.kubernetes.io/<role> 和污点 node-role.kubernetes.io/<role>=<value>:NoSchedule。<value> 是可选的,但可以帮助 operator 了解调度意图,例如 reserved 或 dedicated。
  • 对于 Alauda OS 节点,每个角色使用一个节点池。每个节点池都有自己的 node-role.kubernetes.io/<role> 标签和污点,并按照在 Alauda OS 节点上创建基础设施节点 中的方式在节点池上声明。
  • 对于非 Alauda OS 节点,按照在非 Alauda OS 节点上创建基础设施节点 中的方式,将标签和污点添加到 Node。
  • 要将 Pod 调度到这些节点上,请按照将工作负载移动到基础设施节点 中的方式配置 nodeSelector 和 tolerations。