资讯专栏INFORMATION COLUMN

k8s :构建系统

mumumu / 498人阅读

摘要:前言大型软件,一般都有自己的构建系统,也不例外,本文简要介绍构建系统构建流程以为例,在命令行执行以下命令在源代码根目录文件中定位到目标,该目标的动作是执行脚本执行将构建过程拆分成一个个步骤,每个步骤

前言

大型软件(linux,android .etc)一般都有自己的构建系统,k8s 也不例外,本文简要介绍 k8s 构建系统

构建流程 release

以 quick-release 为例,在命令行执行以下命令

# make quick-release

make 在源代码根目录 Makefile 文件中定位到 quick-release 目标,该目标的动作是执行 build/release.sh 脚本

# kubernetes/Makefile
.PHONY: release-skip-tests quick-release
ifeq ($(PRINT_HELP),y)
release-skip-tests quick-release:
    @echo "$$RELEASE_SKIP_TESTS_HELP_INFO"
else
release-skip-tests quick-release: KUBE_RELEASE_RUN_TESTS = n
release-skip-tests quick-release: KUBE_FASTBUILD = true
release-skip-tests quick-release:
    build/release.sh <--- 执行 kubernetes/build/release.sh
endif

release.sh 将构建过程拆分成一个个步骤,每个步骤对应一个 shell function

# kubernetes/build/release.sh
...
kube::build::verify_prereqs
kube::build::build_image
kube::build::run_build_command make cross
...
kube::build::copy_output
kube::release::package_tarballs

verify_prereqs 对构建环境进行检查,比如是否缺少一些工具软件
build_image 创建构建需要的 docker 镜像 ???
run_build_command make cross 启动容器,运行 make cross
copy_output, package_tar 处理构建生成的各个文件

这里比较有意思的是 k8s 使用 docker 容器进行构建,可能是为了交叉编译吧

构建镜像

kube::build::build_image 方法构建基础镜像,同步 kubernetes 源代码到 data container(数据卷容器)

function kube::build::build_image() {
  mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}"
  # Make sure the context directory owned by the right user for syncing sources to container.
  chown -R ${USER_ID}:${GROUP_ID} "${LOCAL_OUTPUT_BUILD_CONTEXT}"

  cp /etc/localtime "${LOCAL_OUTPUT_BUILD_CONTEXT}/"
  # 准备镜像构建所需文件
  cp build/build-image/Dockerfile "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
  cp 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_dockerfile
  kube::build::set_proxy
  # 构建镜像
  kube::build::docker_build "${KUBE_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" "false"
  ...
  # 构建数据卷镜像,注意 ensure 这个词~数据卷镜像是可以复用的
  kube::build::ensure_data_container
  # 同步 kubernetes 源代码到数据卷镜像
  kube::build::sync_to_container
}

k8s 构建过程中使用了以下几种容器:

数据卷容器:存储 k8s 源代码,其它容器启动时通过 --volume-from 共享数据卷

rsyncd 容器:运行 rsyncd 服务(一种文件同步服务),将 k8s 源代码从 host 同步到数据卷容器中

构建容器:运行构建命令

源代码同步

上文说到 k8s 构建的时候会启动一个容器运行 rsyncd 服务,将 k8s 源代码同步到数据卷容器,那么源代码码会被同步到哪里呢?

# kubernete/build/common.sh
function kube::build::sync_to_container() {
  kube::log::status "Syncing sources to container"

  kube::build::start_rsyncd_container

  kube::build::rsync 
    --delete 
    --filter="H /.git" 
    --filter="- /.make/" 
    --filter="- /_tmp/" 
    --filter="- /_output/" 
    --filter="- /" 
    --filter="H zz_generated.*" 
    --filter="H generated.proto" 
    "${KUBE_ROOT}/" "rsync://k8s@${KUBE_RSYNC_ADDR}/k8s/"
}

kube::build::rsync 方法将 KUBE_ROOT 目录下的源代码同步到 k8s@${KUBE_RSYNC_ADDR}/k8s/

查看 rsync 配置文件可以知道 k8s 这个虚拟目录对应的实际目录

