k8s官方开发指南(译文)

367 阅读8分钟

译者注:该指南用于k8s源码开发的前置工作

  • 原文

github.com/kubernetes/…

提交前检查

确定你的问题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的新手,并考虑提交性能优化,在开始之前,请重新阅读其中的一个或全部内容。

由于性能的提高可以用经验来衡量,你应该遵循 "科学方法",即建立假设,收集数据,然后修改你的假设

上述问题透明地做到了这一点,使用数字和数据,而不是猜想。

使用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/…