跳转至

1-克隆K8S源码

代码获取

  • 首先需要安装环境Go,编译器可以使用GoLand
  • 然后拉取代码
  • git clone git@github.com:kubernetes/kubernetes.git

  • 切换分支

  • git checkout v1.9.9

简介

在了解源码之前我们先来回顾下简介,下面的简介翻译自源码中的readme文件,如果喜欢读原文件的可以直接打开readme文件

Kubernetes 是一个开源系统,用于跨多个主机管理[容器化应用程序],为应用程序的部署、维护和扩展提供基本机制。

Kubernetes 建立在 Google 使用名为 [Borg] 的系统大规模运行生产工作负载的十五年经验之上,并结合了来自社区的最佳创意和实践。

Kubernetes 由云原生计算基金会 ([CNCF]) 托管。 如果您是一家希望帮助塑造企业发展的公司 容器打包、动态调度的技术 面向微服务,考虑加入CNCF。 有关谁参与以及 Kubernetes 如何发挥作用的详细信息, 阅读 CNCF [公告]。


开始使用 Kubernetes

有如下教程可以参考:

开始开发 Kubernetes

社区 包含有关的所有信息 从源代码构建 Kubernetes,如何贡献代码 和文件,与谁联系以了解什么等。

如果您想立即构建 Kubernetes,有两种选择:

你有一个工作的 Go 环境 Go environment.
$ go get -d k8s.io/kubernetes
$ cd $GOPATH/src/k8s.io/kubernetes
$ make
你有一个工作的Docker环境 Docker environment.
$ git clone https://github.com/kubernetes/kubernetes
$ cd kubernetes
$ make quick-release

如果想要向官方参考提交代码可以参考文档开发者文档

构建文件在目录build中,可以参考文件build/README.md也

如果您利用容器化的构建环境,构建 Kubernetes 很容易

