尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Velero 从源码构建指南:本地编译、跨平台打包与镜像制作全流程

发布时间:2026/9/17 23:00:00

资讯中心
01
ARTICLE

Velero 从源码构建指南:本地编译、跨平台打包与镜像制作全流程

Velero 从源码构建指南:本地编译、跨平台打包与镜像制作全流程
Velero 从源码构建指南本地编译、跨平台打包与镜像制作全流程【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero本文是一份面向开发者的 Velero 源码构建实操指南围绕site/content/docs/v1.1.0/build-from-source.md展开结合当前仓库的 Makefile、hack/build.sh、Dockerfile 与 pkg/buildinfo/buildinfo.go 等实现细节完整讲解从拉取源码、本地编译二进制、交叉编译多平台产物到构建并推送容器镜像、更新集群中运行镜像的每一步。读完本文你将掌握 Velero 构建体系的核心机制能够按需产出带版本信息的 CLI 二进制与自研镜像。前置条件在开始构建之前需要准备以下环境Kubernetes 集群版本 1.7 或更高用于后续安装与验证。集群内的 DNS 服务Velero 的 in-cluster 工作负载依赖集群 DNS 解析服务名。kubectl已安装并配置好访问目标集群的 kubeconfig。Go 语言环境最低版本要求 1.8对应 v1.1.0 时代的要求当前仓库的go.mod已演进为 Go Modules 工程构建时请以实际go.mod声明的 Go 版本为准。注v1.1.0 时代的文档基于旧版GOPATH工作区模式而当前仓库已是标准的 Go Modules 工程见根目录 go.mod无需再将项目强制放置在$GOPATH/src下。下文同时给出两种源码获取方式以适配不同历史版本或离线场景。获取源码方式一通过go get拉取最新代码推荐在 Go Modules 尚未普及的早期版本中官方推荐通过go get将源码导入到 Go 工作区mkdir $HOME/go export GOPATH$HOME/go go get github.com/velero-io/velero其中go指 Go 的 import path即$HOME/go这个 GOPATH 目录。为了后续使用方便建议把该目录加入PATH这样构建出的二进制可直接在任意位置执行export PATH$PATH:$HOME/go/bin在 Go Modules 时代等价做法是直接克隆仓库并切换到你需要的版本git clone https://gitcode.com/GitHub_Trending/ve/velero cd velero当前仓库内包含的完整构建脚本与 Makefile 均可直接复用。方式二下载 Release 源码归档从项目 Release 页面下载名为Source code的源码压缩包解压到 Go import path 下使其路径呈现为src/github.com/velero-io/velero早期 GOPATH 布局要求。需要特别注意的是Makefile 的多数目标都假设在一个 git 仓库内构建。如果是从源码归档构建将无法使用依赖 git 元数据的目标例如注入GIT_SHA、检测工作区状态的逻辑此时只能退回到下文所述的go build命令。这一点在当前仓库 Makefile 中体现得很明显——GIT_SHA通过git rev-parse HEAD获取GIT_TREE_STATE通过git status --porcelain判断GIT_SHA $(shell git rev-parse HEAD) ifneq ($(shell git status --porcelain 2 /dev/null),) GIT_TREE_STATE ? dirty else GIT_TREE_STATE ? clean endif构建二进制Velero 提供了多种构建方式按需选择即可。无论采用哪种方式make系列命令都会把产物输出到_output/bin/$GOOS/$GOARCH目录下。例如macOSdarwin/amd64_output/bin/darwin/amd64/veleroLinuxlinux/amd64_output/bin/linux/amd64/veleromake还会把版本号、git commit、工作区状态等元信息通过 Go linker 的-X标志注入二进制使velero version能输出正确的版本信息见下文版本信息注入一节。构建本地二进制在本机编译适配当前操作系统与架构的velero二进制两条命令等价go build ./cmd/veleromake local入口代码位于 cmd/velero/velero.go它调用pkg/cmd/velero包构建整个 cobra 命令树并执行。make local在 Makefile 中的实现会基于go env GOOS-GOARCH自动探测本机平台并把VERSION、REGISTRY、GIT_SHA、GIT_TREE_STATE等变量传给 hack/build.sh 完成实际编译local: build-dirs ## Build locally GOOS$(GOOS) \ GOARCH$(GOARCH) \ ... ./hack/build.sh交叉编译在构建容器中要在一个 Linux 构建容器里产出 linux/amd64 目标二进制运行make build该目标_output/bin/$(GOOS)/$(GOARCH)/$(BIN)会通过make shell启动构建容器容器内以GOOS/GOARCH环境变量驱动交叉编译。指定任意平台可用通用形式make build-GOOS-GOARCH例如为 macOS 构建make build-darwin-amd64在 Makefile 中build-%目标会把ARCH$*形如darwin-amd64透传给build再由platform_temp $(subst -, ,$(ARCH))拆解出GOOS与GOARCHbuild-%: ## Build specific binary $(MAKE) --no-print-directory ARCH$* build一次性构建全部受支持平台可使用便捷目标all-build其支持的平台列表在CLI_PLATFORMS变量中定义当前仓库比 v1.1.0 文档列出的五类平台更广CLI_PLATFORMS ? linux-amd64 linux-arm linux-arm64 darwin-amd64 darwin-arm64 windows-amd64 linux-ppc64le linux-s390x all-build: $(addprefix build-, $(CLI_PLATFORMS)) ## Build for all CLI platforms对应 v1.1.0 文档列出的核心平台为linux-amd64linux-armlinux-arm64darwin-amd64windows-amd64版本信息注入的底层原理make构建之所以能让velero version输出正确信息关键在于 hack/build.sh 中通过-ldflags注入的变量LDFLAGS-X ${PKG}/pkg/buildinfo.Version${VERSION} LDFLAGS${LDFLAGS} -X ${PKG}/pkg/buildinfo.ImageRegistry${REGISTRY} LDFLAGS${LDFLAGS} -X ${PKG}/pkg/buildinfo.GitSHA${GIT_SHA} LDFLAGS${LDFLAGS} -X ${PKG}/pkg/buildinfo.GitTreeState${GIT_TREE_STATE}这些变量对应 pkg/buildinfo/buildinfo.go 中声明的包级变量。FormattedGitSHA()还会在工作区不干净时给 commit 追加-dirty后缀func FormattedGitSHA() string { if GitTreeState ! clean { return fmt.Sprintf(%s-%s, GitSHA, GitTreeState) } return GitSHA }版本命令实现在 pkg/cmd/cli/version/version.go它会同时打印 Client 与 Server 两侧版本并在主版本不一致时给出升级提示。可见GIT_TREE_STATE的注入正是为了让本地未提交修改的构建产物在velero version中能被清晰识别。调试构建如需可调试的二进制禁用内联与优化在构建时设置DEBUG1hack/build.sh 会追加 gcflagsDEBUG1 make local # 对应实现GCFLAGSall-N -l构建容器镜像并更新集群中的 Velerovelero install在部署时会依据注入的版本信息决定拉取哪个 tag 的官方镜像。若你修改了源码需要让集群中的 Velero 运行你自己的镜像可按以下步骤操作。设置镜像仓库与版本先设置$REGISTRY环境变量指定镜像仓库前缀。例如构建gcr.io/my-registry/velero:main则export REGISTRYgcr.io/my-registry若未设置早期默认值为gcr.io/heptio-images在当前仓库 Makefile 中默认值已变为velero镜像名由IMAGE ? $(REGISTRY)/$(BIN)拼出。可选地设置$VERSION改变镜像 tag默认VERSION ? main。构建镜像make container在 Makefile 中container目标要求 Docker buildx 可用并会按ALL_OS_ARCH逐平台构建默认当前GOOS-GOARCH。构建时通过 build-arg 把PKG、BIN、VERSION、REGISTRY、GIT_SHA、GIT_TREE_STATE等传入 Dockerfile其中使用golang:1.26-trixie作为多阶段构建的 builder 镜像在 builder 阶段同时编译出velero、velero-restore-helper、velero-helper三个二进制最终镜像基于paketobuildpacks/ubuntu-noble-run-tiny精简运行环境并复制产物到/output。因此一条make container产出的镜像内实际包含 Velero 主程序与两个 helper 辅助程序这也是velero install部署所需的完整运行时。推送镜像make push对于多架构场景Makefile 提供了push-manifest目标通过docker manifest create/annotate/push组合出跨平台 manifest 列表。若推送到非安全insecure镜像仓库可设置INSECURE_REGISTRYtrue并自行准备 buildx builder详见 Makefile 顶部注释。更新集群中已部署的 Velero 镜像安装完成后若只想切换 Deployment 使用的镜像为包含你代码修改的新镜像用kubectl set imagekubectl -n velero set image deploy/velero veleromyimagerepo/velero:$VERSION同时需要注意镜像名称不变时需触发 Pod 重建若新镜像 tag 与旧的一致Kubernetes 不会感知镜像内容变化需要删除 Deployment 的 Pod 强制重建kubectl -n velero delete pods -l deployveleroinstall 命令的--image覆盖在 pkg/cmd/cli/install/install.go 中velero install暴露了--image标志Image to use for the Velero and node agent pods。如果你想在安装阶段就直接使用自建镜像可以不依赖版本信息推断显式传入--image myimagerepo/velero:$VERSION。常见问题与构建路径速查产物在哪里统一输出到_output/bin/$GOOS/$GOARCH/veleroWindows 平台会追加.exe后缀见 hack/build.sh 中if [[ ${GOOS} windows ]]分支。为什么要 git 仓库make系列目标依赖git rev-parse HEAD与git status注入 commit 与工作区状态从源码归档构建时请直接使用go build ./cmd/velero。如何验证构建成功运行velero version --client-only查看注入的版本、Git commit 与工作区状态dirty 标记。构建/验证/测试相关目标make verify运行 hack/verify-all.sh、make test在构建容器内运行单元测试、make ci依次执行 modules 校验、verify、全部测试。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。