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,查看错误的原因。一般来说,如果没有修改 Dockerfile
、gitlab-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 init
或 gmenv 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
命令