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: []
如果您没有在清单文件中的 [OSEv3:vars]
组中设置 openshift_node_groups
变量,则会使用这些默认值。但是,如果要设置自定义节点组,则必须在清单文件中定义整个 openshift_node_groups
结构,包括所有计划的节点组。
openshift_node_groups
值没有与默认值合并,您必须将 YAML 定义转换为 Python 字典。然后,您可以使用 edits
字段指定键值对来修改任何节点配置变量。
有关可配置节点变量的参考,请参阅Master 和节点配置文件。
例如,以下清单文件中的条目定义了名为 node-config-master
、node-config-infra
和 node-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-master
、node-
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-compute
将kubeletArguments.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_selector
和 openshift_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'