×

管理具有多种架构节点的集群需要在监控集群和管理工作负载时考虑节点架构。这要求您在配置集群资源需求和行为或在多架构集群中调度工作负载时,需要考虑其他因素。

在具有多架构计算机的集群上调度工作负载

在具有使用不同架构的计算节点的集群上部署工作负载时,必须使 Pod 架构与底层节点的架构对齐。根据底层节点架构,您的工作负载可能还需要对特定资源进行额外配置。

您可以使用多架构调整运算符 (Multiarch Tuning Operator) 来启用对具有多架构计算机的集群上工作负载的架构感知调度。多架构调整运算符根据 Pod 在创建时可以支持的架构,在 Pod 规范中实现额外的调度器谓词。

多架构节点工作负载部署示例

根据架构将工作负载调度到合适的节点,其方式与基于任何其他节点特征的调度方式相同。确定如何调度工作负载时,请考虑以下选项。

使用 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 指定受支持的架构。有效值包括 amd64arm64 或这两个值。
为特定架构污染每个节点

您可以污染节点以避免节点调度与其架构不兼容的工作负载。当您的集群使用 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"

在 Red Hat Enterprise Linux CoreOS (RHCOS) 内核上启用 64k 页面

您可以在集群中的 64 位 ARM 计算机器上的 Red Hat Enterprise Linux CoreOS (RHCOS) 内核中启用 64k 内存页面。64k 页面大小内核规范可用于大型 GPU 或高内存工作负载。这是使用机器配置运算符 (MCO) 完成的,它使用机器配置池来更新内核。要启用 64k 页面大小,必须为 ARM64 专用一个机器配置池才能在内核上启用。

使用 64k 页面仅限于在 64 位 ARM 机器上安装的 64 位 ARM 架构计算节点或集群。如果使用 64 位 x86 机器在机器配置池上配置 64k 页面内核,则机器配置池和 MCO 将会降级。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您已在受支持平台之一上创建了一个具有不同架构计算节点的集群。

步骤
  1. 标记要在其中运行 64k 页面大小内核的节点

    $ oc label node <node_name> <label>
    命令示例
    $ oc label node worker-arm64-01 node-role.kubernetes.io/worker-64k-pages=
  2. 创建一个包含使用 ARM64 架构的工作节点角色和 worker-64k-pages 角色的机器配置池。

    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
  3. 在您的计算节点上创建一个机器配置,使用 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)
    1 在自定义机器配置池中指定 machineconfiguration.openshift.io/role 标签的值。此 MachineConfig 示例使用 worker-64k-pages 标签在 worker-64k-pages 池中启用 64k 页面。
    2 指定所需的内核类型。有效值为 64k-pagesdefault

    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

在多架构计算机器上导入镜像流中的清单列表

在具有多架构计算机的 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