Skip to content

K8S 开发测试环境 使用文档

DL;DR

在 devhost 机器上以 superman 用户执行下面的命令:

# 创建环境
$ gmenv init --name my-env-name --user wenjiajin

# 更新环境代码
$ gmenv update --name my-env-name --watch

# 删除环境
$ gmenv delete --name my-env-name

# 进入容器的 bash
$ gmenv exec --name my-env-name --container bshop

创建环境

使用 gmenv init 命令可以创建一个新的环境或者修改已有的环境。

使用 --name 参数指定环境的名字,注意由于 K8S 的限制,这个名字只能含有 0-9, a-z, - 字符。

使用 --user 参数指定环境的创建者,可以使用汉字。第一次创建某个环境时这个参数必传。

执行后会使用 VIM 打开一个 JSON 文件,在其中可以修改环境中使用的前后端分支。使用 --default 参数可以跳过填写分支的步骤,直接使用默认的分支。

gmenv 接着会检查各个工程分支的 GitLab CI Pipeline 执行情况。工程需要在 CI 中构建镜像。如果这一步没有显示 success,可以使用浏览器打开 gmenv 显示的 URL,查看错误的原因。一般来说,如果没有修改 Dockerfilegitlab-ci.yml 等基础文件,是不会出现构建失败的情况的。

构建完成后,gmenv 会部署所有的服务。每个服务会运行在独立的容器中。

创建完成后会显示 WEB 服务的 URL

更新环境

在 IDE 中编辑代码,并将代码 push 到 GitLab。GitLab 会自动地构建镜像。然后执行 gmenv update 命令可以更新代码。执行的流程类似 gmenv init,但是不需要填写分支信息。如果需要修改分支信息,请使用 gmenv init 命令。

为了避免频繁地执行 gmenv update 命令,可以添加 --watch 参数,使 gmenv 持续监听 GitLab 的代码变动,并在代码变动后自动更新环境。使用 Ctrl-C 可以退出 watch。

Debug

使用 gmenv exec 命令可以进入到容器中的 Shell 中。用 --name 参数指定环境的名字,--container 参数执行容器的名字。所有支持的容器名可以通过 gmenv exec --help 查看。

容器中没有安装 Git,所以不能通过 git pull 直接更新代码。必须使用 gmenv initgmenv update 命令。每个容器中只会运行一个服务。

日志

未完成

K8S 原理

未完成

环境中的数据

code 机器上有一个每天执行一次的自动脚本。它会从生产环境的数据库中拉取部分数据,构建成镜像。新创建的环境会自动使用最新的数据库镜像。因此新环境中的数据库最多落后生产环境 24 小时。不过以前创建的环境中的表结构并不会自动更新,而是会固定在创建时使用的表结构上。

复制数据时候,有些表完全没有复制,比如订单表;有些表只复制了测试账号相关的数据,比如商品库;有些表复制了所有的数据,比如权限表。可以在 gm_deploy/Dockerfiles 目录中找到构建镜像以及复制数据相关的代码。

不同环境使用的是不同的数据库容器,所以环境之间的数据是隔离的。

常见问题

  • Q:前端 master 分支版本落后于生产环境,如何处理?

A:通知前端同学在开发环境发布一下最新的版本

  • Q:容器中缺少 vim / curl / ping / lsof,为什么?

A:为了减少体积,容器中缺少很多非必需的工具。我们几乎所有的容器都是基于 Debian 构建的,可以使用 apt 安装需要的工具。

  • Q:如何访问数据库

A:使用 gmenv exec 进入 mysql 或者 mongodb 的容器中,然后在容器内使用命令行操作数据库

  • Q:如何在不重启容器的前提下,手动重启服务

A:在容器内执行 run/http.sh reload 命令