阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Kubernetes源码阅读及编译

170次阅读
没有评论

共计 2892 个字符,预计需要花费 8 分钟才能阅读完成。

kubernetes 源码阅读

工欲善其事,必先利其器。在阅读 kubernetes 源码时,我也先后使用过多个 IDE,最终还是停留在 IDEA 上。

我惯用的是 pycharm(IDEA 的 Python IDE 版本),配上 go 的插件,把源码目录进行合理组织后,加入到 go 的 lib,即可实现跳转。更多的方法可以参看这里。

kubernetes 源码编译

kubernetes 的源码编译可以分为两种方式。一种是在宿主机 / 物理机上进行编译,这就意味着你需要完整的搭建编译环境,这个会依赖于各种问题,做法相当不 fashion。另外一种则是使用 docker 进行编译。这也是目前最为流行的编译方式。

使用 docker 进行编译

本文以 kubernetes 1.2 为例进行介绍。

kubernetes 自身提供了基于 docker 的编译方式,按照说明,只需要运行
run.sh hack/build-go.sh 即可从源码编译出对应的二进制文件。

流程详解

可以看到 run.sh 中有如下几个步骤:

kube::build::verify_prereqs
kube::build::build_image
kube::build::run_build_command "$@"

verify_prereqs

kube::build::verify_prereqs是为编译做一些检查,包括检查需要的镜像是否存在等。

build_image

kube::build::build_image这一步骤主要是根据 Dockerfile,进行构建镜像。这一步骤如下:

function kube::build::build_image() {
  kube::build::ensure_tar

  mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}"
  
  // 对于源码进行打包,打成 tar 包
  "${TAR}" czf "${LOCAL_OUTPUT_BUILD_CONTEXT}/kube-source.tar.gz" $(kube::build::source_targets)  

  kube::version::get_version_vars
  kube::version::save_version_vars "${LOCAL_OUTPUT_BUILD_CONTEXT}/kube-version-defs"

  // 组织待构建镜像的文件夹
  cp build/build-image/Dockerfile "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
  kube::build::update_dockerfile
  
  // 构建镜像
  kube::build::docker_build "${KUBE_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false'
}

待构建镜像的文件夹位于 _output 文件夹中。可以看到 _output 的目录结构如下:

[root@localhost kubernetes]# tree _output/
_output/
└── images
    └── kube-build:build-cbc077d244
        ├── Dockerfile
        ├── kube-source.tar.gz
        └── kube-version-defs

kube-source.tar.gz即为 kubernetes 源码打成的 tar 包。Dockerfile 即为 build-image/Dockerfile 文件。

之后 docker build 将在 kube-build:build-cbc077d244 文件夹中进行,编译成 kube-build:build-cbc077d244 的镜像。

cbc077d244 为 git 提交时的 id,根据源码 commit 时情况不同该 id 不同。

[root@localhost kubernetes]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
kube-build                             build-cbc077d244    46bca394905f        42 hours ago        1.628 GB
gcr.io/google_containers/kube-cross    v1.4.2-1            eb4273dc5e30        5 months ago        1.551 GB

run_build_command

到现在为止,必要的工作已经基本做完,代码也已经打包进入镜像,此时只要使用 docker 从 kube-build:build-cbc077d244 的镜像 run 一个容器出来,进行编译即可。

实际 kube::build::run_build_command 也就是这样工作的。不过这里面还做了一些额外的工作,比如把编译输出的文件夹通过 -v 参数挂载到 _output/dockerized/bin 下。这样当编译完成之后,生成的二进制文件就可以直接在 _output/dockerized/bin 目录下获取了。

这一过程参见 common.sh#L75

实际问题

一条命令进行编译的愿望很美好。但是理想很丰满,现实很骨感,在实际中有一些问题,导致这一编译不能正常进行。其中首要的问题就是镜像无法拉取的问题。

镜像无法拉取

Dockerfile 中的第一行命令:
FROM gcr.io/google_containers/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG。因此需要依赖于 gcr.io/google_containers/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG 这个镜像。但是由于网络原因,往往无法正常拉取该镜像。所以会导致镜像构建失败。

对于这一问题,有两种方式可以解决:

  • 自己进行构建 kube-cross 镜像
  • 通过代理或者其他方式,获取 gcr.io/google_containers/kube-cross:KUBE_BUILD_IMAGE_CROSS_TAG 镜像

本文主要介绍前一种方式。其实 kube-cross 镜像的内容,可以在 kube-cross 文件夹中获取。当然,要想在国内直接构建这个镜像,仍然会存在无法下载部分包的问题。

所以你需要做的只是运行以下命令即可:

docker pull index.alauda.cn/xuxinkun/kubernetes
docker tag index.alauda.cn/xuxinkun/kubernetes gcr.io/google_containers/kube-cross:v1.4.2-1

编译极为耗时

当使用 run.sh hack/build-go.sh 会编译项目中 linux 下的所有二进制文件。这一过程极为耗时,大概要十几分钟的样子。根据配置不同时间或有增减。

其实在实际过程中,并不需要每次编译所有的文件。比如本次只需要 kubelet,那么可以直接运行run.sh hack/build-go.sh cmd/kubelet,即可只编译 kubelet 文件,缩短编译时间。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147497.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计2892字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中