k3s结构
k3s通过dapper工具在docker容器中进行项目打包,k3s的makefile通过dapper调用scripts目录下的shell脚本。
Dockerfile.dapper.dapper中定义CMD和ENTRYPOINT来透传make的指令。
.
├── ...
├── Dockerfile.dapper # dapper运行的Dockerfile
├── Makefile # Makefile
├── pkg # 代码生成相关代码
├── scripts # make指令对应执行的shell脚本
├── ...
k3s代码生成
查看k3s代码时会发现pkg/data目录是空的,data目录下的代码由go generate生成
package-cli大致内容
tar cvf ./build/out/data.tar ./bin ./etc # 将生成的bin和etc目录打tar包
GOOS=linux CC=gcc CXX=g++ "${GO}" generate # 执行go generate生成data下的代码
go build ./cmd/k3s # 生成k3s二进制文件
go generate注释
//go:generate go run pkg/codegen/cleanup/main.go
//go:generate rm -rf pkg/generated
//go:generate go run pkg/codegen/main.go
//go:generate go fmt pkg/deploy/zz_generated_bindata.go
//go:generate go fmt pkg/static/zz_generated_bindata.go
通过go-bindata将文件打入k3s源码,后运行k3s时解压出后再单独调用解压后目录中bin下的二进制文件启动k3s下的各个子服务。