搭建开发环境
介绍如何搭建开发环境,编译和部署相关组件。
- 服务是以容器的方式运行在 Kubernetes(K8S) 集群里面的,所以开发调试需要部署一个 Kubernetes 集群
- 后端服务都是用 Golang 编写,所以需要在开发环境安装 Golang
- 为了把开发的服务发布到 Kubernetes 集群,需要在本地把相关服务构建成 docker 镜像
- 开发环境最好都是在 Linux 上进行,安装 使用 docker 和编译源码都很方便
接下来介绍如何搭建开发环境。
部署平台服务
在开始开发之前,请先参考 融合云快速安装 部署平台服务。我们的服务全部使用容器的方式运行在 Kubernetes 集群里面,所以需要先搭建好我们的服务,把这个环境作为自己的开发环境。
这里建议使用一个单独的 CentOS 7 虚拟机,配置(至少 4C8G + 100G 系统盘),安装部署我们的服务。
安装 Go
Golang 版本要求 1.18 以上
安装 Golang 环境请参考: Install Golang
安装配置 Docker
因为要把服务打包成容器镜像,所以需要先安装 docker,这里的 docker 版本需要是 docker-ce 19.03 以上的版本。
下面是不同操作系统和 Linux 发行版的安装方式,这里还是建议开发环境是 Linux 。
安装 Docker
参考 官方文档:https://docs.docker.com/get-docker/。
配置 Docker
后续的代码编译和打包使用了 docker buildx 的功能,需要做在让 docker daemon 开启 experimental 特性,用于编译不同架构的镜像,可参考 docker 官方的 Building multi-platform images 文档。
# 在 docker daemon 的配置里面打开 experimental 特性
$ cat /etc/docker/daemon.json
{
"experimental": true
}
# 重启 docker 服务
$ systemctl restart docker
# 打开 binfmt_misc 特性,用于 qemu 模拟编译其他架构镜像
# 详细说明参考:https://docs.docker.com/build/building/multi-platform/#building-multi-platform-images
$ docker run --privileged --rm tonistiigi/binfmt --install all
# 创建 buildx context
$ docker buildx create --use --name build --node build --driver-opt network=host
编译 cloudpods 组件
Fork 仓库
访问 https://github.com/yunionio/cloudpods ,将仓库 fork 到自己的 github 用户下。
Clone 源码
git clone 前确保 GOPATH 等环境变量已经设置好,clone 你自己 fork 的仓库
$ git clone https://github.com/<your_name>/cloudpods $GOPATH/src/yunion.io/x/cloudpods
$ cd $GOPATH/src/yunion.io/x/cloudpods
$ git remote add upstream https://github.com/yunionio/cloudpods
二进制编译
编译是直接调用 go 编译器在本地编译出二进制,对应的 Makefile 规则为 make cmd/%
,%
对应的是 cmd
目录里面的组件名称。
# cmd 目录下面存放着所有的组件:
$ ls cmd
...
ansibleserver climc glance keystone qcloudcli ucloudcli
awscli cloudir host lbagent region webconsole
# 可以编译cmd下指定的组件,比如:编译 climc 和 region 组件
$ make cmd/climc cmd/region
# 编译好的二进制会直接在 _output/bin 目录下面,查看编译好的二进制文件
$ ls _output/bin
climc region
# 编译所有组件
$ make
Docker 镜像编译上传
通常我们的开发流程是写完代码,把相应服务打包生成 docker 镜像,然后发布到自己搭建的 Kubernetes 集群里面测试。 下面说明如何生成 docker 镜像。
生成好的 docker 镜像需要上传的镜像仓库,这里以 Aliyun 的容器镜像服务 为例,比如我在 aliyun 创建了一个公开的命令空间,仓库地址为: registry.cn-beijing.aliyuncs.com/zexi
。
# 在本地登录镜像仓库,这里以你自己的镜像仓库为准
# 需要先用自己的 aliyun 帐号登录下,后面容器镜像的上传就不需要密码了
$ docker login registry.cn-beijing.aliyuncs.com/zexi
......
Login Succeeded
准备好镜像仓库后,就可以开始打包上传镜像了,这些步骤是通过 Makefile 的 image 规则来执行的。
这里有以下环境变量用来控制制作镜像的内容:
- REGISTRY: 对应镜像上传的仓库
- VERSION: 用于生成镜像的 tag
- ARCH: 对应 docker 镜像的 arch,可设置成 'arm64' 或者 'all'
- arm64: 编译打包制作 arm64 的 docker 镜像
- all: 编译打包制作 amd64 和 arm64 的镜像
- DEBUG: 如果设置为 true 会显示打包步骤
根据 REGISTRY 和 VERSION 这两个环境变量,会生成各个组件的镜像地址,格式是:
$(REGISTRY)/$(component):$VERSION
# 将 region 服务编译并制作成 docker 镜像
# 然后上传到 registry.cn-beijing.aliyuncs.com/zexi/region:dev
$ VERSION=dev REGISTRY=registry.cn-beijing.aliyuncs.com/zexi make image region
# 编译多个组件,并上传,以下命令会上传以下的组件
# - registry.cn-beijing.aliyuncs.com/zexi/ansibleserver:dev
# - registry.cn-beijing.aliyuncs.com/zexi/apigateway:dev
# - registry.cn-beijing.aliyuncs.com/zexi/region:dev
$ VERSION=dev REGISTRY=registry.cn-beijing.aliyuncs.com/zexi make image \
ansibleserver apigateway region
# 编译 arm64 的镜像,如果指定了 ARCH=arm64 ,则会在对应镜像的末尾加上 '-arm64' 的后缀
# - registry.cn-beijing.aliyuncs.com/yunionio/scheduler:dev-arm64
$ VERSION=dev REGISTRY=registry.cn-beijing.aliyuncs.com/zexi ARCH=arm64 make image scheduler
# 编译 amd64 + arm64 的镜像,指定 ARCH=all,这里不会添加后缀,会在镜像名里面包含两个架构的版本
# - registry.cn-beijing.aliyuncs.com/yunionio/cloudid:dev
$ VERSION=dev REGISTRY=registry.cn-beijing.aliyuncs.com/zexi ARCH=all make image cloudid
# 同时编译多个多架构的组件,并上传
$ VERSION=dev ARCH=all REGISTRY=registry.cn-beijing.aliyuncs.com/zexi make image \
ansibleserver apigateway baremetal-agent climc cloudevent \
cloudnet devtool esxi-agent glance host host-deployer keystone \
logger notify region s3gateway scheduler webconsole yunionconf \
vpcagent monitor region-dns cloudid
开发调试
开发调试的通常步骤是,写好代码后,使用之前说的 make image 规则打包上传对应服务的 docker 镜像,然后将镜像发布到自己的 Kubernetes 集群进行测试。