2.5 从源代码构建 NDB Operator 镜像

本节介绍如何从源代码编译、安装和测试 NDB Operator。如果您还没有源代码,请参阅 第 2.2 节“获取 NDB Operator”

以下先决条件必须安装在系统上才能构建和测试 NDB Operator

Golang 1.16 或更新版本,用于编译 Operator。

Docker 用于构建 NDB Operator 和其他容器镜像。Docker 也用于运行端到端测试用例。

MinikubeKinD 用于部署和测试 NDB Operator。还需要 Kubernetes 1.19 或更高版本。

源代码中包含的 Makefile 包含构建 Operator 所需的所有目标;这可以使用如下所示的命令完成

> make build

自定义资源定义和其他清单文件由 build 目标重新生成。

默认情况下,NDB Operator 以发布模式构建。要在开发中以调试模式构建它,请在调用构建时将 WITH_DEBUG 环境变量设置为 1,如下所示

> WITH_DEBUG=1 make build

要生成 NDB Operator Docker 镜像,请运行如下所示的命令

> make operator-image

镜像构建完成后,必须使其可供 Kubernetes 集群访问。对于 KinD,可以使用 kind load docker_image 命令加载镜像。对于 Minikube,这取决于使用的容器运行时;请参阅 将镜像推送到 Minikube 集群。有关设置 NDB Operator 和使用 Operator 部署 NDB 集群的信息,请参阅 第 3 章“使用 NDB Operator 部署 NDB 集群”

使用 Minikube 时,默认内存分配可能不足以运行 NDB Operator;您可以使用 minikube config set memory_limit 增加它。要部署 docs/examples/example-ndb.yaml 中的示例,Minikube 至少需要 5GB 内存;您可以按如下所示设置

> minikube config set memory 5GB

对 NdbCluster 类型进行更改。 如果对 pkg/apis/ndbcontroller/v1/types.go 中的 NdbCluster 类型进行了任何更改,则必须重新生成客户端集、通知程序和列表器。您可以通过在 pkg/generated 中执行以下命令来完成此操作

> make generate
警告

在 NDB Operator 升级过程中,请勿尝试修改 NdbCluster 类型。有关更多信息,请参阅 第 2.7 节“升级 NDB Operator”

测试 NDB Operator。 NDB Operator 项目附带了使用 Go testing 包开发的单元测试,以及构建在 Ginkgo/Gomega 测试框架之上的更精细的端到端 (E2E) 测试套件。

大多数单元测试与包位于同一位置,并测试这些包中的方法。它们有时会使用模拟的 Kubernetes 客户端来验证 NDB Operator 发送的请求是否符合预期。

E2E 测试用例是集成测试的集合,这些测试会对 NdbCluster 资源对象进行更改,并验证由该对象控制的 NDB 集群配置是否相应更改。测试用例使用内部开发并构建在 Ginkgo 测试框架之上的 E2E 框架。测试应使用 e2e-tests/run-e2e-test.go 运行;此测试工具的选项可以在 e2e-tests/README.md 中找到。测试可以在现有的 Kubernetes 集群中运行,也可以使用 KinD 在新的 Kubernetes 集群中运行。

要生成 E2E 测试镜像,请在命令行上运行 make e2e-tests

要在现有的 Kubernetes 集群中运行 E2E 测试,请将此集群的 kubeconfig 文件的路径传递给 run-e2e-test.go 工具,如下所示

> go run e2e-tests/run-e2e-test.go -kubeconfig=path/to/file

mysql/ndb-operatore2e-tests 镜像必须都可供 Kubernetes 集群访问。

测试工具还可以启动其自己的 KinD 集群,然后在其中运行 E2E 测试。包含 mysql/ndb-operatore2e-tests 镜像的 Docker 实例必须可以从运行测试的终端访问。KinD 集群作为此过程的一部分在 Docker 内部启动。您可以通过运行以下任一命令来完成此操作

> go run e2e-tests/run-e2e-test.go -use-kind

> make e2e-kind