Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

4.5. 定义节点组和主机映射

节点配置从 master 启动。当节点启动和服务时,节点会在加入集群前检查 kubeconfig 和其他节点配置文件是否存在。如果不存在,节点将从 master 中拉取配置,然后加入集群。

通过使用这个方法,管理员不需要在每个节点主机上手动维护节点配置。节点主机的 /etc/origin/node/node-config.yaml 文件的内容由来自 master 的 ConfigMaps 提供。

4.5.1. 节点 ConfigMap

用于定义节点配置的 Configmap 必须在 openshift-node 项目中可用。现在,ConfigMap 也是节点标签的权威定义,旧的 openshift_node_labels 值会被实际忽略。

默认情况下,安装程序会在集群安装过程中创建以下默认 ConfigMap:

  • node-config-master
  • node-config-infra
  • node-config-compute

另外还会创建以下 ConfigMap,将节点标记为多个角色:

  • node-config-all-in-one
  • node-config-master-infra

以下 ConfigMap 是每个现有默认节点组的 CRI-O 变体:

  • node-config-master-crio
  • node-config-infra-crio
  • node-config-compute-crio
  • node-config-all-in-one-crio
  • node-config-master-infra-crio
重要

您不能修改节点主机的 /etc/origin/node/node-config.yaml 文件。任何更改都会被节点使用的 ConfigMap 中定义的配置覆盖。

4.5.2. 节点组定义

安装最新的 openshift-ansible 软件包后,您可以在 /usr/share/ansible/openshift-ansible/roles/openshift_facts/defaults/main.yml 文件中以 YAML 格式查看默认节点组定义集:

openshift_node_groups:
  - name: node-config-master 1
    labels:
      - 'node-role.kubernetes.io/master=true' 2
    edits: [] 3
  - name: node-config-infra
    labels:
      - 'node-role.kubernetes.io/infra=true'
    edits: []
  - name: node-config-compute
    labels:
      - 'node-role.kubernetes.io/compute=true'
    edits: []
  - name: node-config-master-infra
    labels:
      - 'node-role.kubernetes.io/infra=true,node-role.kubernetes.io/master=true'
    edits: []
  - name: node-config-all-in-one
    labels:
      - 'node-role.kubernetes.io/infra=true,node-role.kubernetes.io/master=true,node-role.kubernetes.io/compute=true'
    edits: []
1
节点组名称。
2
与节点组关联的节点标签列表。有关详细信息,请参阅节点主机标签
3
任何对节点组配置的编辑。

如果您没有在清单文件中的 [OSEv3:vars] 组中设置 openshift_node_groups 变量,则会使用这些默认值。但是,如果要设置自定义节点组,则必须在清单文件中定义整个 openshift_node_groups 结构,包括所有计划的节点组。

openshift_node_groups 值没有与默认值合并,您必须将 YAML 定义转换为 Python 字典。然后,您可以使用 edits 字段指定键值对来修改任何节点配置变量。

注意

有关可配置节点变量的参考,请参阅Master 和节点配置文件

例如,以下清单文件中的条目定义了名为 node-config-masternode-config-infranode-config-compute 的组。

openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true']}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true']}]

您还可以使用其他标签定义新节点组名称,清单文件中的以下条目定义了名为 node-config-masternode- config-infra、node- config-compute 和 node-config-compute-storage 的组。

openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true']}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true']}, {'name': 'node-config-compute-storage', 'labels': ['node-role.kubernetes.io/compute-storage=true']}]

当在清单文件中设置条目时,您还可编辑节点组的 ConfigMap:

  • 您可以使用列表,如修改的 node-config-computekubeletArguments.pods-per-core 设置为 20:
openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true']}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true'], 'edits': [{ 'key': 'kubeletArguments.pods-per-core','value': ['20']}]}]
  • 您可以使用列表来修改多个键值对,例如修改 node-config-compute 组,为 kubelet 添加两个参数:
openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true']}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true'], 'edits': [{ 'key': 'kubeletArguments.experimental-allocatable-ignore-eviction','value': ['true']}, {'key': 'kubeletArguments.eviction-hard', 'value': ['memory.available<1Ki']}]}]
  • 您还可以使用字典作为值,如修改 node-config-compute 组把 perFSGroup 设置为 512Mi
openshift_node_groups=[{'name': 'node-config-master', 'labels': ['node-role.kubernetes.io/master=true']}, {'name': 'node-config-infra', 'labels': ['node-role.kubernetes.io/infra=true']}, {'name': 'node-config-compute', 'labels': ['node-role.kubernetes.io/compute=true'], 'edits': [{ 'key': 'volumeConfig.localQuota','value': {'perFSGroup':'512Mi'}}]}]

每当运行 openshift_node_group.yml playbook 时,在 edits 字段中定义的更改会更新相关的 ConfigMap(本例中的node-config-compute ),这最终将影响主机上的节点配置文件。

注意

运行 openshift_node_group.yaml playbook 只会更新新节点。无法运行它来更新集群中的现有节点。

4.5.3. 将主机映射到节点组

