5.16. 为多平台支持配置 Operator 项目


与只支持单个平台的 Operator 项目相比,支持多架构和操作系统的 Operator 项目或平台可在更多的 Kubernetes 和 OpenShift Container Platform 集群上运行。示例构架包括 amd64, arm64, ppc64le, 和 s390x。示例操作系统包括 Linux 和 Windows。

执行以下操作以确保 Operator 项目可在多个 OpenShift Container Platform 平台上运行:

  • 构建指定 Operator 支持的平台的清单列表。
  • 设置 Operator 的节点关联性,以支持多架构计算机器。

5.16.1. 构建 Operator 支持的平台清单列表

您可以使用 make docker-buildx 命令构建 Operator 和操作对象支持的平台清单列表。清单列表引用一个或多个架构的特定镜像清单。镜像清单指定镜像支持的平台。

如需更多信息,请参阅 OpenContainers Image Index SpecImage Manifest v2, Schema 2

重要

如果您的 Operator 项目部署了应用程序或其他工作负载资源,以下步骤会假定应用程序在应用程序发行过程中构建应用程序的多平台镜像。

先决条件

  • 使用 Operator SDK 版本 1.31.0 或更高版本构建的 Operator 项目
  • 已安装 Docker

流程

  1. 检查 Operator 和操作对象的镜像清单,以查找 Operator 项目可以支持哪些平台。运行以下命令来检查镜像清单:

    $ docker manifest inspect <image_manifest> 1
    1
    指定镜像清单,如 redhat/ubi9:latest

    Operator 和操作对象相互支持的平台决定了 Operator 项目的平台兼容性。

    输出示例

    {
        "manifests": [
            {
                "digest": "sha256:c0669ef34cdc14332c0f1ab0c2c01acb91d96014b172f1a76f3a39e63d1f0bda",
                "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
                "platform": {
                    "architecture": "amd64",
                    "os": "linux"
                },
                "size": 528
            },
    ...
            {
                "digest": "sha256:30e6d35703c578ee703230b9dc87ada2ba958c1928615ac8a674fcbbcbb0f281",
                "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
                "platform": {
                    "architecture": "arm64",
                    "os": "linux",
                    "variant": "v8"
                },
                "size": 528
            },
    ...

  2. 如果上一命令没有输出平台信息,则指定的基础镜像可能是单个镜像,而不是镜像清单。您可以运行以下命令来查找镜像支持哪些架构:

    $ docker inspect <image>
  3. 对于基于 Go 的 Operator 项目,Operator SDK 会显式引用项目的 Dockerfile 中的 amd64 架构。对 Dockerfile 进行以下更改,将环境变量设置为 platform 标记指定的值:

    Dockerfile 示例

    FROM golang:1.19 as builder
    ARG TARGETOS
    ARG TARGETARCH
    ...
    RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager main.go 1

    1
    GOARCH 字段从 amd64 更改为 $TARGETARCH
  4. 您的 Operator 项目的 makefile 定义 PLATFORMS 环境变量。如果 Operator 的镜像不支持默认设置的所有平台,请编辑变量以指定支持的平台。以下示例将支持的平台定义为 linux/arm64linux/amd64

    makefile 示例

    # ...
    PLATFORMS ?= linux/arm64,linux/amd64 1
    .PHONY: docker-buildx
    # ...

    1
    以下 PLATFORMS 值默认设置:linux/arm64, linux/amd64, linux/s390x, 和 linux/ppc64le

    当您运行 make docker buildx 命令来生成清单列表时,Operator SDK 会为 PLATFORMS 变量指定的每个平台创建一个镜像清单。

  5. 从 Operator 项目目录运行以下命令,以构建管理器镜像。运行该命令构建具有多平台支持的管理器镜像,并将清单列表推送到 registry。

    $ make docker-buildx \
      IMG=<image_registry>/<organization_name>/<repository_name>:<version_or_sha>

5.16.2. 关于多架构计算机器和 Operator 工作负载的节点关联性规则

您必须设置节点关联性规则,以确保 Operator 工作负载可以在多架构计算机器上运行。节点关联性是由调度程序用来定义 pod 的放置的一组规则。设置节点关联性规则可确保将 Operator 工作负载调度到具有兼容架构的计算机器。

如果 Operator 在特定构架上更好地执行,您可以设置首选的节点关联性规则,以将 pod 调度到具有指定架构的机器。

如需更多信息,请参阅"使用多架构计算机器打开集群"和"使用节点关联性规则控制节点上的 pod 放置"。

5.16.2.1. 使用所需的节点关联性规则来支持 Operator 项目的多架构计算机器

如果您希望 Operator 支持多架构计算机器,您必须定义 Operator 所需的节点关联性规则。

先决条件

  • 使用 Operator SDK 1.31.0 或更高版本创建或维护的 Operator 项目。
  • 定义 Operator 支持的平台的清单列表。

流程

  1. 为定义 pod spec 和 pod 模板 spec 对象的 Kubernetes 清单搜索 Operator 项目。

    重要

    因为 YAML 文件中没有声明对象类型名称,请查找 Kubernetes 清单中的强制 containers 字段。在同时指定 pod spec 和 pod 模板 spec 对象时,需要 containers 字段。

    您必须在定义 pod spec 或 pod 模板 spec 的所有 Kubernetes 清单中设置节点关联性规则,包括 PodDeploymentDaemonSetStatefulSet 等对象。

    Kubernetes 清单示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: s1
    spec:
      containers:
        - name: <container_name>
          image: docker.io/<org>/<image_name>

  2. 在 Kubernetes 清单中设置所需的节点关联性规则,以定义 pod spec 和 pod 模板 spec 对象,如下例所示:

    Kubernetes 清单示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: s1
    spec:
      containers:
        - name: <container_name>
          image: docker.io/<org>/<image_name>
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution: 1
            nodeSelectorTerms: 2
            - matchExpressions: 3
              - key: kubernetes.io/arch 4
                operator: In
                values:
                - amd64
                - arm64
                - ppc64le
                - s390x
              - key: kubernetes.io/os 5
                operator: In
                values:
                    - linux

    1
    定义必要规则。
    2
    如果您指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms,那么其中一个 nodeSelectorTerms 满足时 pod 就能调度到节点上。
    3
    如果您指定了多个与 nodeSelectorTerms 关联的 matchExpressions,那么只有所有 matchExpressions 都满足时 pod 才能调度到节点上。
    4
    指定清单列表中定义的架构。
    5
    指定清单列表中定义的操作系统。
  3. 使用动态创建工作负载的基于 Go 的 Operator 项目可能会将 pod spec 和 pod 模板 spec 对象嵌入到 Operator 的逻辑中。

    如果您的项目在 Operator 的逻辑中嵌入 pod spec 或 pod 模板 spec 对象,请编辑类似以下示例的 Operator 逻辑。以下示例演示了如何使用 Go API 更新 PodSpec 对象:

    Template: corev1.PodTemplateSpec{
        ...
        Spec: corev1.PodSpec{
            Affinity: &corev1.Affinity{
                NodeAffinity: &corev1.NodeAffinity{
                    RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
                        NodeSelectorTerms: []corev1.NodeSelectorTerm{
                            {
                                MatchExpressions: []corev1.NodeSelectorRequirement{
                                    {
                                        Key:      "kubernetes.io/arch",
                                        Operator: "In",
                                        Values:   []string{"amd64","arm64","ppc64le","s390x"},
                                    },
                                    {
                                        Key:      "kubernetes.io/os",
                                        Operator: "In",
                                        Values:   []string{"linux"},
                                    },
                                },
                            },
                        },
                    },
                },
            },
            SecurityContext: &corev1.PodSecurityContext{
                ...
            },
            Containers: []corev1.Container{{
                ...
            }},
        },

    其中:

    RequiredDuringSchedulingIgnoredDuringExecution
    定义必要规则。
    NodeSelectorTerms
    如果您指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms,那么其中一个 nodeSelectorTerms 满足时 pod 就能调度到节点上。
    matchExpressions
    如果您指定了多个与 nodeSelectorTerms 关联的 matchExpressions,那么只有所有 matchExpressions 都满足时 pod 才能调度到节点上。
    kubernetes.io/arch
    指定清单列表中定义的架构。
    kubernetes.io/os
    指定清单列表中定义的操作系统。
警告

如果您没有设置节点关联性规则,且容器被调度到具有不兼容架构的计算机器,pod 会失败并触发以下事件之一:

CrashLoopBackOff
当镜像清单的入口点运行失败时,并在日志中包括 exec format error 信息。
ImagePullBackOff
当清单列表不包含调度 pod 的架构或节点关联性术语设置为错误的值时,会发生。

5.16.2.2. 使用首选节点关联性规则为 Operator 项目配置对多架构计算机器的支持

如果 Operator 在特定构架上更好地执行,您可以配置首选的节点关联性规则,将 pod 调度到指定的架构。

先决条件

  • 使用 Operator SDK 1.31.0 或更高版本创建或维护的 Operator 项目。
  • 定义 Operator 支持的平台的清单列表。
  • 为您的 Operator 项目设置所需的节点关联性规则。

流程

  1. 为定义 pod spec 和 pod 模板 spec 对象的 Kubernetes 清单搜索 Operator 项目。

    Kubernetes 清单示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: s1
    spec:
      containers:
        - name: <container_name>
          image: docker.io/<org>/<image_name>

  2. 在 Kubernetes 清单中设置 Operator 的首选节点关联性规则,以定义 pod spec 和 pod 模板 spec 对象,如下例所示:

    Kubernetes 清单示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: s1
    spec:
      containers:
        - name: <container_name>
          image: docker.io/<org>/<image_name>
      affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: 1
              - preference:
                matchExpressions: 2
                  - key: kubernetes.io/arch 3
                    operator: In 4
                    values:
                    - amd64
                    - arm64
                weight: 90 5

    1
    定义偏好规则。
    2
    如果您指定了多个与 nodeSelectorTerms 关联的 matchExpressions,那么只有所有 matchExpressions 都满足时 pod 才能调度到节点上。
    3
    指定清单列表中定义的架构。
    4
    指定一个 operator。Operator 可以是 InNotInExistsDoesNotExist。例如,使用 In 值要求节点上存在该标签。
    5
    为节点指定权重,有效值为 1-100。优先选择权重最高的节点。

5.16.3. 后续步骤

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.