跳到主要内容
版本:1.4.0

建构和运行

YuniKorn始终与容器编排系统一起使用。目前,在我们的存储库中提供了一个Kubernetes适配器yunikorn-k8shim,您可以利用它来开发YuniKorn调度功能并与Kubernetes集成。本文档描述了如何设置开发环境以及如何进行开发。

开发环境设置

首先阅读环境设置指南以设置Docker和Kubernetes开发环境。

为Kubernetes构建YuniKorn

先决条件:

  • Golang: 在存储库的根目录中检查 .go_version 文件以获取Yunikorn所需的版本。最低版本可能会根据发布分支而变化。较早的Go版本可能会导致编译问题。

您可以从 yunikorn-k8shim 项目构建用于Kubernetes的调度器。 构建过程将所有组件构建为一个可部署并在Kubernetes上运行的单个可执行文件。

通过拉取 yunikorn-k8shim 存储库来启动集成构建过程:

mkdir $HOME/yunikorn/
cd $HOME/yunikorn/
git clone https://github.com/apache/yunikorn-k8shim.git

此时,您已经拥有一个允许您构建YuniKorn调度器的集成映像的环境。

关于Go模块和Git版本的说明

Go使用Git来获取模块信息。 如果用于构建的计算机上安装的Git版本较旧,可能无法检索某些模块。 当首次尝试构建时,可能会记录类似于下面的消息:

go: finding modernc.org/mathutil@v1.0.0
go: modernc.org/golex@v1.0.0: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in <location>: exit status 128:
error: RPC failed; result=22, HTTP code = 404
fatal: The remote end hung up unexpectedly

要解决此问题,请将Git更新到较新的版本。 已知Git版本1.22或更高版本可以正常工作。

构建Docker镜像

可以通过以下命令触发构建Docker镜像。

make image

带有内置配置的镜像可以直接部署到Kubernetes上。 可以在 deployments 目录下找到一些示例部署。 对于使用ConfigMap的部署,您需要在Kubernetes中设置ConfigMap。 如何使用ConfigMap部署调度器在 scheduler configuration deployment 文档中有详细说明。

镜像构建命令首先会构建集成可执行文件,然后创建Docker镜像。 如果您想使用基于发布的预构建镜像,请检查 Docker Hub repo.

默认的镜像标签不适用于部署到可访问存储库,因为它使用了硬编码的用户并且会使用正确的凭据推送到Docker Hub。 您必须更新Makefile中的TAG变量以推送到可访问存储库。 在更新镜像标签时,请注意,所提供的部署示例也需要相应更新以反映相同的更改

检查 Docker 镜像

之前构建的Docker镜像包含了一些重要的构建信息,您可以使用Docker的inspect命令来检索这些信息。

docker inspect apache/yunikorn:scheduler-amd64-latest

amd64标签取决于您的主机架构(例如,对于Intel,它将是amd64,对于Mac M1,它将是arm64)。

这些信息包括每个组件的git修订版(最后的提交SHA),以帮助您了解此镜像中包含的源代码版本。它们以 Docker 镜像的标签形式列出,例如:

"Labels": {
"BuildTimeStamp": "2019-07-16T23:08:06+0800",
"Version": "0.1",
"yunikorn-core-revision": "dca66c7e5a9e",
"yunikorn-k8shim-revision": "bed60f720b28",
"yunikorn-scheduler-interface-revision": "3df392eded1f"
}

依赖关系

项目中的依赖关系使用Go模块来管理。 Go模块要求在开发系统上至少安装Go版本1.11。

如果您想在本地修改其中一个项目并使用本地依赖关系进行构建,您需要更改模块文件。 更改依赖关系使用replace指令,如 Update dependencies中所述。

YuniKorn项目有四个存储库,其中三个存储库在Go级别有依赖关系。 这些依赖关系是Go模块的一部分,指向GitHub存储库。 在开发周期中,可能需要打破对GitHub提交版本的依赖关系。 这需要更改模块文件,以允许加载本地副本或从不同存储库中分叉的副本。

受影响的存储库

以下存储库之间存在依赖关系:

repositorydepends on
yunikorn-coreyunikorn-scheduler-interface
yunikorn-k8shimyunikorn-scheduler-interface, yunikorn-core
yunikorn-scheduler-interfacenone
yunikorn-webyunikorn-core

yunikorn-web 存储库不直接依赖于其他存储库的Go模块。但是,对 yunikorn-core 的webservices进行的任何更改都可能影响Web界面。

进行本地更改

为了确保本地更改不会破坏构建的其他部分,您应该执行以下操作:

  • 进行完整构建 make(构建目标取决于存储库)
  • 运行完整的单元测试 make test

应该在继续之前修复任何测试失败。

更新依赖关系

最简单的方法是在模块文件中使用replace指令。replace指令允许您使用新的(本地)路径覆盖导入路径。 不需要更改源代码中的任何导入。更改必须在具有依赖关系的存储库的go.mod文件中进行。

使用replace来使用分叉的依赖关系,例如:

replace github.com/apache/yunikorn-core => example.com/some/forked-yunikorn

没有必要分叉并创建新的存储库。如果您没有存储库,也可以使用本地检出的副本。 使用replace来使用本地目录作为依赖关系:

replace github.com/apache/yunikorn-core => /User/example/local/checked-out-yunikorn

对于相同的依赖关系,使用相对路径:

replace github.com/apache/yunikorn-core => ../checked-out-yunikorn

注意:如果replace指令使用本地文件系统路径,那么目标路径必须具有该位置的go.mod文件。

有关模块的更多详细信息,请参阅模块的维基页面。: When should I use the 'replace' directive?.

构建Web用户界面(UI)

示例部署引用了YuniKorn Web用户界面yunikorn-web 项目对构建有特定要求。请按照README中的步骤准备开发环境并构建Web用户界面(UI)。然而,调度器在没有Web用户界面的情况下仍然可以完全正常运作。

在本地运行集成调度器

在您设置好本地开发环境后,可以在本地的Kubernetes环境中运行集成调度器。 这已在桌面环境中进行了测试,包括Docker Desktop、Minikube和Kind。有关更多详细信息,请参阅环境设置指南

make run

它将使用用户配置的配置文件,位于 $HOME/.kube/config 中,连接到Kubernetes集群。

要以Kubernetes调度器插件模式运行YuniKorn,执行:

make run_plugin

只要$HOME/.kube/config文件指向远程集群,您也可以使用相同的方法在本地运行调度器并连接到远程Kubernetes集群。

通过端到端测试验证外部接口更改

Yunikorn具有外部REST接口,由端到端测试验证。但是,这些测试存在于k8shim存储库中。 每当对外部接口进行更改时,请确保通过运行端到端测试进行验证,或者相应地调整测试用例。

如何在本地运行测试的说明已经在文档中描述。here.