要求

  1. Docker,使用以下配置之一:

  2. macOS 为 Mac 安装 Docker。请参阅此处的安装说明。 注意 :您需要将 Docker VM 设置为具有至少 8GB 的初始内存,否则构建可能会失败。(见:#11852)。

  3. 带有本地 Docker 的 Linux 根据您的操作系统的说明安装 Docker 。
  4. Windows with Docker Desktop WSL2 backend 按照说明安装 Docker 。确保将源存储在本地 Linux 文件系统中,而不是 Windows 远程挂载/mnt/c.

注意 :您需要检查 Docker CLI 插件 buildx 是否已正确安装(docker-buildx文件应存在于 中~/.docker/cli-plugins)。您可以根据说明安装 buildx 。

  1. 可选的 Google Cloud SDK

如果要将您的版本上传到 Google Cloud Storage,则必须安装和配置 Google Cloud SDK,否则可以安全地省略此操作。

概述

虽然可以使用本地 golang 安装来构建 Kubernetes,但我们有一个在 Docker 容器中运行的构建过程。这简化了初始设置并提供了非常一致的构建和测试环境。

关键脚本

build/目录中可以找到以下脚本。请注意,所有脚本都必须从 Kubernetes 根目录运行。

  • build/run.sh

:在构建 docker 容器中运行命令。常见调用:

- `build/run.sh make`: 在容器中只构建 linux 二进制文件。根据需要传递选项和包。
- `build/run.sh make cross`:为所有平台构建所有二进制文件。要仅构建特定平台,请添加`KUBE_BUILD_PLATFORMS=<os>/<arch>`
- `build/run.sh make kubectl KUBE_BUILD_PLATFORMS=darwin/amd64`:构建(针对特定平台的特定的二进制`kubectl`和`darwin/amd64`分别在该例子中)
- `build/run.sh make test`: 运行所有单元测试
- `build/run.sh make test-integration`: 运行集成测试
- `build/run.sh make test-cmd`: 运行 CLI 测试
  • build/copy-output.sh:这会将_output/dockerized/binDocker 容器中的内容复制到本地_output/dockerized/bin. 它还将复制作为构建过程的一部分生成的特定文件模式。这是作为build/run.sh.

  • build/make-clean.sh:清除 的内容_output,删除所有本地构建的容器映像并删除数据容器。

  • build/shell.sh:放入bash带有当前 repo 代码快照的构建容器中的shell。

基本流程

直接build/使用的脚本用于构建和测试。他们将确保kube-build构建 Docker 镜像(基于Dockerfile 中的build/build-image/Dockerfile基本镜像KUBE_BUILD_IMAGE_CROSS_TAG被替换为基本镜像的那些实际标签之一,如v1.13.9-2),然后在该容器中执行适当的命令。这些脚本将确保从运行到运行缓存正确的数据以进行增量构建,并将结果复制回容器之外。您可以kube-cross通过设置KUBE_CROSS_IMAGE和指定不同的注册表/名称和版本KUBE_CROSS_VERSIONbuild/common.sh有关更多详细信息,请参阅。

kube-build容器图像被首先建立在“背景”目录下建立_output/images/build-image。它是在那里完成的,而不是在 Kubernetes 存储库的根目录下完成,以最大限度地减少我们在构建映像时需要打包的数据量。

有 3 个不同的容器实例从此映像运行。第一个是“数据”容器,用于存储需要持久保存以支持增量构建的所有数据。接下来是一个“rsync”容器,用于将数据传入和传出数据容器。最后有一个“构建”容器,用于实际执行构建操作。每次使用后都会删除 rsync 和构建容器,数据容器会在运行中持续存在。

rsync在幕后透明地使用,以有效地将数据移入和移出容器。这将使用 Docker 选择的临时端口。您可以通过设置KUBE_RSYNC_PORTenv 变量来修改它。

所有 Docker 名称都带有从文件路径派生的散列(以允许在 CI 机器等设备上并发使用)和版本号的后缀。当版本号更改时,所有状态都将被清除并开始清理构建。这允许更改构建基础结构并向 CI 系统发出信号,表明需要删除旧工件。

释放

build/release.sh脚本将构建一个版本。它将构建二进制文件,运行测试,(可选)构建运行时 Docker 镜像。

主要输出是一个 tar 文件:kubernetes.tar.gz. 这包括:

  • 交叉编译的客户端实用程序。
  • kubectl用于根据平台选择和运行正确的客户端二进制文件的脚本 ( )。
  • 例子
  • 各种云的集群部署脚本
  • 包含所有服务器二进制文件的 tar 文件

此外,还创建了一些其他 tar 文件:

  • kubernetes-client-*.tar.gz 特定平台的客户端二进制文件。
  • kubernetes-server-*.tar.gz 特定平台的服务器二进制文件。

在构建最终发布的_output/release-stagetars 时,它们首先被暂存,然后再被 tar'd 并放入_output/release-tars.

再现性

make release它的变体make quick-release提供了一个密封的构建环境,应该为构建提供一定程度的可重复性。make本身 不是 密封的。

Kubernetes 构建环境支持Reproducible Builds 项目指定的SOURCE_DATE_EPOCH环境变量,可以设置为 UNIX 纪元时间戳。这将用于嵌入在编译的 Go 二进制文件中的构建时间戳,也许有一天也用于 Docker 图像。

这个变量的一个合理设置是使用正在构建的树的顶端的提交时间戳;这就是 Kubernetes CI 系统使用的。例如,您可以使用以下单行:

SOURCE_DATE_EPOCH= $( git show -s --format=format:%ct HEAD )
├── Godeps        godep依赖文件
├── api           swagger api文档
├── build         构建用到的命令
├── cluster       自动构建和快速构建k8s集群的脚本(进入维护阶段)
├── cmd           核心:命令入口
├── docs          文档
├── examples      一些部署样例yaml文件
├── hack          hack代码
├── logo          logo图片
├── pkg           核心:具体命令的逻辑代码
├── plugin        主要是kube-scheduler
├── staging       暂存区,用于分离仓库
├── test          test
├── third_party   一些第三方工具
├── translations  多语言文件
└── vendor        依赖代码