# 服务问题排查指引

# 服务运行中问题

# 一段时间不访问服务后,发现访问不通或访问速度明显变慢。再次访问后恢复。
# 控制台服务状态显示:0 个实例(自动暂停)/服务启动中
  • 「服务设置」中,实例副本数最小值为0时,需要注意半小时无请求服务将缩容到0,服务暂停,最大程度节约资源。再次请求时将重启服务,扩容新的实例。
  • 服务从0扩容到1(冷启动)耗时由服务启动速度决定,请尽可能优化服务启动性能。
  • 如果你想彻底避免服务冷启动影响,到「服务设置」中将「实例副本数」最小值设为1,但会持续产生资源消耗,请根据业务状态自行权衡。
# 服务运行中向容器写入的文件,过一段时间就不见了。

容器不支持持久化存储,请勿将图片、视频等文件直接存储在容器中,容器扩缩容/重启自愈时,这些写入的文件会被还原。请使用「对象存储」管理文件。

# 容器中时间跟本地时间相差8小时。

容器默认时区为UTC,如需使用上海时间,请参考官方模板中的Dockerfile,启用时区设置命令。

注意:使用无 dockerfile 模式部署,暂时不支持修改时区,只能用默认时区。

# 仍然使用 sns、jscode2session、getAccessToken类接口,自行维护access_token时,请求 api.weixin.qq.com 超时/报错502。

因项目迁移无暇改造为云调用方式,请关闭“开放接口服务”开关,然后重新部署使配置生效。

“开放接口服务”开关开启时,默认将使用云调用方式,因此可能引发链路超时或报错。

# 服务概率性出现500报错(排除各种代码错误后)

在「服务监控」中检查 CPU 使用率/内存使用率是否过高,甚至内存溢出OOM。

  • 所选容器规格过小,请调大规格。
  • 设置的「扩缩容条件」不合适,比如设置的是 CPU 使用率大于60%扩容,但 CPU 未达标时内存使用已满。建议内存消耗大于 CPU 的服务,使用内存使用率作为扩缩容条件。

# 部署失败问题

# 本地运行正常,部署到云托管后却部署失败?

本地调试请尽量基于本地 Docker 进行,具体可参考本地调试 文档.

如果未基于本地 Docker 进行调试,直接转到云托管部署时可能遇到以下情况:

  1. 本地运行的时候,各种依赖组件、扩展在本地都是齐全的,但是没有在 Dockerfile 正确添加依赖安装命令,所以本地运行时不缺依赖没问题,部署到云托管上时就会因为缺乏依赖导致报错。
  2. 本地运行的时候,连接的是本地数据库(地址为本机 ip 或localhost),部署到云托管上时没有将数据库地址改为云上的数据库地址。导致因为数据库无法连接而部署失败。
  3. 本地使用的运行时环境(JDK/python版本等),与 Dockerfile 中定义的运行时环境不一致。
# Readiness probe failed: dial tcp xx.xx.xx.xx:xxx: connect: connection refused

无法通过健康检查/端口调用不通。

  • 服务启动正常,但是端口填写错误,真实端口与发布时填写端口不符,导致系统误认为部署失败。
  • 服务启动成功,但反复重启,进程不稳定,导致端口无法稳定调通,无法通过健康检查。请自行结合日志排查代码问题,或考虑是否因为所选容器规格过小。
  • 如果你的 Dockerfile 中包含了多行独立的 CMD 命令,请注意这是错误的写法!只有最后一行 CMD 命令会被执行,之前的都会被忽略,导致业务报错。请参考Docker官方文档之 CMD 命令
# 部署失败但看业务日志已经在正常运行

检查服务设置中端口与真实项目端口是否一致。如果服务启动正常,但是端口填写错误,真实端口与发布时填写端口不符,会导致系统误认为部署失败,调用服务也会报错。

# check pod status is not ok
  • 服务因代码原因反复重启,状态不稳定。请自行排查代码问题。
  • 若服务并未反复重启,请提工单联系我们排查。
# Back-off restarting failed container

代码原因导致服务启动失败,请借助服务日志自行排查代码问题,或参考本地调试 文档。没有采集到服务日志,请检查「服务设置」-「基础信息」-「日志采集路径」是否配置正确。。也可以参考本地调试 文档。

# 自行下载/拷贝了官方模板后上传部署失败(非通过控制台直接模板部署)

手动新建一个服务并部署模板代码,需要在「服务设置」中补全以下环境变量,才可正常使用,否则会引发无法连接数据库,进而导致部署失败。

MYSQL_ADDRESS

MYSQL_PASSWORD

MYSQL_USERNAME

以上三个变量的值请按实际情况填写。如果使用云托管内MySQL,可以在控制台 MySQL 页面获取相关信息。

# 部署 eggjs 服务,运行npm run start不停重复启动

需要去掉进程守护参数 --daemon

更改前:"start": "egg-scripts start --daemon --title=node-server",

更改后:"start": "egg-scripts start --title=node-server",

# Dockerfile中引用了环境变量不生效

构建/部署阶段,服务还未就绪,此时无法引用环境变量。

# Dockerfile中引用了 MySQL 内网地址不生效

构建/部署阶段,服务还未就绪,此时无法通过内网地址访问MySQL。

# 使用了云调用/开放接口服务报错

请参考云调用常见问题 文档.

# Cannot read -C 'conf/nginx.conf' (relative to '/workspace')

无 Dockerfile 模式部署 PHP 服务时,请确保在代码仓库的 conf 文件夹中存在 nginx.conf 文件。

# err=[ResourceUnavailable.ClusterInAbnormalStat][err=cloudrun cluster state is invalid(cluster state is deleted)

底层异常,请提工单联系我们处理。

# 构建失败问题

构建阶段问题多数为 docker 报错,绝大部分是因为没有正确配置Dockerfile。 可参考构建案例集合 ,以及如何提高项目构建效率。或在网上搜索 docker 相关解决方案及教程。

# network connection aborted.

因为访问国外网络不稳定的不可抗力因素,建议尽量选用国内站作为镜像源下载依赖和扩展。具体可参考官方模板 中的 Dockerfile 写法。

# 缺少依赖报错。例如:
  • java.lang.NoClassDefFoundError: Could not initialize class xxx

Dockerfile中缺少对应的依赖安装命令。

建议优先换用更完整的构建用基础镜像而非直接增加依赖安装命令(RUN apk xxx),更加简单方便,且可以提高构建速度。 请到dockerhub官方仓库自行选择合适的基础镜像(默认已包含了所有你需要的依赖),然后在 Dockerfile 中替换“FROM xxxxx as build” 命令。

# xxxxxx: no such file or directory
  • 确保代码仓库/代码包中确实存在该文件且路径正确;
  • 确保‘.gitignore’或者'.dockerignore'中,没有包含这个文件——如果包含将会被构建忽略。去除即可。
  • 确保 Dockerfile 中的 COPY 命令,拷贝文件的时候没有修改原有的文件路径。
# 无报错日志,空白

大概率是构建超时(> 10分钟)。可参考文档如何提高项目构建效率