CCI 2.0负载调试与故障排查
应用场景
在CCI的Serverless环境中,由于用户不再管理和运维底层基础设施,当工作负载(Workload)出现启动失败或健康检查不通过时,传统的“登录节点查看 Docker 日志”的方式不再适用。
本文档主要解决以下两类常见问题:
- 负载启动失败(CrashLoopBackOff):容器启动后立即退出,或者运行一段时间后异常退出,导致无法进入终端调试。
- 健康检查失败:配置探针后,实例无法进入Ready 状态或反复重启。
限制与约束
在进行调试前,请确保您的网络环境和监控配置满足以下条件,以便顺利拉取镜像并查看日志:
场景一:负载启动失败(Crash)的调试
- 问题分析
现象分类
典型表现
启动即崩溃
Pod 状态反复变为 CrashLoopBackOff,LTS 中可能采集不到日志(容器退出太快)。
运行后崩溃
Pod 运行数秒或数分钟后退出,LTS 中通常有日志记录。
- 解决方案
使用“挂起(Sleep)”模式调试。当日志不足以定位问题(例如缺少依赖、环境变量错误、配置项缺失)时,可以通过修改启动命令,强制容器保持运行状态,从而进入容器内部进行“现场调试”。
- 修改启动命令。
- 在控制台选择目标负载,单击“YAML 编辑”。
- 找到容器配置,修改 command(启动命令),使其进入无限循环或长时间睡眠状态。
spec: containers: - name: container-0 # 原始镜像 image: swr.cn-north-4.myhuaweicloud.com/test-namespace/app:v1 # 修改为挂起命令,保持容器存活 command: - /bin/sh - '-c' - 'while true; do echo hello; sleep 10; done' - 单击“确定”提交更新。此时容器将成功启动并处于“运行中”状态。
- 进入容器调试。
- 在负载列表的操作列,单击“查看终端”。
- 选择 /bin/sh 或 /bin/bash 进入终端。
- 手动执行原始命令排查故障:在终端中输入该容器镜像原始的启动命令,手动触发业务逻辑以观察报错。
- 示例场景:假设负载原有的启动命令是ping www.example.co。
- 执行:
ping www.example.co
- 结果:终端直接报错 ping: unknown host www.example.co。
- 定位修复:发现是域名拼写错误(.co 应为 .com)。您可以在容器内修改配置文件或环境变量进行验证。
- 恢复生产配置。
- 修改启动命令。
场景二:健康检查探针失败的调试
配置存活探针(Liveness Probe)或就绪探针(Readiness Probe)失败会导致容器被系统终止重启或流量无法接入。
- 常见配置误区
- HTTP 探针监听地址:若应用监听的是 127.0.0.1,而探针默认通过 Pod IP 访问,可能导致检测失败。建议应用监听 0.0.0.0。
- Exec 探针超时:在 CCI 环境中,如果 Exec 脚本执行时间超过 timeoutSeconds,探针会被视为失败(Unknown)。
- 端口不匹配:探针检测的端口必须与容器内应用实际监听的端口一致。
- 解决方案:手动模拟探测
建议遵循“移除探针 -> 手动验证 -> 重新配置”的流程。
- 移除探针:更新负载,暂时删除健康检查配置,确保容器能正常启动并保持运行。
- 进入容器:通过控制台远程登录进入容器。
- 手动执行探测命令:
- 验证 HTTP 请求:
# 模拟 Kubernetes 发起的 HTTP Get 请求 curl -I http://127.0.0.1:<端口>/<路径>
若返回 404 或 Connection refused,说明应用配置有误。
- 验证 Exec 命令:
# 手动执行探针脚本 /bin/sh -c "ls /tmp"
检查命令是否返回 0,以及执行耗时是否过长。
- 验证 HTTP 请求:
- 回填配置:确认手动执行成功后,将参数回填到 YAML 或控制台配置中。
- 参考配置示例
以下是一个包含完整健康检查配置的 Deployment YAML 片段,供参考:
apiVersion: cci/v2 kind: Deployment metadata: name: health-check-demo spec: template: spec: containers: - name: app image: nginx:latest # 存活探针:检测文件是否存在 livenessProbe: exec: command: ["/bin/sh", "-c", "ls /tmp"] initialDelaySeconds: 5 timeoutSeconds: 2 periodSeconds: 10 # 就绪探针:检测 HTTP 服务是否可用 readinessProbe: httpGet: path: / port: 80 scheme: HTTP initialDelaySeconds: 2 timeoutSeconds: 1