k8s :构建系统

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 前言 大型软件(linux,android .etc)一般都有自己的构建系统,k8s 也不例外,本文简要介绍 k8s 构建系统 构建流程 release 以 quick-release 为例,在命令行执行以下命令 # make quick-release make 在源代码根目录 Mak...

前言

大型软件(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 <<EOF >"${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 这样的大厂是如何规划大型软件工程结构,构建,发布

本文转自中文社区-k8s :构建系统

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 负载均衡 微服务
Kubernetes 生态系统中的微服务治理
【8月更文第29天】随着微服务架构的普及,管理分布式系统的复杂性也随之增加。Kubernetes 作为容器编排的事实标准,为微服务架构提供了强大的支持。结合像 Istio 这样的服务网格工具,Kubernetes 能够有效地解决微服务治理中的诸多挑战,如服务发现、负载均衡、流量管理和安全策略等。
56 1
|
15天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
62 7
|
14天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
51 6
|
1月前
|
Kubernetes 监控 测试技术
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
|
2月前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
114 2
|
3月前
|
存储 Kubernetes API
Kubernetes系统
8月更文挑战第23天
43 1
|
3月前
|
资源调度 Kubernetes 调度
玩转Kubernetes集群:掌握节点和Pod自动扩缩容,让你的系统更智能、更高效!
【8月更文挑战第22天】Kubernetes的核心功能之一是自动扩缩容,确保系统稳定与高可用。节点自动扩缩容由调度器和控制器管理器协作完成,依据资源紧张程度动态调整。主要采用HPA、VPA及Cluster Autoscaler实现。Pod自动扩缩容通常通过HPA控制器按需调整副本数量。例如,设置HPA控制器监视特定部署的CPU使用率,在80%阈值上下自动增减副本数。合理利用这些工具可显著提升系统性能。
95 2
|
3月前
|
存储 Kubernetes API
|
3月前
|
存储 Kubernetes 调度
通过重新构建Kubernetes来实现更具弹性的容器编排系统
通过重新构建Kubernetes来实现更具弹性的容器编排系统
60 8
下一篇
无影云桌面