3.10. 使用多架构计算机器管理集群
管理具有多个架构的节点的集群要求您在监控集群并管理工作负载时考虑节点架构。这要求您考虑在多架构集群中配置集群资源要求和行为时,或者调度工作负载。
3.10.1. 使用多架构计算机器在集群中调度工作负载
当您使用使用不同的架构的计算节点在集群中部署工作负载时,您必须将 pod 架构与底层节点的架构保持一致。根据您的底层节点架构,您的工作负载可能还需要对特定资源进行额外的配置。
您可以使用 Multiarch Tuning Operator 在带有多架构计算机器的集群中启用对工作负载的架构调度。Multiarch Tuning Operator 根据 pod 在创建时支持的架构在 pod 规格中实施额外的调度程序 predicates。
3.10.1.1. 多架构节点工作负载部署示例
基于架构将工作负载调度到适当的节点的工作方式与基于任何其他节点特性的调度相同。在确定如何调度工作负载时请考虑以下选项。
- 使用
nodeAffinity
来调度具有特定架构的节点 您可以只允许将工作负载调度到其镜像支持的一组节点上,您可以在 pod 模板规格中设置
spec.affinity.nodeAffinity
字段。apiVersion: apps/v1 kind: Deployment metadata: # ... spec: # ... template: # ... spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: 1 - amd64 - arm64
- 1
- 指定支持的构架。有效值包括
amd64
,arm64
, 或这两个值。
- 为特定架构污点每个节点
您可以污点节点以避免节点调度与其架构不兼容的工作负载。当集群使用
MachineSet
对象时,您可以在.spec.template.spec.taints
字段中添加参数,以避免将工作负载调度到带有不支持的架构的节点。在向节点添加污点前,您必须缩减
MachineSet
对象或删除现有的可用机器。如需更多信息,请参阅修改计算机器集。apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: # ... spec: # ... template: # ... spec: # ... taints: - effect: NoSchedule key: multiarch.openshift.io/arch value: arm64
您还可以运行以下命令来在特定节点上设置污点:
$ oc adm taint nodes <node-name> multiarch.openshift.io/arch=arm64:NoSchedule
- 在命名空间中创建默认容限
当节点或机器集具有污点时,只有容许该污点的工作负载才能调度。您可以运行以下命令来注解命名空间,以便所有工作负载都获得相同的默认容限:
$ oc annotate namespace my-namespace \ 'scheduler.alpha.kubernetes.io/defaultTolerations'='[{"operator": "Exists", "effect": "NoSchedule", "key": "multiarch.openshift.io/arch"}]'
- 在工作负载中容忍架构污点
当节点或机器集具有污点时,只有容许该污点的工作负载才能调度。您可以使用
toleration(容限)
配置工作负载,使其调度到具有特定架构污点的节点。apiVersion: apps/v1 kind: Deployment metadata: # ... spec: # ... template: # ... spec: tolerations: - key: "multiarch.openshift.io/arch" value: "arm64" operator: "Equal" effect: "NoSchedule"
这个示例部署可以调度到指定了
multiarch.openshift.io/arch=arm64
污点的节点和机器集。
- 使用带有污点和容限的节点关联性
当调度程序计算一组要调度 pod 的节点时,容限可能会扩大集合,而节点关联性会限制集合。如果在具有特定架构的节点上设置了污点,还必须为要调度到的工作负载添加容限。
apiVersion: apps/v1 kind: Deployment metadata: # ... spec: # ... template: # ... spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - arm64 tolerations: - key: "multiarch.openshift.io/arch" value: "arm64" operator: "Equal" effect: "NoSchedule"
3.10.2. 在 Red Hat Enterprise Linux CoreOS (RHCOS) 内核中启用 64k 页
您可以在集群中的 64 位 ARM 计算机器上启用 Red Hat Enterprise Linux CoreOS (RHCOS) 内核中的 64k 内存页。64k 页大小内核规格可用于大型 GPU 或高内存工作负载。这使用 Machine Config Operator (MCO) 完成,它使用机器配置池来更新内核。要启用 64k 页面大小,您必须为 ARM64 指定一个机器配置池,以便在内核中启用。
使用 64k 页专用于 64 位 ARM 架构计算节点或在 64 位 ARM 机器上安装的集群。如果您使用 64 位 x86 机器在机器配置池中配置 64k 页内核,机器配置池和 MCO 将降级。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 您在其中一个支持的平台中使用不同架构的计算节点创建集群。
流程
标记您要运行 64k 页大小内核的节点:
$ oc label node <node_name> <label>
示例命令
$ oc label node worker-arm64-01 node-role.kubernetes.io/worker-64k-pages=
创建包含使用 ARM64 架构和
worker-64k-pages
角色的 worker 角色的机器配置池:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-64k-pages spec: machineConfigSelector: matchExpressions: - key: machineconfiguration.openshift.io/role operator: In values: - worker - worker-64k-pages nodeSelector: matchLabels: node-role.kubernetes.io/worker-64k-pages: "" kubernetes.io/arch: arm64
在计算节点上创建机器配置,以使用
64k-pages
参数启用64k-pages
。$ oc create -f <filename>.yaml
MachineConfig 示例
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: "worker-64k-pages" 1 name: 99-worker-64kpages spec: kernelType: 64k-pages 2
注意64k-pages
类型仅支持基于 64 位 ARM 架构。realtime
类型仅支持基于 64 位 x86 架构。
验证
要查看您的新
worker-64k-pages
机器配置池,请运行以下命令:$ oc get mcp
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-9d55ac9a91127c36314e1efe7d77fbf8 True False False 3 3 3 0 361d worker rendered-worker-e7b61751c4a5b7ff995d64b967c421ff True False False 7 7 7 0 361d worker-64k-pages rendered-worker-64k-pages-e7b61751c4a5b7ff995d64b967c421ff True False False 2 2 2 0 35m
3.10.3. 在多架构计算机器上的镜像流中导入清单列表
在带有多架构计算机器的 OpenShift Container Platform 4.17 集群中,集群中的镜像流不会自动导入清单列表。您必须手动将默认的 importMode
选项改为 PreserveOriginal
选项,才能导入清单列表。
先决条件
-
已安装 OpenShift Container Platform CLI (
oc
)。
流程
以下示例命令演示了如何对
ImageStream
cli-artifacts 进行补丁,以便cli-artifacts:latest
镜像流标签作为清单列表导入。$ oc patch is/cli-artifacts -n openshift -p '{"spec":{"tags":[{"name":"latest","importPolicy":{"importMode":"PreserveOriginal"}}]}}'
验证
您可以通过检查镜像流标签来检查是否正确导入的清单列表。以下命令将列出特定标签的各个架构清单。
$ oc get istag cli-artifacts:latest -n openshift -oyaml
如果存在
dockerImageManifests
对象,则清单列表导入成功。dockerImageManifests
对象的输出示例dockerImageManifests: - architecture: amd64 digest: sha256:16d4c96c52923a9968fbfa69425ec703aff711f1db822e4e9788bf5d2bee5d77 manifestSize: 1252 mediaType: application/vnd.docker.distribution.manifest.v2+json os: linux - architecture: arm64 digest: sha256:6ec8ad0d897bcdf727531f7d0b716931728999492709d19d8b09f0d90d57f626 manifestSize: 1252 mediaType: application/vnd.docker.distribution.manifest.v2+json os: linux - architecture: ppc64le digest: sha256:65949e3a80349cdc42acd8c5b34cde6ebc3241eae8daaeea458498fedb359a6a manifestSize: 1252 mediaType: application/vnd.docker.distribution.manifest.v2+json os: linux - architecture: s390x digest: sha256:75f4fa21224b5d5d511bea8f92dfa8e1c00231e5c81ab95e83c3013d245d1719 manifestSize: 1252 mediaType: application/vnd.docker.distribution.manifest.v2+json os: linux