支持的平台

Kubebuilder 默认生成可以在多个平台上或特定平台上运行的解决方案,这取决于您如何构建和配置工作负载。本指南旨在帮助您根据需求正确配置项目。

概述

要提供对特定或多个平台的支持,您必须确保在工作负载中使用的所有镜像都构建为支持所需的平台。请注意,这些平台可能与您开发解决方案并使用 KubeBuilder 的平台不同,而是您的解决方案应该运行和分发的平台。建议构建能够在多个平台上运行的解决方案,以便您的项目能够在任何 Kubernetes 集群上工作,无论底层操作系统和架构是什么。

如何定义支持哪些平台

以下内容涵盖了您需要做的事情,以支持一个或多个平台或架构。

1. 构建工作负载镜像,以支持其他平台。

在您的 Pods/Deployments 等工作负载中使用的镜像需要支持其他平台。您可以使用命令 docker manifest inspect 检查这些镜像的支持平台的 ManifestList,例如:

2. (建议作为最佳实践)确保节点亲和性表达式设置为匹配支持的平台。

Kubernetes 提供了一种称为 nodeAffinity 的机制,可以用来限制 pod 可以被调度到的可能节点目标。这在确保跨多个平台的节点(即异构集群)中正确调度行为时尤为重要。

Kubernetes 清单示例

亲和力:
  节点亲和性:
    在调度期间必需,但在执行期间被忽略:
      节点选择器条件:
      - 匹配表达式:
        - key: kubernetes.io/arch
          操作员: In
          值:
          - amd64
          - arm64
          - ppc64le
          - s390x
        - key: kubernetes.io/os
            操作员: In
            值:
              - Linux

Golang 示例

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"},
                                },
                                {
                                    Key:      "kubernetes.io/os",
                                    Operator: "In",
                                    Values:   []string{"linux"},
                                },
                            },
                        },
                    },
                },
            },
        },
        SecurityContext: &corev1.PodSecurityContext{
            ...
        },
        Containers: []corev1.Container{{
            ...
        }},
    },

制作支持多个平台的项目

你可以使用 docker buildx 通过仿真(QEMU)进行交叉编译,以构建管理者镜像。请注意,使用最新版本的 Kubebuilder 脚手架创建的项目具有 Makefile 目标 docker-buildx

使用示例

$ make docker-buildx IMG=myregistry/myoperator:v0.0.1

请注意,您需要确保您的项目所需和使用的所有镜像和工作负载都能提供与上述推荐相同的支持,并且您需要为所有工作负载正确配置 nodeAffinity。因此,请确保在 config/manager/manager.yaml 文件中取消注释以下代码。

# TODO(用户): 取消注释以下代码以根据您的解决方案支持的平台配置 nodeAffinity 表达式。
# 支持多种架构被视为最佳实践。您可以使用 makefile 目标 docker-buildx 构建您的管理器镜像。
# affinity:
#   nodeAffinity:
#     requiredDuringSchedulingIgnoredDuringExecution:
#       nodeSelectorTerms:
#         - matchExpressions:
#           - key: kubernetes.io/arch
#             operator: In
#             values:
#               - amd64
#               - arm64
#               - ppc64le
#               - s390x
#           - key: kubernetes.io/os
#             operator: In
#             values:
#               - linux

默认创建哪些(工作负载)映像?

使用Kubebuilder命令行界面创建的项目有两个工作负载,分别是:

监控程序

用于运行管理器实现的容器配置在config/manager/manager.yaml文件中。该镜像是通过默认生成的Dockerfile构建的,并包含通过命令go build -a -o manager main.go构建的项目二进制文件。

请注意,当您运行 make docker-buildmake docker-build IMG=myregistry/myprojectname:<tag> 时,将会从客户端主机(本地环境)构建一个映像,并生成适用于客户端操作系统/架构的映像,通常是 linux/amd64 或 linux/arm64。