构建方式

Kubernetes的构建方式可以分为3种,分别是本地环境构建、容器环境构建、Bazel环境构建。

Kubernetes构建方式:

  • 本地环境构建

    1. make
    2. make all
  • 容器环境构建
    1. make release
    2. make quick-release
  • Bazel环境构建
    1. make bazel-build

下面将详细介绍前两种构建方式:

本地环境构建

执行make或者make all命令,会编译Kubernetes的所有组件,组件二进制文件输出的相对路径是_output/bin。如果我们需要对Makefile的执行过程进行调试,可以在make命令后面加-n参数,输出但不执行所有执行命令,这样可以展示更详细的编译构建过程。假设我们想单独构建某个组价,如kubectl组件,则需要指定WHAT参数。命令示例如下:

make WHAT=cmd/kubectl

Makefile是一个非常自动化构建工具,可以用来构建和测试Go语言的应用程序,Makefile还适用于大多数编程语言,在Kubernetes的源码根目录中,有两个与Makefile相关的文件,功能分别如下:

  • Makefile:顶层Makefile文件,描述了整个项目所有代码文件的编译顺序、编译规则及编译后的二进制文件输出等。
  • Makefile.generated_file:描述了代码生成的逻辑。

本地构建过程

通过调用hack/make-rules/build.sh脚本开始构建组件,传入要构建的组件名称,不指定组件名称则构建所有组件。hack/make-rules/build.sh代码示例如下:

kube::golang::build_binaries "$@"

build_binaries接收构建的组件名称,设置构建所需要的环境及一些编译时所需的Go flags选项,然后通过go install构建组件:

go install "${build_args[@]}" "$@"

在go install命令执行完成后,二进制输出的目录为_output/bin。
最后,可以使用make clean命令来清理构建环境。

容器环境构建

通过容器(Docker)进行Kubernetes构建也非常简单,Kubernetes提供了两种容器环境下得构建方式:make release 和make quick-release,它们之间的区别如下:

  • make release:构建所有目标平台(Darwin、Linux、Windows),构建过程会比较久,并同时执行单元测试过程。
  • make quick-release:快速构建,只构建当前平台,并略过单元测试过程。
    Kubernetes容器环境构建流程:
构建环境的配置及验证:kube::build::verify_prereqs
构建容器镜像:kube::build::build_image
构建代码:kube::build::run_build_command make cross
将文件从容器复制到主机:kube::build::copy_output
打包:kube::release::package_tarballs

在容器环境构建过程中,有多个容器镜像参与其中,分别介绍如下:

  • build 容器(kube-cross):即构建容器,在该容器中会对代码文件执行构建操作,完成后会被删除。
  • data容器:即存储容器,用于存放构建过程中所需要的的所有文件。
  • raync容器:即同步容器:用于在容器和主机之间传输数据,完成后会被删除。
    下面介绍一下Kubernetes容器环境构建过程。

1.kube::build::verfy_prereqs

进行构建环境的配置及验证。该过程会检查本机是否安装了Docker容器环境,对于Darwin平台,该过程会检查本机是否安装了docker-machine环境。

2.kube::build::build_image

根据Dockerfile文件构建容器镜像。Dockerfile文件来源于build/build-image/Dockerfile,代码示例如下:
代码路径:build/common.sh

function kube::build::build_image() {mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}"...cp "${KUBE_ROOT}/build/build-image/Dockerfile" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"cp "${KUBE_ROOT}/build/build-image/rsyncd.sh" "${LOCAL_OUTPUT_BUILD_CONTEXT}/"dd if=/dev/urandom bs=512 count=1 2>/dev/null | LC_ALL=C tr -dc 'A-Za-z0-9' | dd bs=32 count=1 2>/dev/null > "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password"chmod go= "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password"kube::build::update_dockerfilekube::build::set_proxykube::build::docker_build "${KUBE_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false'...kube::build::ensure_data_containerkube::build::sync_to_container
}

构建容器镜像的流程如下:

  • 通过mkdir命令创建构建镜像的文件夹(即_output/images/…)。
  • 通过cp命令复制构建镜像所需的相关文件,如Dockerfile文件和rsyncd同步脚本等。
  • 通过kube::build::docker_build函数,构建容器镜像。
  • 通过kube::build::ensure_data_container函数,运行存储容器并挂载Volume。
  • 通过kube::build::sync_to_container函数,运行同步容器并挂载存储容器的Volume,然后通过rsnyc命令同步Kubernetes源码到存储容器的Volume。

3.kube::build::run_build_command make cross

此时,容器构建环境已经准备好,下面开始运行构建容器并在构建容器内部执行构建Kubernetes源码的操作,代码示例如下:
代码路径:build/common.sh

function kube::build::run_build_command_ex() {...local detach=false..."${docker_cmd[@]}" "${cmd[@]}"if [[ "${detach}" == false ]]; thenkube::build::destroy_container "${container_name}"fi
}

在执行kube::build::run_build_command_ex函数中,通过dockercmd[@]""{docker_cmd[@]}""dockerc​md[@]""{cmd[@]}
命令执行构建操作(即在容器内执行make cross 命令)。容器内的构建过程与本地环境下的构建过程相同。其中构建平台有KUBE_SUPPORTED_SERVER_PLATFORMS变量控制,代码示例如下:
代码路径:hack/lib/golang.sh

