摘要:简介大型软件通常都有自己的构建系统,本文简要介绍了构建系统的过程。 通过在命令行运行以下命令,在源代码的根目录文件中找到目标: 此操作是运行脚本将构建过程分解为步骤并执行每个步骤。
简介
大型软件(linux、android等)一般都有自己的构建系统,k8s也不例外。 本文简要介绍了 k8s 构建系统
构建流程发布
作为快速 - 发布。 例如,在命令行运行以下命令:
# make Quick-release
make 在源代码根目录下的 Makefile 文件中找到 Quick-release 目标。 该操作是运行 build/release.sh 脚本。
# kubernetes/Makefile.PHONY:release-skip-tests Quick-releaseifeq ($(PRINT_HELP),y)release-skip -tests Quick-release : @echo "$$RELEASE_SKIP_TESTS_HELP_INFO"elserelease-skip-快速测试- 发布:KUBE_RELEASE_RUN_TESTS = nrelease-skip-快速测试- 发布:KUBE_FASTBUILD = truerelease-skip-运行测试 Quick-release: build/release.sh <--- kubernetes/build/release.shendif
release.sh 将构建过程分为多个步骤,每个步骤对应一个 shell 函数。
# kubernetes/build/release.sh...kube::build ::verify_prereqskube ::build::build_imagekube::build::run_build_command makecross...kube::build::copy_outputkube:: release::package_tarballs
verify_prereqs 检查构建环境是否缺少项目等。 工具软件
build_image 是否创建构建所需的 Docker 映像?
run_build_command makecross 启动容器并运行 makecross 吗?
copy_output、package_tar 处理构建生成的各种文件
这里更有趣的是 k8s 使用 Docker 进行构建,它使用容器。 交叉编译
构建镜像
kube::build::build_image方法构建基础镜像,并将kubernetes源码同步到数据容器(数据卷容器)。
function kube:: build::build_image() { mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}" # 确保上下文目录由适当的用户拥有,以将源同步到容器检查。 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[k4 ] ] 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 ~ data." 卷镜像可以。重用 kube::build::ensure_data_container # 将 kubernetes 源代码同步到数据卷镜像 kube::build::sync_to_container}
接下来的容器将在 k8s 构建过程中使用。
数据卷容器:存储k8s源代码。 当其他容器启动时,它们将通过--volume-共享来自rsyncd容器的数据卷。 运行rsyncd服务(文件同步服务)同步k8s源码。 将数据卷容器从主机移出。
构建容器:运行构建命令。
源代码同步
前面提到,k8s构建时,会启动一个容器来运行rsyncd服务。 ,将k8s源码同步到数据卷容器。 然后同步源代码在哪里?
# kubernete/build/common.shfunction kube::build::sync_to_container() { kube::log::status "将源同步到容器。" kube ::build::start_rsyncd_container kube::build: :rsync --删除 --filter="H /.git" --filter="- /.make/ " --filter="[ k4] /_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 文件 = ${PIDFILE}使用 chroot = nolog 文件 = /dev/stdout 反向查找 = nomunge 符号链接 = noport = 8730[k8s] 数字 ID = true $USER_CONFIG Hostsdeny = * 主机允许 = ${ALLOW} ${ALLOW_HOST-} 经过身份验证的用户 = k8s 秘密文件 = $ {SECRETS} 只读 = 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/kubernetesWORKDIR ${ HOME}...
概述
通过分析k8s构建系统,我们可以了解像Google这样的大公司是如何规划其大规模软件工程结构的。、构建、发布
评论前必须登录!
注册