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 Spec 或 Image Manifest v2, Schema 2。
如果您的 Operator 项目部署了应用程序或其他工作负载资源,以下步骤会假定应用程序在应用程序发行过程中构建应用程序的多平台镜像。
先决条件
- 使用 Operator SDK 版本 1.31.0 或更高版本构建的 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.go 1
- 1
- 将
GOARCH
字段从amd64
更改为$TARGETARCH
。
您的 Operator 项目的 makefile 定义
PLATFORMS
环境变量。如果 Operator 的镜像不支持默认设置的所有平台,请编辑变量以指定支持的平台。以下示例将支持的平台定义为linux/arm64
和linux/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
变量指定的每个平台创建一个镜像清单。从 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 支持的平台的清单列表。
流程
为定义 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/arch 4 operator: In values: - amd64 - arm64 - ppc64le - s390x - key: kubernetes.io/os 5 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.31.0 或更高版本创建或维护的 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/arch 3 operator: In 4 values: - amd64 - arm64 weight: 90 5
其他资源