译者注:该指南用于k8s源码开发的前置工作
- 原文
提交前检查
确定你的问题或PR是在改进Kubernetes的架构,还是只是在修复一个bug。
如果有需要的话可以通过使用图表描述。将问题Q和结论A分开,比如Q(组件Y对于SLA来说太慢了)A(让Y快了X倍)
其中一些检查在Kubernetes早期开发时并不常见。现在我们有超过50000个contributors,每个issue都应该小心处理。任何问题都不应该花费超过5分钟的时间来检查是否正常(即使是最繁忙的reviewers也可以花5分钟时间来检查一个经过深思熟虑的patch)。
这只是一个简单的bug修复吗
简单的bug修复patch很容易review,因为测试覆盖是随补丁一起提交的。bug patch通常不需要很多额外的测试,但请更新单元测试,以便他们对错误进行catch!
这是一种架构改进吗
架构改进的一些例子
- 增加一个新的功能,或使一个功能更加可配置或模块化。
- 提高测试覆盖率。
- 解耦逻辑或创建新的utils功能。
- 使代码更有弹性(sleeps, backoffs, reducing flakiness, etc.)。
这类改进很容易被评估,尤其是当它们在不破坏功能的情况下减少代码行数的时候。也就是说,请在你的Pull Request中确切地解释你在 "清理 "什么,以避免浪费评审员的时间。
如果你让代码变得更有弹性,请包括展示新的弹性行为的测试。例如:如果你的补丁使控制器能更好地处理不一致的数据,请制作一个模拟对象,返回几次不正确的数据,并验证控制器的新行为。
这是一种性能改进吗
性能错误报告必须包括能证明该错误的数据。没有数据,该问题将被关闭。你可以使用kubemark、scheduler_perf、go基准测试或e2e测试在真实的集群上用指标图来测量性能。
一个错误的例子:
我们应该做X而不是Y,因为这可能导致更好的性能。 用X代替Y可以减少对Z的调用。 上述声明对评审员没有价值,因为它们都没有数据支持。像这样写的问题使你的PR无人问津,并浪费你的评审员的时间。
可能的性能改进的例子包括(记住,你必须用数据来记录这些改进)。
-
改进缓存实现。
-
减少对O(n^2)函数的调用。
-
减少对API服务器请求的依赖。
-
改变进程的默认参数值,或者使这些参数值更加 "聪明"。
-
并行一个需要在大量节点/pod对象上运行的计算。
这些问题应该总是与下面的内容一起提交(按价值递减的顺序)。
- 一个golang基准测试。
- 集群上的指标负载减少的可视化描述(可使用指标/端点和grafana测量)。
- 手工测量的时间测试(即在控制器管理器中添加一些日志)。
下面是一些正确提交性能问题的例子。如果你是kubernetes的新手,并考虑提交性能优化,在开始之前,请重新阅读其中的一个或全部内容。
- kubernetes/kubernetes#18266 (apiserver)
- kubernetes/kubernetes#32833 (node)
- kubernetes/kubernetes#31795 (scheduler)
由于性能的提高可以用经验来衡量,你应该遵循 "科学方法",即建立假设,收集数据,然后修改你的假设。
上述问题透明地做到了这一点,使用数字和数据,而不是猜想。
使用Docker构建K8s
官方版本是使用Docker容器构建的。要使用Docker构建Kubernetes,请遵循以下说明these instructions.。
在本地操作系统/shell环境下构建Kubernetes
虽然通过Docker构建可能更简单,但有时在你的本地工作站或其他壳环境中进行开发是有意义的。下面的细节概述了在Linux、Windows和MacOS上构建的硬件和软件要求。
设置MacOS
由于Kubernetes假定你使用的是GNU命令行工具,你将需要在你的系统上安装这些工具。按照这些指示来安装这些工具。特别是,这个命令安装了必要的软件包。
brew install coreutils ed findutils gawk gnu-sed gnu-tar grep make jq
在你的.bashrc或shell初始化脚本中加入下面的代码
GNUBINS="$(find `brew --prefix`/opt -type d -follow -name gnubin -print)"
for bindir in ${GNUBINS[@]}
do
export PATH=$bindir:$PATH
done
export PATH
安装所需软件
Kubernetes开发辅助脚本需要一个最新的GNU开发工具环境。安装这些工具的方法因系统而异。
Installing on macOS
一些构建工具在您之前用GNU命令行工具准备您的系统时已经安装了。然而,你还需要安装Xcode的命令行工具。
Docker
Kubernetes开发需要Docker来运行某些验证。要在你的开发环境中安装Docker,请遵循Docker网站的指示。
注意:如果你运行的是macOS,确保/usr/local/bin在你的PATH中。
rsync
Kubernetes构建系统需要rsync,一个常见的文件同步和传输工具。大多数现代操作系统已经安装了rsync。
jq
有些Kubernetes帮助脚本需要在开发环境中安装jq,这是一个命令行JSON处理器。jq安装指南提供了受支持平台的详细说明。
gcloud
如果你打算远程构建或运行端到端(e2e)测试,你将需要安装谷歌云平台的命令行接口。
Go
Kubernetes是用Go编写的。如果你没有Go开发环境,请遵循Go入门指南中的说明。
确认你的GOPATH和GOBIN环境变量已经正确设置,详见**《如何编写Go代码》**。
PyYAML - PyYAML is a YAML parser and emitter for Python.
一些Kubernetes验证测试使用PyYAML,因此需要安装它以在本地环境中成功运行所有验证测试。你可以使用PyYAML文档来找到你的平台的安装说明。
注意:如果你运行的是MacOS,你可能需要使用pip3命令而不是pip命令来安装PyYAML。
克隆 Kubernetes Git 仓库
现在你已经准备好克隆Kubernetes的git仓库了。请参阅《贡献者指南》中的GitHub工作流程文件,了解相关说明。
etcd
为了测试Kubernetes,你需要安装最新版本的etcd,这是一个一致的、高可用的键值存储。要安装本地版本的etcd,在你的Kubernetes工作目录下运行以下命令。
./hack/install-etcd.sh 这个脚本将指示你对你的PATH做一个修改。要使其永久化,请将此添加到你的.bashrc或登录脚本中。
`export PATH="$GOPATH/src/k8s.io/kubernetes/third_party/etcd:${PATH}"
一旦你安装了所有需要的软件,你就可以进入构建Kubernetes部分,测试它是否全部正常工作。
构建k8s
验证开发环境的最佳方法是构建Kubernetes的一部分。这允许您在不等待完整构建完成的情况下解决问题并纠正配置。本节简要介绍编译Kubernetes子系统的各种方法。要了解更多详细的说明,请参阅Kubernetes官方文档中的构建Kubernetes。 以kubectl为例,下面的命令将kubectl生成在_output/bin/kubectl目录下
# make WHAT=cmd/<subsystem>
make WHAT=cmd/kubectl
要构建整个Kubernetes项目,运行以下命令(all可忽略)
make all
一些入参例子
# -e表示放开默认对golang编译器的错误输出限制(默认仅输出10条)
make WHAT="cmd/kubectl" GOGCFLAGS="-e"
# 如果需要在编译的Kubernetes可执行文件上使用调试检查工具,加入-N -l作为入参
make WHAT="cmd/kubectl" GOGCFLAGS="-N -l"
测试k8s
提交前验证
提交前验证提供了一系列的检查和测试,使你的pr有更大概率被merge。开发人员需要在本地运行尽可能多的验证测试。 你可以在Kubernetes项目目录下的hack/verify-*.sh中查看所有验证测试的列表。 要运行所有提交前的验证测试,请使用此命令。
make verify
如果特定的验证测试失败,则可能会有一个更新脚本来帮助解决该问题。这些位于hack/update-*.sh中。例如,hack/update-gofmt.sh确保所有源代码文件均正确格式化。
要运行所有的更新脚本,请使用此命令。
make update
单元测试
运行所有的单元测试
make test
您还可以使用WHAT来控制测试哪些包和子系统,并使用GOFLAGS来更改测试的运行方式。例如,要对一个包运行单元测试,可以使用这样的命令
make test WHAT=./pkg/apis/core/helper GOFLAGS=-v
集成测试
所有的集成测试都需要通过,pr才算过关。注意,对于这个阶段,正确安装etcd尤其重要。没有它,集成测试将失败。
要运行集成测试,请使用此命令,详情见github.com/kubernetes/…
make test-integration
端到端测试
端到端(E2E)测试提供了一种机制来测试系统的端到端行为。E2E测试的主要目标是确保Kubernetes代码库的一致和可靠行为,特别是在单元测试和集成测试不足的领域。
端到端测试构建测试二进制文件,启动测试集群,运行测试,然后拆除集群。
注意:运行所有的E2E测试需要很长时间!
要了解更多关于端到端测试的信息,包括通过运行特定测试节省时间的方法,请阅读Kubernetes中的端到端测试和kubetest2的入门指南。
依赖管理
Kubernetes使用GO模块来管理依赖项。
想要在vendor/树中进行依赖管理的开发者请阅读github.com/kubernetes/…