readonly KUBE_SUPPORTED_SERVER_PLATFORMS=(linux/amd64linux/armlinux/arm64linux/s390xlinux/ppc64le
)

构建的组件由KUBE_SERVER_TARGETS变量控制,代码示例如下:
代码路径:hack/lib/golang.sh

kube::golang::server_targets() {local targets=(cmd/kube-proxycmd/kube-apiservercmd/kube-controller-managercmd/kubeletcmd/kubeadmcmd/kube-schedulervendor/k8s.io/kube-aggregatorvendor/k8s.io/apiextensions-apiservercluster/gce/gci/mounter)echo "${targets[@]}"
}IFS=" " read -ra KUBE_SERVER_TARGETS <<< "$(kube::golang::server_targets)"

4.kube::build::copy_output

使用同步容器,将编译后的代码文件复制到主机上。

5.kube::release::package_tarballs

进行打包,将二进制文件打包到_output目录中。
最终,代码文件以tar.gz压缩包的形式输出至_output/release-tars文件夹。

Kubernetes构建过程分析相关推荐

  1. 如何基于Kubernetes构建完整的DevOps流水线

    前言 关于DevOps是一个很大的话题,它可能既涉及到公司的技术文化构建,也包括开发者技术能力的支持,这次技术干货分享主要是侧重于技术方面,就是如何用Kubernetes来服务好DevOps的流水线. ...

  2. 深入Vue - 源码目录及构建过程分析

    摘要: Vue源码阅读第一步. 原文:深入vue - 源码目录及构建过程分析 公众号:前端小苑 Fundebug经授权转载,版权归原作者所有. 本文主要梳理一下vue代码的目录,以及vue代码构建流程 ...

  3. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

  4. 如何基于 Kubernetes 构建完整的 DevOps 流水线

    前言 关于 DevOps 是一个很大的话题,它可能既涉及到公司的技术文化构建,也包括开发者技术能力的支持,这次技术干货分享主要是侧重于技术方面,就是如何用 Kubernetes 来服务好 DevOps ...

  5. 使用Spring Boot和Kubernetes构建微服务架构

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在本教程 ...

  6. 基于Kubernetes 构建.NET Core技术中台

    今天下午在腾讯云+社区社区分享了<基于Kubernetes 构建.NET Core技术中台>,下面是演讲内容的文字实录. 我们为什么需要中台 我们现在处于企业信息化的新时代.为什么这样说呢 ...

  7. 东方国信基于kubernetes构建容器云平台的实践和思考

    本次,我分享的主题是<东方国信基于Kubernetes构建容器云平台的实践和思考>. 先讲一下背景,国信之前的软件部署方式是找台机器,把war包或者jar包往机器上一扔,启动就可以了,所有 ...

  8. kaniko kubernetes 构建镜像

    kaniko & kubernetes 构建镜像 文章目录 kaniko & kubernetes 构建镜像 1. 什么是 kaniko 2. kaniko 是如何工作的 3. 工作原 ...

  9. 【好文收藏】基于OpenStack和Kubernetes构建组合云平台——网络集成方案综述

    转自: http://geek.csdn.net/news/detail/104150 一谈到云计算,大家都会自然想到三种云服务的模型:基础设施即服务(IaaS),平台即服务(PaaS)和软件即服务( ...

最新文章

  1. java远程方法调用(rmi)--好_RMI-Java远程方法调用的实现(二)
  2. Java创建初始化List集合的几种方式
  3. linux sshd cpu 过高 问题解决
  4. http中的净荷 payload(有效载荷、有效负载)是什么?
  5. EJS学习(五)之EJS的CommonJs规范版本
  6. 拥抱.NET Core,如何开发一个跨平台类库
  7. Hadoop框架:NameNode工作机制详解
  8. 用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
  9. UML基础(八)--构件图
  10. 格林公式求圆并的面积及重心
  11. Python生成二维码的操作方法
  12. 递归概述与递归能解决的问题和规则 [数据结构][Java]
  13. Unity 1.Roll a Ball
  14. JQuery实现简易音乐播放器
  15. 神经网络属于分类算法吗,神经网络分类特点区别
  16. SAP资产折旧-工作量法业务实践和实操
  17. 解放运维的双手,谈自动化运维管理平台设计
  18. 英文Essay写作诀窍讲解
  19. JAVA SpringBoot zip文件夹重命名
  20. RS485因为上下拉电阻通讯不良分析

热门文章

  1. mysql varchar(max)_等价于MySQL中的varchar(max)?
  2. zabbix mysql主从延迟_zabbix监控mysql主从同步和延迟
  3. 数据中心的变化需要更多有效冷却方式
  4. 机房为什么要设计冷热通道,设计原则及如何施工?
  5. Database之SQLSever:SQL命令实现的高级案例集合之单表/多表(筛选、统计个数)之详细攻略
  6. ML之MaL: 流形学习MaL的概念认知、算法分类、案例应用、代码实现之详细攻略
  7. Py:利用pyautogui实现自动将pdf文件(需手动设定pdf总页数)自动翻页并截取另存为图片形式,或自动隔0.1秒自动截笔记本全屏保存到指定文件夹
  8. 如何使用hyperopt对xgboost进行自动调参
  9. JAVA_OA(六):SpringMVC处理异常
  10. 决策树-特征属性选择划分