制作业务服务镜像

镜像制作

为了方便开发者制作 tars 服务的镜像, 特提供了一个exec-build.sh来完成, 该脚本已经被内置到编译镜像tarscloud/compiler中了, 你可以在编译镜像中直接使用!

该脚本的使用如下:

exec-build.sh BaseImage SERVERTYPE(cpp/nodejs/java-war/java-jar/go/php) Files YamlFile Tag Push(true/false) Dockerfile

参数说明:

  • BaseImage: 依赖的基础镜像(官方镜像为: tarscloud/tars.cppbase:$tag)

  • SERVERTYPE: 语言, 目前支持: cpp/nodejs/java-war/java-jar/go/php

  • Files: 需要打包进 docker 中的文件或者目录

  • YamlFile: yaml 文件描述服务用, 可以参考helm 包

  • Tag: docker 版本号, 例如 v1.0.2

  • Push: 制作好的 docker 是否 push 到仓库中($Registry/$APP/$SERVER:$TAG)

  • Dockerfile: 制作镜像的 dockerfile 路径, 正常情况不需要提供, 你如果希望自己改写 Dockerfile, 则需要提供, 请参考Dockerfile 例如:

exec-build.sh tarscloud/tars.cppbase cpp build/StorageServer yaml/value.yaml v1.0.0

执行完脚本后会生成:

  • 服务的镜像是 YamlFile 中: repo.image:$TAG, 可以通过docker images查看到, 你需要自己推送到 docker 仓库

后续流程:

  • 为了方便你部署, 提供了exec-helm脚本, 快速制作 helm 包, 具体请参考exec-helm

  • 为了方便你部署, 提供了exec-deploy脚本, 方便你部署到 K8S 集群, 具体请参考exec-deploy

镜像说明

  • 实际服务的镜像, 在 K8S 上运行起来以后, 是有两个进程的, 一个是 tarsnode 进程, 一个业务进程.

  • 但是制作的业务服务镜像中, 只有业务进程, 无 tarsnode 进程, tarsnode 进程是独立的 init 镜像, 可以参考具体发布到 k8s 上的每个 tars 服务

  • 业务服务制作镜像时, 会把自己可执行程序 copy 到容器/usr/local/server/bin 目录下(Dockerfile)

  • tars 服务(TServer)展开成 Statefullset 时, 会有两个 container, 一个 tarsnode, 一个业务容器, 他们通过一个目录共享(/usr/local/app/tars/tarsnode)

  • tarsnode 镜像(tarscloud/tars.tarsnode)主要是包含 tarsnode 程序和配置, 在镜像的/tarsnode 目录下

  • 启动时 init container 先初始化, 即 tarsnode 的脚本 entrypoint.sh 先动, 它里面执行环境初始化, 将 tarsnode 相关的程序和脚本从/tarsnode copy 到 /usr/local/app/tarsnode 目录下

  • 业务容器启动会调用 /usr/local/app/tarsnode/util/start.sh 启动 tarsnode (上一步 copy 的)

  • start.sh 中会创建 链接目录 /usr/local/app/tarsnode/data/xxxx/bin 到 /usr/local/server/bin, 并执行根据服务类型(ServerType)启动实际服务

  • 如果业务进程挂掉, pod 是不会退出的(因为 tarsnode 还存在), 这个时候会出现类似这样的错误: The status of pod readiness gate "tars.io/active" is not "True", but False

Last updated