如何顺利完成Kubernetes源码编译?
为什么要编译源码 ?
Kubernetes是一个非常棒的容器集群管理平台。通常情况下,我们并不需要修改K8S代码即可直接使用。但如果,我们在环境中发现了某个问题/缺陷,或按照特定业务需求需要修改K8S代码时,如定制Kubelet的StopContainer 逻辑、kube-scheduler的pod调度逻辑等。为了让修改生效,那么就需要编译K8S代码了。
Kubernetes源码编译,大致分为本地二进制可执行文件编译和docker镜像编译两种。由于在我们的环境中,Kubernetes是由Docker容器方式运行的。故此我们需要采用后面一种方式编译,即镜像编译。
由于Kubernetes每个组件服务的镜像Dockerfile文件是由Kubernetes源码自动生成的,因此,社区并未提供每个组件的镜像Dockerfile文件。编译本地二进制可执行文件很简单,也更直接。而docker镜像编译资料却很少,且碍于某种特殊网络原因,会导致失败。此处,将介绍如何顺利的完成K8S镜像编译。
安装依赖
安装Golang

指定分支,下载 Kubernetes 源代码(默认$GOPATH目录为/root/go/)

本地二进制文件编译Kubernetes(方法一)
修改运行平台配置参数(可选)
根据自己的运行平台(linux/amd64)修改hack/lib/golang.sh,把KUBE_SERVER_PLATFORMS,KUBE_CLIENT_PLATFORMS和KUBE_TEST_PLATFORMS中除linux/amd64以外的其他平台注释掉,以此来减少编译所用时间。
编译源码
进入Kubernetes根目录下

KUBE_BUILD_PLATFORMS指定目标平台,WHAT指定编译的组件,通过GOFLAGS和GOGCFLAGS传入编译时参数,如此处编译kubelet 组件。

如果不指定WHAT,则编译全部。
make all是在本地环境中进行编译的。
make release和make quick-release在容器中完成编译、打包成docker镜像。
编译kubelet这部分代码,也可执行make clean && make WHAT=cmd/kubelet
检查编译成果
编译过程较长,请耐心等待,编译后的文件在kubernetes/_output里。
或者进入cmd/kubelet (以kubelet为例子)
执行go build -v命令,如果没出错,会生成可执行文件kubelet

生成的可执行文件在当前文件夹下面

Docker镜像编译Kubernetes(方法二)
查看kube-cross的TAG版本号

查看debian_iptables_version版本号

这里,我使用DockerHub的Auto build功能,来构建K8s镜像。自然将编译需要用到的base镜像,放在了DockerHub上(也算是为促进国内K8s源码docker编译贡献绵薄之力吧!)。

把build/lib/release.sh中的–pull去掉,避免构建镜像继续拉取镜像:

编辑文件hack/lib/version.sh
将KUBE_GIT_TREE_STATE=”dirty” 改为 KUBE_GIT_TREE_STATE=”clean”,确保版本号干净。
执行编译命令

其中KUBE_BUILD_PLATFORMS=linux/amd64指定目标平台为linux/amd64,GOFLAGS=-v开启verbose日志,GOGCFLAGS=”-N -l”禁止编译优化和内联,减小可执行程序大小。
编译的K8s Docker镜像以压缩包的形式发布在_output/release-tars目录中

使用编译镜像
等待编译完成后,在_output/release-stage/server/linux-amd64/kubernetes/server/bin/目录下保存了编译生成的二进制可执行程序和docker镜像tar包。如导入kube-apiserver.tar镜像,并更新环境上部署的kube-apiserver镜像。

