本站总访问量 如何编译开发k8s - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

概述

  • 如何获取代码?
  • 怎么跑起来(编译)?
  • 如何测试?
  • 目录结构是什么?

代码地址

kubernetes代码地址托管在Github上,代码地址为:https://github.com/kubernetes/kubernetes

如何编译

主要有两种方式进行编译:

  • 本地Go语言环境构建
    1
    2
    3
    4
    5
    mkdir -p $GOPATH/src/k8s.io
    cd $GOPATH/src/k8s.io
    git clone https://github.com/kubernetes/kubernetes
    cd kubernetes
    make
  • Docker构建,官方的Kubernetes构建采用此方式
    1
    2
    3
     git clone https://github.com/kubernetes/kubernetes
    cd kubernetes
    make quick-release

关于向官方提交代码和创建Issue的规范可以查看这篇文档

Macos本地构建Kubernetes

博主使用Macos M1进行本地构建。

安装GUN软件包

首先安装编译所需的GUN软件包:

1
find `brew --prefix`/opt -type d -follow -name gnubin -print

设置PATH到.zshrc:

1
2
3
4
5
6
7
8
GNUBINS="$(find `brew --prefix`/opt -type d -follow -name gnubin -print)"

for bindir in ${GNUBINS[@]}
do
export PATH=$bindir:$PATH
done

export PATH

安装etcd

在本地安装etcd:

1
brew install etcd

开始编译

  • 支持按需编译所需的模块,通过make WHAT=cmd/<subsystem>的方式,比如:
    1
    make WHAT=cmd/kubectl
  • 跨平台编译:
    1
    2
    make cross
    make cross KUBE_BUILD_PLATFORMS=windows/amd64 # 执行平台

编译成功后的产物将在_output/bin/kubectl

我们选择编译所有的组件,使用make all在代码根目录下执行

  • 需要 bash版本 >= 4.2,可以使用brew install bash来更新版本

执行完毕之后,可以在_output/bin看到如下输出:

1
2
3
apiextensions-apiserver go-runner               kube-controller-manager kube-scheduler          kubectl-convert         mounter
e2e.test kube-aggregator kube-log-runner kubeadm kubelet ncpu
ginkgo kube-apiserver kube-proxy kubectl kubemark

如何测试

开发者提交的patch需要经过单元、集成和端到端测试并通过才能被合并。

  1. 提交前验证

运行以下命令进行提交代码前的一系列验证

1
make verify
  1. 单元测试

针对一个特定的包进行测试:

1
make test WHAT=./pkg/apis/core/helper GOFLAGS=-v

每次拉取请求都需要通过所有的单元测试,运行以下进行单元测试:

1
make test
  1. 集成测试

运行集成测试需要以来etcd,可以运行以下执行集成测试:

1
make test-integration
  1. 端到端测试

端到端测试需要花费很长时间,会启动,测试一个集群,最后删除一个集群:

https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/e2e-tests-kubetest2.md

目录结构

├── api/ # Kubernetes API 定义
│ ├── v1/ # Kubernetes API 版本 1
│ ├── v1beta1/ # Kubernetes API 版本 1beta1
│ └── …/
├── cmd/ # Kubernetes 命令行工具
│ ├── kube-apiserver/ # Kubernetes API Server
│ ├── kube-controller-manager/ # Kubernetes Controller Manager
│ ├── kube-proxy/ # Kubernetes Proxy
│ ├── kube-scheduler/ # Kubernetes Scheduler
│ ├── kubeadm/ # Kubernetes 初始化工具
│ ├── kubectl/ # Kubernetes 命令行客户端
│ └── …/
├── pkg/ # Kubernetes 代码库
│ ├── apis/ # Kubernetes API 实现
│ ├── apiserver/ # Kubernetes API Server 实现
│ ├── client/ # Kubernetes 客户端实现
│ ├── controller/ # Kubernetes 控制器实现
│ ├── kubelet/ # Kubernetes Kubelet 实现
│ ├── proxy/ # Kubernetes Proxy 实现
│ ├── scheduler/ # Kubernetes Scheduler 实现
│ ├── util/ # Kubernetes 工具库
│ └── …/
├── vendor/ # 第三方依赖
├── Godeps/ # 过时的第三方依赖管理
├── hack/ # 构建、测试、发布脚本
├── docs/ # Kubernetes 文档
├── test/ # 测试代码
├── examples/ # Kubernetes 示例
├── LICENSES/ # 第三方依赖许可证
├── OWNERS # Kubernetes 代码库的所有者列表
├── README.md # Kubernetes 代码库说明文档
├── go.mod # Go 模块文件
└── go.sum # Go 模块文件

评论