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文件夹中获取。当然,要想在国内直接构建这个镜像,仍然会存在无法下载部分包的问题。这里我使用了灵雀云的系统来构建这个镜像。这里是我的kubernetes镜像

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

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文件,缩短编译时间。

kubernetes源码阅读及编译的更多相关文章

  1. Kubernetes 学习(八)Kubernetes 源码阅读之初级篇------源码及依赖下载

    0. 前言 阅读了一段时间 Golang 开源代码,准备正式阅读 Kubernetes 项目代码(工作机 Golang 版本为 Go 1.12) 参照 <k8s 源码阅读> 选择 1.13 ...

  2. Kubernetes 学习(九)Kubernetes 源码阅读之正式篇------核心组件之 Scheduler

    0. 前言 继续上一篇博客阅读 Kubernetes 源码,参照<k8s 源码阅读>首先学习 Kubernetes 的一些核心组件,首先是 kube-scheduler 本文严重参考原文: ...

  3. 转-OpenJDK源码阅读导航跟编译

    OpenJDK源码阅读导航 OpenJDK源码阅读导航 博客分类: Virtual Machine HotSpot VM Java OpenJDK openjdk 这是链接帖.主体内容都在各链接中.  ...

  4. 编译spark源码及塔建源码阅读环境

    编译spark源码及塔建源码阅读环境 (一),编译spark源码 1,更换maven的下载镜像: <mirrors> <!-- 阿里云仓库 --> <mirror> ...

  5. 如何顺利完成Kubernetes源码编译?

    为什么要编译源码 ? Kubernetes是一个非常棒的容器集群管理平台.通常情况下,我们并不需要修改K8S代码即可直接使用.但如果,我们在环境中发现了某个问题/缺陷,或按照特定业务需求需要修改K8S ...

  6. Spring5源码阅读环境搭建-gradle构建编译

      前沿:Spring系列生态十分丰富,涉及到各个方面.但是作为Spring生态的核心基础Spring,是最重要的环节,需要理解Spring的设计原理,我们需要解读源码.   在构建Spring源码阅 ...

  7. Kubernetes源码之旅:从kubectl到API Server

    概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...

  8. Flink源码阅读(1.7.2)

    目录 Client提交任务 flink的图结构 StreamGraph OptimizedPlan JobGraph ExecutionGraph flink部署与执行模型 Single Job Jo ...

  9. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

随机推荐

  1. HDU 5045 Contest

    pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...

  2. Angular指令(一)

    Angular开发者手册重点翻译之指令(一) 创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它. 什么是指令 在高的层面上讲,指令是DOM元素中的 ...

  3. 三个创建WebStorm项目的方法

    WebStorm项目代表一个完整的解决方案和定义项目范围设置.而重点则是代码完成.代码重构.代码风格等. 因此在建立项目时,WebStorm可以通过三个方面来完成:下载远程项目.复制控制存储库项目和直 ...

  4. Ping域名惊现65.49.2.178

    --- 昨天新建的博,早晨起来进去看看,发现无法访问.这… 排错开始,ping域名出现如上图所示结果,请求超时…哪里的问题呢 有时常识是害人的,想起了前两月群里也有人说本地无法访问自己网站,别人能访问 ...

  5. lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容

    在使用lucent检索文档时,必须先为各文档创建索引.索引的创建即读出文档信息(如文档名称.上传时间.文档内容等),然后再经过分词建索引写入到索引文件里.这里主要是总结下读取各类文档内容这一步. 一. ...

  6. Ubuntu12.04环境搭建遇到的问题和建议(一个)

    后的新公司需要在Ubuntu12.04在结构Android开发环境,在这个过程中,我们还是会遇到很多问题,这里记录.为了方便自己的未来,有人谁需要参考.从网络! 1. Q:在终端: sudo apt- ...

  7. ftoa浮法成字符串

    #include <stdio.h> bool ftos(float num,char *s,int n) {     int temp; float t=num; int pn=0; b ...

  8. android项目--上下文菜单

    一般说到上下文菜单基本上都是长按事件,在一个控件上长按,就会弹出一个菜单. 1.创建上下文菜单: //覆盖方法,创建上下文菜单 @Override public void onCreateContex ...

  9. Visual Studio 2013 Update 3

    微软正式发布Visual Studio 2013 Update 3 (2013.3) RTM   昨 天微软的Visual Studio 2013 Update 3(Visual Studio 201 ...

  10. openGL的使用步骤

    使用openGL步骤:1.创建GLSurfaceView对象2.创建GLSurfaceView.renderer实现类.3.设置activity的contentView,以及设置view的render ...