GitHub Kubernetesのソースコードからビルドする方法のメモ

本文介绍了如何从GitHub的源代码https://github.com/kubernetes/kubernetes构建可执行命令的Kubernetes的方法。这份备忘录将记录下以下三种版本的构建方法。

    1. 从开发中的源代码进行构建,该源代码在发布之前。

 

    1. 从已发布且处于支持期间的最新代码进行构建。

 

    从已经发布的(GA)代码进行构建。

准备建设环境

为了不影响我每天使用的Mac、Windows等工作环境,我打算在Vagrant + VirtualBox的虚拟机上,将Kubernetes从源代码编译成二进制文件。由于本文不涉及Vagrant和VirtualBox的安装方法,请参考它们各自的软件官方网站进行安装。

以下是构建虚拟机的Vagrantfile清单。您可以创建一个启动目录,并将此文件放在其中,然后通过运行vagrant up来完成构建环境的搭建。

在这个文件中,通过 `vb.memory = “16384”` 分配了 16GB 的内存,并通过 `vb.cpus = 16` 分配了 16 个虚拟CPU。为了节省时间,我建议在虚拟机主机资源允许的情况下,将这些值设置为尽可能大,这样会很有好处。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  config.vm.synced_folder ".", "/vagrant"
  config.vm.provider "virtualbox" do |vb|
     vb.gui = false
     vb.memory = "16384"
     vb.cpus = 16
  end
  config.vm.provision "shell", inline: <<-SHELL
     apt-get update
     apt-get install -y build-essential
     export GO_VER="1.14.2"
     curl -s -O https://dl.google.com/go/go${GO_VER}.linux-amd64.tar.gz
     tar -C /usr/local -xzf go${GO_VER}.linux-amd64.tar.gz
     echo "export PATH=$PATH:/usr/local/go/bin" > /home/vagrant/.profile
     echo "export GOPATH=/home/vagrant" >> /home/vagrant/.profile
  SHELL
end

以下是启动前的命令列表。请使用vi等编辑器准备上述文件,并使用vagrant up命令启动。

mkdir k8s-build
cd k8s-build
vi Vagrantfile
vagrant up

从开发中的源代码中构建之前的发布

这种方法与GitHub上的https://github.com/kubernetes/kubernetes中描述的方法几乎相同,我将在这里写下在使用vagrant ssh登录虚拟机后需要进行的操作。

只需在虚拟机启动阶段就已经准备好了能够编译和链接Go语言源代码的环境,只需要设置环境变量GOPATH,创建目录并移动后,从GitHub克隆代码,然后开始编译即可。

vagrant@ubuntu-bionic:~$ export GOPATH=`pwd`/v1.19.x
vagrant@ubuntu-bionic:~$ mkdir -p $GOPATH/src/k8s.io
vagrant@ubuntu-bionic:~$ cd $GOPATH/src/k8s.io
vagrant@ubuntu-bionic:~/v1.19.x/src/k8s.io$ git clone https://github.com/kubernetes/kubernetes
...

vagrant@ubuntu-bionic:~/v1.19.x/src/k8s.io$ cd kubernetes/
vagrant@ubuntu-bionic:~/v1.19.x/src/k8s.io/kubernetes$ make
...

将构建完成的二进制文件复制到虚拟化主机和共享目录/vagrant,以便在此虚拟机外部使用。二进制文件位于当前目录的_output/bin/下。

vagrant@ubuntu-bionic:~/v1.19.x/src/k8s.io/kubernetes$ mkdir /vagrant/v1.19.x
vagrant@ubuntu-bionic:~/v1.19.x/src/k8s.io/kubernetes$ cp _output/bin/* /vagrant/v1.19.x/
vagrant@ubuntu-bionic:~/v1.19.x/src/k8s.io/kubernetes$ exit

尝试使用 kubectl 命令显示版本作为动作确认。如下所示,可以看出它是 v1.19.0 的 Alpha 版本。

tkr@hibiki:~/build-k8s/v1.19.x$ ./kubectl version --client --short
Client Version: v1.19.0-alpha.3.84+a3cf6fc0aae6be

要对每台虚拟机进行清理,可以使用vagrant destroy。

从已经发布并处于支持期的最新代码进行构建

举例来说,假设已经发布了 Kubernetes v1.18.2 的补丁版本,并且正在准备发布 v1.18.3 的补丁版本,下面是使用最新代码进行构建的方法。

vagrant@ubuntu-bionic:~$ export GOPATH=`pwd`/v1.18.x
vagrant@ubuntu-bionic:~$ mkdir -p $GOPATH/src/k8s.io
vagrant@ubuntu-bionic:~$ cd $GOPATH/src/k8s.io
vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io$ git clone https://github.com/kubernetes/kubernetes
vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io$ cd kubernetes/

在之前我们共同讨论过的内容之后,接下来将列出分支,并切换到已经建立的分支上。

vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io/kubernetes$ git branch -a
* master
...
  remotes/origin/release-1.16
  remotes/origin/release-1.17
  remotes/origin/release-1.18
  remotes/origin/release-1.2
  remotes/origin/release-1.3
...

在切换分支后,您可以按照相同的步骤获取v1.18.x的最新补丁版本。

vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io/kubernetes$ git checkout release-1.18
...

vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io/kubernetes$ make

将使用上述构建的二进制文件复制到共享目录中。

vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io/kubernetes$ mkdir /vagrant/v1.18.x
vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io/kubernetes$ cp _output/bin/* /vagrant/v1.18.x
vagrant@ubuntu-bionic:~/v1.18.x/src/k8s.io/kubernetes$ exit

登出虚拟机后,使用 kubectl 命令查看版本,确认它是GA之前的代码。

tkr@hibiki:~/build-k8s$ cd v1.18.x
tkr@hibiki:~/build-k8s/v1.18.x$ ./kubectl version --client --short
Client Version: v1.18.3-beta.0.26+058eecbfefc296

构建已发布的Kubernetes的方法

已发布的 Kubernetes 版本可以在此 URL https://github.com/kubernetes/kubernetes/releases 进行查阅,并且还提供了源代码的下载链接。本节将从该 URL 下载源代码并生成二进制文件。

具体来说,在登录建筑虚拟机后,您可以从前述的URL选择版本并下载源代码的tar文件,然后按照相同的步骤进行操作。

curl -OL https://dl.k8s.io/v1.18.2/kubernetes-src.tar.gz
export GOPATH=`pwd`/v1.18.2
mkdir $GOPATH
tar -C $GOPATH -xzf kubernetes-src.tar.gz
cd $GOPATH
make

从虚拟机构建到主机,复制二进制文件。

vagrant@ubuntu-bionic:~/v1.18.2$ mkdir /vagrant/v1.18.2
vagrant@ubuntu-bionic:~/v1.18.2$ cp _output/bin/* /vagrant/v1.18.2/
vagrant@ubuntu-bionic:~/v1.18.2$ exit

总结

我在研究如何从Kubernetes的源代码构建可执行的二进制文件。我发现只要准备好Go语言的开发环境,构建二进制文件就很简单。另外,GitHub的代码是每个版本的最新代码,如果想使用已发布(GA)的源代码,可以从Releases https://github.com/kubernetes/kubernetes/releases 获取。

下一步,我想要解决如何使用创建的可执行文件来运行K8s集群。

bannerAds