整个编译过程结束后,现在就可以到master节点上,修改/etc/kubernetes/manifests/kube-apiserver.yaml描述文件中的image,修改完立即生效。
参考资料:
https://github.com/kubernetes/kubernetes/tree/master/build/
原文链接:
https://xuchao918.github.io/2019/01/26/%E7%BC%96%E8%AF%91%E5%92%8C%E8%BF%90%E8%A1%8CKubernetes%E6%BA%90%E7%A0%81/
相关服务请访问:https://support.huaweicloud.com/cce/index.html?utm_content=cce_helpcenter_2019
如何顺利完成Kubernetes源码编译?的更多相关文章
- kubernetes源码阅读及编译
kubernetes源码阅读 工欲善其事,必先利其器.在阅读kubernetes源码时,我也先后使用过多个IDE,最终还是停留在IDEA上. 我惯用的是pycharm(IDEA的python IDE版 ...
- Kubernetes源码之旅:从kubectl到API Server
概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...
- Linux学习日记——源码编译Apache
[本文为笔者在学习Linux 下的软件安装时,尝试使用源码安装Apache 的过程,事后进行一个小小的总结,发现错误望指正.] 一.典型的源码编译安装软件的过程包括以下3步: 1) 运行 config ...
- 一文了解如何源码编译Rainbond基础组件
Rainbond 主要由以下三个项目组成,参考官网详细 技术架构 业务端 Rainbond-UI 和 Rainbond-Console 合起来构成了业务层.业务层是前后端分离模式.UI是业务层的前端代 ...
- Android 5.0源码编译问题
如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是 ...
- Android stdio Apktool源码编译
Android Apktool源码编译 标签(空格分隔): Android Apktool 源码编译 需求 习惯NetBeans调试smali需要用Apktool反编译apk,需要用-d的参数才能生成 ...
- SSH/SSL 源码编译安装简易操作说明
环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...
- Hadoop源码编译过程
一. 为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...
- World Wind .NET源码编译问题处理
World Wind .NET源码编译问题处理 下载了World_Wind_1.4.0_Source源码(http://worldwindcentral.com/wiki/NASA_World_W ...
随机推荐
- 如何在LabWIndows/CVI中调用LabVIEW DLL
首先请参考官方的文档 http://digital.ni.com/public.nsf/websearch/70995EC2CA1B523386256DD4004F3DE6?OpenDocument ...
- explain结果总结
id: SELECT查询序列号(SELECT识别符),也就是一条语句中,该select是第几次出现.在此语句中,select就只有一个,所以是1. select_type:SELECT查询类型 常见取 ...
- [LeetCode] 482. License Key Formatting 注册码格式化
You are given a license key represented as a string S which consists only alphanumeric character and ...
- 阿里云k8s部署zookeeper集群
1. 阿里云k8s创建有状态应用 StatefulSet , 选择使用模板创建 可以创建自定义模板 apiVersion: apps/v1 kind: StatefulSet metadata: c ...
- PCL贪婪投影三角化算法
贪婪投影三角化算法是一种对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复. 方法: (1)将三维点通过法线投影到某一平面 (2)对投影得 ...
- 通过python批量修改mp3名称
下载歌曲软件:音乐狂 下载格式:[xxxx]xxxx.mp3 import osimport re path = 'c:\\test' old_dir = os.listdir(path) print ...
- android 8.0 以后 uiautomator 无法直接使用的问题
android8.1以后sdk tools自带的uiautomator直接打开,截取不到机器界面信息. 可以使用以下方法手动截取. 首先操作机器定位到要分析的界面. 1.截取uix资源文件 adb s ...
- DP(动态规划)总结
前言 动态规划是很重要的一个知识点,大大小小的比赛总会有一两道DP题,足以说明动态规划的重要性. 动态规划主要是思想,并没有固定的模板,那么,怎么判断题目是不是动态规划呢? DP题一般都会满足三个条件 ...
- hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 面试题:在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为2G)
假设整数为32bit,4个字节存储 这种题目,首先想到的是分而治之.将文件中数字分组.然后遍历文件中的数字,按分组进行计数.最后找到中位数所在的分组区间 1.如果10G个整数都为同一个,那么10G整数 ...