5.16. 为多平台支持配置 Operator 项目
与只支持单个平台的 Operator 项目相比,支持多架构和操作系统的 Operator 项目或平台可在更多的 Kubernetes 和 OpenShift Container Platform 集群上运行。示例构架包括 amd64, arm64, ppc64le, 和 s390x。示例操作系统包括 Linux 和 Windows。
执行以下操作以确保 Operator 项目可在多个 OpenShift Container Platform 平台上运行:
- 构建指定 Operator 支持的平台的清单列表。
- 设置 Operator 的节点关联性,以支持多架构计算机器。
红帽支持的 Operator SDK CLI 工具版本,包括 Operator 项目的相关构建和测试工具已被弃用,计划在以后的 OpenShift Container Platform 发行版本中删除。红帽将在当前发行生命周期中提供对这个功能的程序错误修复和支持,但此功能将不再获得改进,并将在以后的 OpenShift Container Platform 版本中删除。
对于创建新 Operator 项目,不建议使用红帽支持的 Operator SDK 版本。现有 Operator 项目的 Operator 作者可以使用 OpenShift Container Platform 4.17 发布的 Operator SDK CLI 工具版本来维护其项目,并创建针对较新版本的 OpenShift Container Platform 的 Operator 发行版本。
以下与 Operator 项目相关的基础镜像 没有被弃用。这些基础镜像的运行时功能和配置 API 仍然会有程序错误修复和并提供对相关 CVE 的解决方案。
- 基于 Ansible 的 Operator 项目的基础镜像
- 基于 Helm 的 Operator 项目的基础镜像
有关 OpenShift Container Platform 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行注记中已弃用和删除的功能部分。
有关 Operator SDK 不支持的、社区维护版本的信息,请参阅 Operator SDK (Operator Framework)。
5.16.1. 构建 Operator 支持的平台清单列表 复制链接链接已复制到粘贴板!
您可以使用 make docker-buildx 命令构建 Operator 和操作对象支持的平台清单列表。清单列表引用一个或多个架构的特定镜像清单。镜像清单指定镜像支持的平台。
如需更多信息,请参阅 OpenContainers Image Index Spec 或 Image Manifest v2, Schema 2。
如果您的 Operator 项目部署了应用程序或其他工作负载资源,以下步骤会假定应用程序在应用程序发行过程中构建应用程序的多平台镜像。
先决条件
- 使用 Operator SDK 版本 1.36.1 或更高版本构建的 Operator 项目
- 已安装 Docker
流程
检查 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 }, ... ] }如果上一命令没有输出平台信息,则指定的基础镜像可能是单个镜像,而不是镜像清单。您可以运行以下命令来查找镜像支持哪些架构:
$ docker inspect <image>对于基于 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.go1 - 1
- 将
GOARCH字段从amd64更改为$TARGETARCH。
您的 Operator 项目的 makefile 定义
PLATFORMS环境变量。如果 Operator 的镜像不支持默认设置的所有平台,请编辑变量以指定支持的平台。以下示例将支持的平台定义为linux/arm64和linux/amd64:makefile 示例
# ... PLATFORMS ?= linux/arm64,linux/amd641 .PHONY: docker-buildx # ...- 1
- 以下
PLATFORMS值默认设置:linux/arm64,linux/amd64,linux/s390x, 和linux/ppc64le。
当您运行
make docker buildx命令来生成清单列表时,Operator SDK 会为PLATFORMS变量指定的每个平台创建一个镜像清单。从 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.36.1 或更高版本创建或维护的 Operator 项目。
- 定义 Operator 支持的平台的清单列表。
流程
为定义 pod spec 和 pod 模板 spec 对象的 Kubernetes 清单搜索 Operator 项目。
重要因为 YAML 文件中没有声明对象类型名称,请查找 Kubernetes 清单中的强制
containers字段。在同时指定 pod spec 和 pod 模板 spec 对象时,需要containers字段。您必须在定义 pod spec 或 pod 模板 spec 的所有 Kubernetes 清单中设置节点关联性规则,包括
Pod、Deployment、DaemonSet和StatefulSet等对象。Kubernetes 清单示例
apiVersion: v1 kind: Pod metadata: name: s1 spec: containers: - name: <container_name> image: docker.io/<org>/<image_name>在 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/arch4 operator: In values: - amd64 - arm64 - ppc64le - s390x - key: kubernetes.io/os5 operator: In values: - linux使用动态创建工作负载的基于 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.36.1 或更高版本创建或维护的 Operator 项目。
- 定义 Operator 支持的平台的清单列表。
- 为您的 Operator 项目设置所需的节点关联性规则。
流程
为定义 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>在 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/arch3 operator: In4 values: - amd64 - arm64 weight: 905