要把 ConfigMap 映射到节点,在清单的 [nodes] 组中定义的所有主机都需要使用 openshift_node_group_name 变量分配到一个节点组

重要

对于所有集群安装,无论是使用默认节点组定义和 ConfigMap 还是自行自定义,都需要为每个主机将 openshift_node_group_name 设置为节点组。

openshift_node_group_name 的值用于选择配置每个节点的 ConfigMap。例如:

[nodes]
master[1:3].example.com openshift_node_group_name='node-config-master'
infra-node1.example.com openshift_node_group_name='node-config-infra'
infra-node2.example.com openshift_node_group_name='node-config-infra'
node1.example.com openshift_node_group_name='node-config-compute'
node2.example.com openshift_node_group_name='node-config-compute'

如果在 openshift_node_groups 中定义了其他自定义 ConfigMap,它们也可以被使用。例如:

[nodes]
master[1:3].example.com openshift_node_group_name='node-config-master'
infra-node1.example.com openshift_node_group_name='node-config-infra'
infra-node2.example.com openshift_node_group_name='node-config-infra'
node1.example.com openshift_node_group_name='node-config-compute'
node2.example.com openshift_node_group_name='node-config-compute'
gluster[1:6].example.com openshift_node_group_name='node-config-compute-storage'

4.5.4. 节点主机标签

您可以在集群安装过程中为节点主机分配 标签(Label)。通过标签,调度程序(scheduler)可以决定 pod 放置的节点位置。

如果要修改分配给节点主机的默认标签,必须创建自己的自定义节点组。您无法再设置 openshift_node_labels 变量来更改标签。请参阅 节点组定义来修改默认节点组。

node-role.kubernetes.io/infra=true (使用此组的主机也称为 专用基础架构节点,在 配置 Dedicated Infrastructure 节点一节中会进一步讨论) 外,其他实际标签名称和值都是任意的并可随意分配,但最好根据集群的要求进行分配。

4.5.4.1. 主 pod 调度功能

配置在安装过程中指定为 master 的所有主机。通过这样做,masters 会被配置为 OpenShift SDN 的一部分。您必须将 master 主机的条目添加到 [nodes] 部分:

[nodes]
master[1:3].example.com openshift_node_group_name='node-config-master'

如果要在安装后更改主机的调度性,请参阅 将节点标记为 Unschedulable 或 Schedulable

4.5.4.2. 节点上的 Pod 调度功能

默认情况下,masters 标记为可调度节点,在集群安装过程中会默认设置默认节点选择器。master 配置文件的 projectConfig.defaultNodeSelector 字段中定义了默认节点选择器,以确定在放置 pod 时将默认使用哪些节点项目。除非使用 osm_default_node_selector 变量覆盖,否则会设置为 node -role.kubernetes.io/compute=true

重要

如果您在安装过程中接受 node-role.kubernetes.io/compute=true 的默认节点选择器,请确保在集群中定义了非 master 节点时具有除专用基础架构节点之外的其他节点。否则,应用程序 Pod 会无法部署。这是因为在为项目调度 pod 时,没有可用的具有 node-role.kubernetes.io/compute=true 标签的节点与默认节点选择器匹配。

如需了解调整安装后设置此设置的步骤,请参阅 设置集群范围默认 Node Selector

4.5.4.3. 配置 Dedicated Infrastructure 节点

建议您在生产环境中使用专用基础架构节点来运行 registry 和路由器 Pod,这样可以使它们独立于用于用户应用程序的 Pod。

openshift_router_selectoropenshift_registry_selector Ansible 设置决定了在放置 registry 和路由器 Pod 时使用的标签选择器。默认情况下,它们被设置为 node-role.kubernetes.io/infra=true:

# default selectors for router and registry services
# openshift_router_selector='node-role.kubernetes.io/infra=true'
# openshift_registry_selector='node-role.kubernetes.io/infra=true'

registry 和路由器只能在使用 node-role.kubernetes.io/infra=true 标签的节点主机上运行,这些标签被视为专用基础架构节点。确保 OpenShift Container Platform 环境中至少有一个节点主机具有 node-role.kubernetes.io/infra=true 标签。您可以使用默认 node-config-infra 设置这个标签:

[nodes]
infra-node1.example.com openshift_node_group_name='node-config-infra'
重要

如果 [nodes] 部分中没有与选择器设置匹配的节点,则默认路由器和 registry 将部署失败并带有 Pending 状态。

如果您不打算使用 OpenShift Container Platform 管理 registry 和路由器,请配置以下 Ansible 设置:

openshift_hosted_manage_registry=false
openshift_hosted_manage_router=false

如果使用默认 registry.redhat.io 以外的镜像 registry,则必须在 /etc/ansible/hosts 文件中 指定 registry

在 Master 中配置调度功能 所述,master 主机默认标记为可调度。如果标记了带有 node-role.kubernetes.io/infra=true 的 master 主机,且没有其他专用基础架构节点,则 master 主机还必须标记为可以调度。否则,registry 和路由器 Pod 将无法放置到任何节点。

您可以使用默认的 node-config-master-infra 节点组来实现这一目的:

[nodes]
master.example.com openshift_node_group_name='node-config-master-infra'