摘要:前言大型軟件,一般都有自己的構建系統,也不例外,本文簡要介紹構建系統構建流程以為例,在命令行執行以下命令在源代碼根目錄文件中定位到目標,該目標的動作是執行腳本執行將構建過程拆分成一個個步驟,每個步驟
前言
大型軟件(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 這樣的大廠是如何規劃大型軟件工程結構,構建,發布
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/33053.html
摘要:基于年底或年初沒有推廣的現狀,唯品會部門目前已經做了兩年的時間。唯品會現狀唯品會目前線上有一千多個域,每個域之間相互的依賴比較復雜,每次的部署發布困難。這是唯品會的架構,主要包含持續集成和持續部署。 數人云上海&深圳兩地容器之Mesos/K8S/Swarm三國演義的嘉賓精彩實錄第三更來啦。唯品會是數人云Meetup的老朋友,去年曾做過RPC服務框架和Mesos容器化的分享。本次分享中,...
摘要:本文是網易容器云平臺的微服務化實踐系列文章的第一篇。網易容器云平臺的前身是網易應用自動部署平臺,它能夠利用云提供的基礎設施,實現包括構建和部署一體化在內的整個應用生命周期管理。目前網易云容器服務團隊以的方式管理著微服務,每周構建部署次數。 此文已由作者馮常健授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 摘要:網易云容器平臺期望能給實施了微服務架構的團隊提供完...
摘要:自年月舉辦以來,規模持續增大。本屆大會議題數量接近,比去年規模較大的北美峰會多出了近一倍。同時還在華為伙伴公有云等云平臺上創建集群并接入了他們的平臺,以便于快速響應技術峰會等大型活動期間暴漲的計算量。 Kubernetes,云原生,service mesh,這些驚人的全球增長趨勢,令人欣喜之余迫不及待想要看看...
摘要:本屆大會議題數量接近,比去年規模較大的北美峰會多出了近一倍。同時還在華為伙伴公有云等云平臺上創建集群并接入了他們的平臺,以便于快速響應技術峰會等大型活動期間暴漲的計算量。Kubernetes,云原生,service mesh,這些驚人的全球增長趨勢,令人欣喜之余迫不及待想要看看云原生在未來究竟會發展出怎樣一派繁榮的景象。 容器領域最具影響力的技術峰會之一 KubeCon + Cloud...
摘要:參與者流量來自于內部系統和外部流量,其中大部分來自于外部流量。水平擴容服務的水平擴容重要性不言而喻。 背景 目前微店中臺團隊為了滿足公司大部分產品、運營以及部分后端開發人員的嘗鮮和試錯的需求,提供了一套基于圖形化搭建的服務端接口交付方案,利用該方案及提供的系統可生成一副包含運行時環境定義可立即運行的工程代碼,最后,通過 某種serverless平臺 實現生成后代碼的部署、CI、運行、反...
閱讀 2074·2021-10-12 10:12
閱讀 793·2021-09-24 09:47
閱讀 1194·2021-08-19 11:12
閱讀 3472·2019-08-29 13:06
閱讀 689·2019-08-26 11:43
閱讀 2573·2019-08-23 17:20
閱讀 1154·2019-08-23 16:52
閱讀 2602·2019-08-23 14:27