# kubernetes/build/build-image/rsyncd.sh
...
VOLUME=${HOME}

cat <"${CONFFILE}"
pid file = ${PIDFILE}
use chroot = no
log file = /dev/stdout
reverse lookup = no
munge symlinks = no
port = 8730
[k8s]
  numeric ids = true
  $USER_CONFIG
  hosts deny = *
  hosts allow = ${ALLOW} ${ALLOW_HOST-}
  auth users = k8s
  secrets file = ${SECRETS}
  read only = false
  path = ${VOLUME} <-- k8s 对应的路径 ${VOLUME} = ${HOME}
  filter = - /.make/ - /_tmp/
EOF

这个 HOME 变量一般指向 用户主目录,但是从 go语言工程目录结构 来看 HOME 应该指向类似 $GOPATH/src/k8s.io/kubernetes 的目录,所以经验和直觉告诉我们肯定有什么地方设置了 HOME 变量,通过搜索源代码,证实确实如此

# kubernetes/build/build-image/Dockerfile
...
ENV HOME /go/src/k8s.io/kubernetes
WORKDIR ${HOME}
...
总结

通过分析 k8s 构建系统,可以学习像 Google 这样的大厂是如何规划大型软件工程结构,构建,发布

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/33053.html

相关文章

  • 构建与定制:唯品会 PaaS 基于 Kubernetes 的实践

    摘要:基于年底或年初没有推广的现状,唯品会部门目前已经做了两年的时间。唯品会现状唯品会目前线上有一千多个域,每个域之间相互的依赖比较复杂,每次的部署发布困难。这是唯品会的架构,主要包含持续集成和持续部署。 数人云上海&深圳两地容器之Mesos/K8S/Swarm三国演义的嘉宾精彩实录第三更来啦。唯品会是数人云Meetup的老朋友,去年曾做过RPC服务框架和Mesos容器化的分享。本次分享中,...

    JackJiang 评论0 收藏0
  • 网易容器云平台的微服务化实践(一)

    摘要:本文是网易容器云平台的微服务化实践系列文章的第一篇。网易容器云平台的前身是网易应用自动部署平台,它能够利用云提供的基础设施,实现包括构建和部署一体化在内的整个应用生命周期管理。目前网易云容器服务团队以的方式管理着微服务,每周构建部署次数。 此文已由作者冯常健授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 摘要:网易云容器平台期望能给实施了微服务架构的团队提供完...

    zhjx922 评论0 收藏0
  • 2018年已过半,Kubernetes和云原生的巨浪要把云计算带向何处

    摘要:自年月举办以来,规模持续增大。本届大会议题数量接近,比去年规模较大的北美峰会多出了近一倍。同时还在华为伙伴公有云等云平台上创建集群并接入了他们的平台,以便于快速响应技术峰会等大型活动期间暴涨的计算量。 Kubernetes,云原生,service mesh,这些惊人的全球增长趋势,令人欣喜之余迫不及待想要看看...

    Pines_Cheng 评论0 收藏0
  • Kubernetes和云原生的巨浪要把云计算带向何处

    摘要:本届大会议题数量接近,比去年规模较大的北美峰会多出了近一倍。同时还在华为伙伴公有云等云平台上创建集群并接入了他们的平台,以便于快速响应技术峰会等大型活动期间暴涨的计算量。Kubernetes,云原生,service mesh,这些惊人的全球增长趋势,令人欣喜之余迫不及待想要看看云原生在未来究竟会发展出怎样一派繁荣的景象。 容器领域最具影响力的技术峰会之一 KubeCon + Cloud...

    hizengzeng 评论0 收藏0
  • serverless在微店node领域的探索应用

    摘要:参与者流量来自于内部系统和外部流量,其中大部分来自于外部流量。水平扩容服务的水平扩容重要性不言而喻。 背景 目前微店中台团队为了满足公司大部分产品、运营以及部分后端开发人员的尝鲜和试错的需求,提供了一套基于图形化搭建的服务端接口交付方案,利用该方案及提供的系统可生成一副包含运行时环境定义可立即运行的工程代码,最后,通过 某种serverless平台 实现生成后代码的部署、CI、运行、反...

    mikyou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<